15

これに似た質問がSOで以前に尋ねられましたが、それらは私が必要としているものではなく、それらのアプローチを変更/変更することによって私の解決策に到達できないようです。

いずれにせよ、私は次のような配列の配列を持っています:

b= [["1"],["2"],["3"],["4"],["5"],["6"]]

(解決策にたどり着くのが簡単な場合はb、次のように1次元配列にすることもできます["1","2","3","4","5","6"]。どちらのタイプの入力も私のニーズに合っています。)

そして私は以下を生成したいと思います:

[["123456"],["213456"],["312456"],...] 

ここで、出力配列の各配列は、6つの数値の一意の順列です。また、それを単一の配列と見なします(たとえば["123456", "213456",...])。各エントリが一意であり、文字列内で番号が繰り返されない限り、出力の順序は特に重要ではありません(たとえば、「112345」は許可されていません)。各エントリでは6つの数値すべてを使用する必要があるため、のような増分出力にも関心がありません"123"

これはそれのように聞こえますが、これは宿題の問題ではありません。私はこのことを野蛮にして、必要な出力を得ることができました。より良い、よりエレガントなソリューションが必要だと感じています。

4

4 に答える 4

37

Array#permutationを使用:

permutations = (1..6).to_a.permutation.map(&:join)
# ["123456", "123465", "123546", ..., "654312", "654321"]
于 2012-07-25T15:56:34.510 に答える
19

Rubyはこれをネイティブに行います:) Rubyのドキュメントから:

a = [1, 2, 3]
a.permutation.to_a     #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
a.permutation(1).to_a  #=> [[1],[2],[3]]
a.permutation(2).to_a  #=> [[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]]
a.permutation(3).to_a  #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
a.permutation(0).to_a  #=> [[]] # one permutation of length 0
a.permutation(4).to_a  #=> []   # no permutations of length 4

http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-permutation

于 2012-07-25T15:51:03.100 に答える
1

あなたは間違いなくPermutation Gemを見てください。ドキュメントの例

perm = Permutation.new(3)
# => #<Permutation:0x57dc94 @last=5, @rank=0, @size=3>
colors = [:r, :g, :b]
# => [:r, :g, :b]
perm.map { |p| p.project(colors) }
# => [[:r, :g, :b], [:r, :b, :g], [:g, :r, :b], [:g, :b, :r], [:b, :r, :g],
#  [:b, :g, :r]]

アップデート

Ruby > 1.8.6 を使用している場合は、Array.permutation組み込まれています。

于 2012-07-25T15:46:58.193 に答える
1

これはそれを行う必要があります:

b.permutation.to_a.collect! { |i| i = [i.flatten.join] }
于 2012-07-25T16:12:56.490 に答える