我对ruby很新,这是我在stackoverflow上的第一个问题,所以请原谅我,如果我是一个完整的菜鸟。
我正在使用的代码包含这一行 -
puts (6..6).flat_map{|n| ('a'..'z').to_a.combination(n).map(&:join)}
代码的作用是它开始打印从&#34开始的每个组合; abcdef"并一直持续到最后(我从未见过,因为它有26 ^ 6种组合)。
当然,拥有这个大小的数组(26 ^ 6)是不可想象的,因此我想知道是否有任何方法可以在变量中获得下一个组合,使用它,然后继续下一个组合?
例如,我将第一个组合计算为" abcdef"并将其存储在变量'组合中。并在某处使用该变量,然后计算下一个组合并且" abcdeg"存储在' combo'因此循环继续?
谢谢
答案 0 :(得分:1)
(6..6).flat_map { |n| ... }
做得不多。您的代码相当于:
puts ('a'..'z').to_a.combination(6).map(&:join)
要逐个处理这些值,您可以将块传递给combination
:
('a'..'z').to_a.combination(6) do |combo|
puts combo.join
end
如果没有给出阻止,combination
会返回Enumerator
,可以通过调用next
进行迭代:
enum = ('a'..'z').to_a.combination(6)
#=> #<Enumerator: ["a", "b", "c", ..., "w", "x", "y", "z"]:combination(6)>
enum.next
#=> ["a", "b", "c", "d", "e", "f"]
enum.next
#=> ["a", "b", "c", "d", "e", "g"]
enum.next
#=> ["a", "b", "c", "d", "e", "h"]
请注意,('a'..'z').to_a.combination(6)
将“仅”产生230,230种组合:
('a'..'z').to_a.combination(6).size
#=> 230230
相对于26 ^ 6 = 308,915,776。您可能正在寻找repeated_permutation
:
('a'..'z').to_a.repeated_permutation(6).size
#=> 308915776
从"aaaaaa"
迭代到"zzzzzz"
的另一种方法是一个简单的范围:
('aaaaaa'..'zzzzzz').each do |combo|
puts combo
end
或者通过致电String#succ
手动:(这是Range#each
在幕后所做的事情)
'aaaaaa'.succ #=> "aaaaab"
'aaaaab'.succ #=> "aaaaac"
'aaaaaz'.succ #=> "aaaaba"