如何从flat_map中提取每个单独的组合?

时间:2016-08-24 13:52:40

标签: ruby maps combinations

我对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'因此循环继续?

谢谢

1 个答案:

答案 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"