総当たり戦の日程作成
任意の偶数Nのチームの総当たり戦を最短日数(N-1日)で
行う場合の日程表を1つ作成してください。
解はひとつではない場合もあります。
もし、余力があれば、全ての可能性も求めてください。
これは、スポーツスケジューリングと言う分野の問題で、
数学的には、カークマンの問題と言うのが近いようです。
例えば、4チームであれば、
1-2 3-4
1-3 2-4
1-4 2-3
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
が解のひとつです。
エロと風俗情報満載 どう抜く?
という問題で、Sixeight さんが書かれた以下のコードが
とてもシンプルでいいなぁと思ったのだけど、どうしてこれでうまくいくのか今一ピンとこない。
def scheduling(n) teams = [1] + (2..n).to_a.reverse half = n / 2 (n - 1).times do p teams[0, half].zip teams[half, half].reverse teams = [1] + teams[2..-1].push(teams[1]) end end
ちなみに自分で書いたやつは6チームまでにしか対応してない上にずいぶん煩雑。くやしい。