我々は15(6C2)素子を有する2次元配列を得ることができるルビー、n要素の配列から '公平な組み合わせ'を得るには?
[1, 2, 3, 4, 5, 6].combination(2).to_a
#=> [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 3],
# [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6],
# [4, 5], [4, 6], [5, 6]]
にcombination
方法を使用。
私はこのような配列を返すfair_combination
方法作成したい:すべての三つのサブアレイ(6の半分)は、すべての指定された要素を含むように
arr = [[1, 2], [3, 5], [4, 6],
[3, 4], [5, 1], [6, 2],
[5, 6], [1, 3], [2, 4],
[2, 3], [4, 5], [6, 1],
[1, 4], [2, 5], [3, 6]]
を:
arr.each_slice(3).map { |a| a.flatten.sort }
#=> [[1, 2, 3, 4, 5, 6],
# [1, 2, 3, 4, 5, 6],
# [1, 2, 3, 4, 5, 6],
# [1, 2, 3, 4, 5, 6],
# [1, 2, 3, 4, 5, 6]]
これは、配列が進むにつれて可能な限りさまざまな要素を使用することで、一種の「公正」になります。
それがより一般的にするために、次のように何が満たす必要がある:あなたが最初から配列に従って、各番号が表示された回数をカウントしたよう
(1)、いずれかの時点でそれはのように平らにしてくださいできるだけ;
(1..7).to_a.fair_combination(3)
#=> [[1, 2, 3], [4, 5, 6], [7, 1, 4], [2, 5, 3], [6, 7, 2], ...]
最初の7つの数字は[1,2、...、7]となります。したがって、次の7つの数字も行います。
(2)AがBと同じ配列に入ると、可能であればAはBと同じ配列になりたくない。
(1..10).to_a.fair_combination(4)
#=> [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 1, 5], [2, 6, 9, 3], [4, 7, 10, 8], ...]
"フェアコンビネーション"を作成するアルゴリズムはありますか?
私はその男であることが嫌いですが、あなたは何を試しましたか? –
@NickZuber ご意見ありがとうございます。 fair_combination(2)と同等のものを作成するように管理されています。 https://gist.github.com/honake/b685811d7644c563cd26a620274a75e6 非常にうまく動作せず、より一般的にはできませんでした。 – honake