2013-05-16 123 views
1

在嘗試遍歷字母數組並生成所有6字符(僅限alpha的)字符串時,我的迭代似乎在最內嵌套循環的一個while循環後結束。下面的代碼。思考?Ruby嵌套while循環提前停止


alpha = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] 

x1 = 0 
x2 = 0 
x3 = 0 
x4 = 0 
x5 = 0 
x6 = 0 

while x1<26 
    y1 = alpha[x1] 
    while x2<26 
     y2 = alpha[x2] 
     while x3<26 
      y3 = alpha[x3] 
      while x4<26 
       y4 = alpha[x4] 
       while x5<26 
        y5 = alpha[x5] 
        while x6<26 
         y6 = alpha[x6] 
         puts y1 + y2 + y3 + y4 + y5 + y6 
         x6 = x6 + 1 
        end 
        x5 = x5 + 1 
       end 
       x4 = x4 + 1 
      end 
      x3 = x3 + 1 
     end 
     x2 = x2 + 1 
    end 
    x1 = x1 + 1 
end 

編輯:它也很可能是我俯瞰一個更簡單的方法,以達到預期的效果。如果是這樣,請隨時糾正我。

+8

哦。我的。神。 (c) –

+1

這是可怕的... :) – AnkitG

+1

誰說這個令人難忘的報價,你可以用任何語言寫FORTRAN?或者是Ook語言? –

回答

2
[*?a..?z].repeated_permutation(6).to_a.map &:join 

給人致命,不合格在我的機器上分配內存,

[*?a..?z].repeated_permutation(2).to_a.map &:join 

工作正常。

OK,這是一個錯誤#repeated_permutation後打電話到#to_a,這是它如何工作的:

[*?a..?z].repeated_permutation(6).each { |permutation| puts permutation.join } 
+0

當我運行這個時,得到:generate.rb:1:未定義的方法'repeated_permutation'for#(NoMethodError) – natosennimi

+0

6太多了,只需計數24 ** 6#=> 191102976 –

+0

@natosennimi:你用什麼Ruby版本? –

2

這是做你想做的嗎?它會產生所有獨特的排列,但不會雙重性質(如在「aaaabb」)

('a'..'z').to_a.permutation(6).to_a 

這裏有一個較短的版本,用於演示目的:

res = ('a'..'c').to_a.permutation(2).to_a 
res # => [["a", "b"], ["a", "c"], ["b", "a"], ["b", "c"], ["c", "a"], ["c", "b"]] 
+0

差不多,但是,我試圖包括雙倍字符。無論如何謝謝。 – natosennimi

4

塗說明Ruby的方式較多,

loop.inject 'aaaaaa' do |memo| 
    puts memo 
    break if memo == 'zzzzzz' 
    memo.next 
end 

或者乾脆:

('aaaaaa'..'zzzzzz').each &method(:puts) 
+0

Huhh!從來沒有見過這樣的風格......不錯的一個 –

+0

第二個是偉大的:) –

+0

從32個醜陋的線條到1個簡單。我喜歡。 – natosennimi