我已經採取改變你magic
參數的假設下,該基地10是比較常見的和可選順序的自由:
def magic(digits,base=10)
raise "Max magic base of 36" unless base <= 36
(base**digits).times do |i|
str = "%#{digits}s" % i.to_s(base)
parts = str.scan(/./).map{ |n| n.to_i(base)+1 }
yield *parts
end
end
magic(3,2){ |a,b,c| p [a,b,c] }
#=> [1, 1, 1]
#=> [1, 1, 2]
#=> [1, 2, 1]
#=> [1, 2, 2]
#=> [2, 1, 1]
#=> [2, 1, 2]
#=> [2, 2, 1]
#=> [2, 2, 2]
magic(2,16){ |a,b| p [a,b] }
#=> [1, 1]
#=> [1, 2]
#=> [1, 3]
#=> ...
#=> [16, 15]
#=> [16, 16]
說明:
通過翻譯原來的問題從1..10
到0..9
並連接數字,我們看到輸出正在計數,並訪問每個數字。
0000
0001
0002
...
0010
0011
0012
...
9997
9998
9999
這就是我上面的代碼所做的。它從0計數到(基於數字的數目並且允許每數位值)的最大數量,併爲每個數它:
的數字轉換成適當的「基礎」:
i.to_s(base) # e.g. 9.to_s(8) => "11", 11.to_s(16) => "b"
String#%
用途到墊字符串到正確的字符數:
"%#{digits}s" % ... # e.g. "%4s" % "5" => " 5"
打開此單字符串轉換成單個字符的字符串的數組S:
str.scan(/./) # e.g. " 31".scan(/./) => [" ","3","1"]
注意,在Ruby 1.9的,這是更好地與str.chars
完成轉換每個單字符的字符串返回到一個號碼:
n.to_i(base) # e.g. "b".to_i(16) => 11, " ".to_i(3) => 0
增加1到每個這些數字,因爲願望是從1開始而不是0
將這個新的數組數組作爲參數Ø塊,每塊的PARAM一個數字:
yield *parts
你希望輸出什麼?是否像'1 2 3 4 \ n 5 6 7 8 \ n 9 10'或'0 0 0 1 \ n 0 0 0 2 ...'? – 2011-04-04 20:49:55
@nash否;第一個代碼自行運行。如果你將所有'(1..10)'調整爲'(0..9)',那麼你就會得到'0 0 0 0','0 0 0 1',...'9 9 9 8', '9 9 9 9''。 – Phrogz 2011-04-04 21:03:31
這是http://stackoverflow.com/questions/5226895/combine-array-of-array-into-all-possible-combinations-forward-only-in-ruby/5227021#5227021的副本,但我喜歡這個問題的答案更好。 – 2011-04-05 04:50:34