27

与えられた範囲内の長さの配列の要素のすべての可能な組み合わせを生成するにはどうすればよいですか?例えば:

('a'..'f').to_a.all_possibilities(3, 5)

次のような配列を生成する必要があります。

['abc', 'abd', 'abe', 'abf', ..., 'abcde', 'abcdf', 'abcda', ...]

(3文字)から5文字の長さ"abc"の最後の可能な組み合わせまでを含みます。('a'..'f').to_a私はこれを行う方法がわかりません。何か助けはありますか?

4

4 に答える 4

59

Array#combination is 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"]]

if you want all combinations of size min to max:

(min..max).flat_map{|size| a.combination(size).to_a }

If you want them converted to strings, just replace .to_a with .map(&:join).

于 2013-01-21T02:17:21.510 に答える
13
(3..5).flat_map{|n| ('a'..'f').to_a.combination(n).map(&:join)}

編集:OPの明確な意図を満たすには、を使用しますrepeated_permutation

(3..5).flat_map{|n| ('a'..'f').to_a.repeated_permutation(n).map(&:join)}
于 2013-01-21T02:14:59.397 に答える
2

このように、前の質問に対する私の回答を変更して、必要なものを取得できます。

class Array
  def all_possibilities(from, to)
    (from..to).flat_map do |i|
      if i < size
        permutation(i).to_a 
      else
        permutation(to - i).flat_map do |e|
          (self + e).permutation.to_a
        end
      end
    end.map(&:join)
  end
end

array = ["F", "E", "R", "N", "A", "D", "O"]
array.all_possibilities(3, 8)
于 2013-01-21T02:35:51.257 に答える