如何从 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"
我是 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"