5

値の配列の順列を作成する方法を知っています。例えば:

[*1..3].permutation(2)

その結果、次の 6 つの順列が得られます。

[1, 2]
[1, 3]
[2, 1]
[2, 3]
[3, 1]
[3, 2]

しかし、この結果には、同じ値の組み合わせである 3 つの順列がありません。

[1, 1]
[2, 2]
[3, 3]

上記の繰り返しを含むすべての順列を取得するにはどうすればよいですか?

4

2 に答える 2

12

#repeated_permutationを試してください:

[*1..3].repeated_permutation(3).to_a

 > pp [*1..3].repeated_permutation(3).to_a
[[1, 1, 1],
 [1, 1, 2],
 [1, 1, 3],
 [1, 2, 1],
 [1, 2, 2],
 [1, 2, 3],
 [1, 3, 1],
 [1, 3, 2],
 [1, 3, 3],
 [2, 1, 1],
 [2, 1, 2],
 [2, 1, 3],
 [2, 2, 1],
 [2, 2, 2],
 [2, 2, 3],
 [2, 3, 1],
 [2, 3, 2],
 [2, 3, 3],
 [3, 1, 1],
 [3, 1, 2],
 [3, 1, 3],
 [3, 2, 1],
 [3, 2, 2],
 [3, 2, 3],
 [3, 3, 1],
 [3, 3, 2],
 [3, 3, 3]]
于 2012-10-01T05:45:07.993 に答える
6

あなたの質問が組み合わせを求めていることに気づきましたが、あなたの例では繰り返しの順列を使用していました。実際の組み合わせを生成することに本当に興味がある場合、これを行うための迅速で汚い方法は次のとおりです。

>> x = [* ?a..?c]
=> ["a", "b", "c"]
>> (0..x.length).each{|i| x.combination(i){|y| p y}}
[]
["a"]
["b"]
["c"]
["a", "b"]
["a", "c"]
["b", "c"]
["a", "b", "c"]
于 2012-10-01T05:56:56.843 に答える