我已经采取改变你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