【问题标题】:How to extract each individual combination from a flat_map?如何从 flat_map 中提取每个单独的组合?
【发布时间】:2016-08-24 13:52:39
【问题描述】:

我对 ruby​​ 还很陌生,这是我在 stackoverflow 上的第一个问题,如果我是一个完全的菜鸟,请原谅我。

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

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

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

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

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

谢谢

【问题讨论】:

  • 为什么这被否决了?

标签: ruby maps combinations


【解决方案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"

【讨论】:

  • 非常感谢您如此清晰及时的回复。编辑 - 哦,是的,repeat_permutations 正是我正在搜索的,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 2015-12-20
相关资源
最近更新 更多