生成具有给定范围内的长度的数组的所有可能组合

fsc*_*ndt 24 ruby arrays combinations

如何生成长度在给定范围内的数组元素的所有可能组合?例如:

('a'..'f').to_a.all_possibilities(3, 5)
Run Code Online (Sandbox Code Playgroud)

应该产生如下数组:

['abc', 'abd', 'abe', 'abf', ..., 'abcde', 'abcdf', 'abcda', ...]
Run Code Online (Sandbox Code Playgroud)

包括从"abc"(三个字符)到('a'..'f').to_a五个字符长度的最后一个可能组合.我不知道该怎么做.有帮助吗?

dbe*_*hur 52

Array#combination 是stdlib:

[1] pry(main)> a = ('a'..'f').to_a
=> ["a", "b", "c", "d", "e", "f"]
[2] pry(main)> a.combination(3).to_a
=> [["a", "b", "c"],
 ["a", "b", "d"],
 ["a", "b", "e"],
 ["a", "b", "f"],
 ["a", "c", "d"],
 ["a", "c", "e"],
 ["a", "c", "f"],
 ["a", "d", "e"],
 ["a", "d", "f"],
 ["a", "e", "f"],
 ["b", "c", "d"],
 ["b", "c", "e"],
 ["b", "c", "f"],
 ["b", "d", "e"],
 ["b", "d", "f"],
 ["b", "e", "f"],
 ["c", "d", "e"],
 ["c", "d", "f"],
 ["c", "e", "f"],
 ["d", "e", "f"]]
Run Code Online (Sandbox Code Playgroud)

如果你想要所有尺寸min到max的组合:

(min..max).flat_map{|size| a.combination(size).to_a }
Run Code Online (Sandbox Code Playgroud)

如果您希望将它们转换为字符串,只需替换.to_a.map(&:join).

  • `a.combination(size)`生成一个数组数组,每个数组都是一个可以用`a`组成的唯一组合.`(min..max)`是一个包含[范围](http://ruby-doc.org/core-1.9.3/Range.html),以"min"开头,以"max"结尾.[`flat_map`](http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-flat_map)枚举范围的值,使每个值产生到块并产生一个结果连接所有块结果. (3认同)

saw*_*awa 13

(3..5).flat_map{|n| ('a'..'f').to_a.combination(n).map(&:join)}
Run Code Online (Sandbox Code Playgroud)

编辑:满足OP的明确意图,使用repeated_permutation.

(3..5).flat_map{|n| ('a'..'f').to_a.repeated_permutation(n).map(&:join)}
Run Code Online (Sandbox Code Playgroud)

  • 具有"3..8"和"%[FERNADO]"的结果数组的长度为"7 ^ 3 + 7 ^ 4 + 7 ^ 5 + 7 ^ 6 + 7 ^ 7 + 7 ^ 8 = 6725544".它在我的电脑上运行了几分钟,现在达到1580000左右:四分之一通过.我怀疑你真的想要这个. (2认同)