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

How to extract each individual combination from a flat_map?

我是 ruby 的新手,这是我在 Whosebug 上的第一个问题,所以如果我是一个完全的菜鸟,请原谅我。

我正在使用的代码包含这一行 -

puts (6..6).flat_map{|n| ('a'..'z').to_a.combination(n).map(&:join)}

代码的作用是从 "abcdef" 开始打印每个组合并一直打印到最后(我从未见过,因为它有 26^6 种组合)。

当然,拥有那个大小 (26^6) 的数组是不可想象的,因此我想知道是否有任何方法可以让我获得变量中的下一个组合,使用它,然后继续下一个组合?

例如,我将第一个组合计算为 "abcdef" 并将其存储在变量 'combo' 中并在某处使用该变量,然后计算下一个组合并将 "abcdeg" 存储在'combo' 因此循环继续 ?

谢谢

(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 returns 可以通过调用 next:

迭代的 Enumerator
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) 将 "only" 产生 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: (this is what Range#each 手动操作)

'aaaaaa'.succ #=> "aaaaab"
'aaaaab'.succ #=> "aaaaac"

'aaaaaz'.succ #=> "aaaaba"