2

私が持っているもの

a = [1,2,3,4]
 => [1, 2, 3, 4] 

b = a.combination(2).to_a
 => [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] 

b.each_slice(2).to_a
 => [[[1, 2], [1, 3]], [[1, 4], [2, 3]], [[2, 4], [3, 4]]] 

私が達成しようとしているのは、ユニークな組み合わせです

=> [[[1, 2], [3, 4]], [[1, 4], [2, 3]], [[1, 3], [2, 4]]]

順列、平坦化などを試しました。しかし、魔法のルビーコードが見つかりません!

編集 :

上記の答えは次のようになります

b = a.combination(2).to_a
=> [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]

より正確には。

から

a = [1,2,3,4,5,6]

取得する方法

=> [[[1, 2], [3, 4], [5, 6]], [[1, 3], [2, 5], [4, 6]], [[1, 4], [2, 6], [3, 5]], [[1, 5], [2, 4], [3, 6]], [[1, 6], [2, 3], [4, 5]]]

これは、一意の値 (1,2,3,4,5,6) の 5 つの配列です。

[1, 2], [3, 4], [5, 6]
[1, 3], [2, 5], [4, 6]
[1, 4], [2, 6], [3, 5]
[1, 5], [2, 4], [3, 6]
[1, 6], [2, 3], [4, 5]

あなたは質問を変えたようです。もともと、配列の配列が必要でしたが、それぞれが配列のペアを持っていました。今、あなたは三つ子が欲しいですか?

はい、[1,2,3,4] を使用した最初の例は簡単すぎたため、答えは [1,2,3,4,5,6] などのより複雑な配列には適合しません。

4

4 に答える 4

1

これは私が思うほとんどの方法であなたを取得します

[1,2,3,4].combination(2).inject([]){|arr,r| arr << (Hash[*r]); arr}

この配列から最初と最後の要素を繰り返し取得すると、結果が得られます

def con(h, arr = []) 
  arr <<[h.delete(h.first).to_a.flatten, h.delete(h.last).to_a.flatten]
  con(h, arr) unless h.empty?
  p arr
end

#=> [[[1, 2], [3, 4]], [[1, 3], [2, 4]], [[1, 4], [2, 3]]]
于 2011-06-30T15:55:32.903 に答える
0

最後に、順列、uniq、組み合わせ、平坦化のない解決策を見つけます:)

    a = [1,2,3,4,5,6]
    count = a.count

    totalloop = count - 1
    arrayperloop = count / 2
    rounds = []

    for round in 0...totalloop
        for i in 0...arrayperloop

            x = (round + i) % (count - 1)
            y = (count - 1 - i + round) % (count - 1)

            if i == 0
              y = count - 1
            end

            rounds<<[x + 1, y + 1]
        end
    end

rounds.each_slice(arrayperloop).to_a 欲しいものをくれた

    [[[1, 6], [2, 5], [3, 4]], [[2, 6], [3, 1], [4, 5]], [[3, 6], [4, 2], [5, 1]], [[4, 6], [5, 3], [1, 2]], [[5, 6], [1, 4], [2, 3]]]

そんなに醜くない!配列に n*2 整数を追加すると、常に機能します。

于 2011-07-01T09:47:34.983 に答える
0

これは実際には少し異なる質問であるため、別の回答として追加しました-そしてはるかに難しいです!

 def accept(a)
   0.upto(a.size-1){|i| return false unless a[i] == a[i].sort
   return false if (i > 0 && a[i][0] <= a[i-1][0])}
   true
end

 x=[1,2,3,4,5,6].permutation.inject([]){|arr, per| arr<< per.in_groups_of(2); arr}
 arr = x.inject([]){|arr,y| arr << y if accept(y); arr}
 p arr

あまりきれいではありませんが、任意のサイズの配列に対して必要なことを行うと思います

于 2011-07-01T09:42:17.950 に答える
0

まあ、それはきれいではありませんが、うまくいきます。組み合わせにはブロックが必要です。

a = [1,2,3,4]
ans = []

a.combination(2) do |i|
  a.combination(2) do |j|
    x = [i, j]
    y = x.flatten
    next if y.uniq != y
    ans << x
  end
end

puts ans.inspect

編集:少し醜くなりました。

于 2011-06-30T16:40:55.153 に答える