勝ち、負け、引き分けの表が与えられたら、スポーツトーナメントの各試合の結果を出力します


11

この質問は、プールステージを終えたばかりの「紳士が演じるフーリガンのゲーム」であるラグビーワールドカップの進行中のトーナメントに触発されています。トーナメントには20のチームがあり、それぞれ5チームの4つのプールに分割されています。プールステージでは、各チームがプール内の他のすべてのチームと対戦し(プールごとに合計10試合)、各プールの上位2チームがノックアウトステージに進みます。

プールステージの最後には、各チームの勝ち、負け、引き分けの数を示す各プールのテーブルがあります。この質問の課題は、プール内の各チームの勝ち、負け、引き分けの数を入力するプログラムを作成し、その情報から10試合のそれぞれの結果(勝者、敗者、または引き分け者)可能であれば、そうでない場合はエラーメッセージを出力します。

たとえば、今年のトーナメントのプールDの表は次のとおりです。

            Win    Loss    Draw
Canada        0       4       0
France        3       1       0
Ireland       4       0       0
Italy         2       2       0
Romania       1       3       0

この情報から、アイルランドがカナダ、フランス、イタリア、ルーマニアと勝ったのは、彼らがすべてのゲームで勝ったからだと推測できます。フランスはカナダ、イタリア、ルーマニアに勝ったが、アイルランドに負けたのは、彼らが負けたのはたった1つであり、敗北していないアイルランドだったに違いないからです。イタリアがアイルランドとフランスに敗れたため、カナダとルーマニアに勝ったに違いないことを突き止めました。カナダはすべての試合で負けたため、ルーマニアの勝利はカナダに負けたに違いありません。

         Canada  France Ireland   Italy Romania
Canada        -       L       L       L       L
France        W       -       L       W       W
Ireland       W       W       -       W       W
Italy         W       L       L       -       W
Romania       W       L       L       L       -

これは、より複雑な(架空の)例です。

            Win    Loss    Draw
Canada        3       1       0
France        1       2       1
Ireland       0       3       1
Italy         0       2       2
Romania       4       0       0

この場合、ルーマニアがカナダ、フランス、イタリア、アイルランドに勝ったのは、彼らがすべてのゲームに勝ったからだと推測できます。カナダはアイルランド、イタリア、フランスに勝ったはずですが、ルーマニアに敗れました。イタリアがルーマニアとカナダに敗れたため、フランスとアイルランドに引き寄せられたに違いない。つまり、アイルランドはイタリアと一緒に引き分け、他のすべての人に負けたことを意味します。したがって、フランスはアイルランドを破り、イタリアと引き分けられ、カナダとルーマニアに負けたに違いありません。

         Canada  France Ireland   Italy Romania
Canada        -       W       W       W       L
France        L       -       W       D       L
Ireland       L       L       -       D       L
Italy         L       D       D       -       L
Romania       W       W       W       W       -

一部のテーブルは解決できません。たとえば、今年のプールBでは、3つのチームが同じW / L / D合計を獲得しました。

            Win    Loss    Draw
Japan         3       1       0
Samoa         1       3       0
Scotland      3       1       0
South Africa  3       1       0
United States 0       4       0

ただし、次のような(架空の)重複した行を持ついくつかのテーブルは解決可能です。

            Win    Loss    Draw
Japan         4       0       0
Samoa         0       3       1
Scotland      2       2       0
South Africa  0       3       1
United States 3       1       0

入力

プログラムまたは機能は、5つのチームのそれぞれの勝ち、負け、引き分けの合計を指定する15個の数字を受け入れる必要があります。必要な区切り文字を使用し、行または列の主要な順序で数値を入力し、stdinを介して、または配列を介して関数に渡された数値を受け入れることができます。

勝ち+負け+引き= 4であるため、必要に応じて値の1つを省略し、他の値から計算することができます。つまり、10個の数字を入力するだけです。

チーム名を入力する必要はありません。

サンプル入力:

3 1 0
1 2 1
0 3 1
0 2 2
4 0 0

出力

プログラムまたは関数の出力は、stdoutに出力される5 x 5グリッド、または関数から返される配列の形式である必要があります。各要素は、行の位置で与えられたチームが列の位置でチームに勝ったか、負けたか、引き分けたかを指定する必要があります。出力の行の順序は入力と一致する必要があります。勝ち、負け、引き分けを示すものを定義できるので、W、L、Dの文字、または数字の0 1 2または必要なものは、明確に定義され、互いに区別できる限り使用できます。対角要素は未定義であり、何でも出力できますが、それぞれの場合で同じである必要があります。値は、コンマ、スペース、または任意の文字で区切ることができますが、文字ではありません。必要に応じて、入力と出力の両方を単一行のすべての値でフォーマットできます。

テーブルに一意のソリューションがない場合は、選択した簡単なエラーメッセージを出力する必要があります。

サンプル出力:

- W W W L
L - W D L
L L - D L
L D D - L
W W W W -

解決できないテーブルのサンプル出力:

dunno mate

これはコードゴルフなので、バイト単位の最短プログラムが勝ちます。

写真関連(日本対南アフリカ):

ここに画像の説明を入力してください

回答:


4

CJam、57 49 47 45バイト

{JZb:af{.*e_1+e!}:m*:e_5f/{_z2\ff-=},_,(0@?~}

これは、スタックから2次元配列をポップし、1つを返す匿名関数です。2勝ち、1引き分け、0負けが含まれます。また1、対角要素も含まれており、任意の要素を出力できます。問題が解決できない場合、関数はを返します-1。

コードはオンラインで動作しますが、しばらく時間がかかります。CJamインタープリターで試してください。

テスト走行

$ cat input
3 1 0
1 2 1
0 3 1
0 2 2
4 0 0
$ time cjam results.cjam < input
[1 2 2 2 0]
[0 1 2 1 0]
[0 0 1 1 0]
[0 1 1 1 0]
[2 2 2 2 1]

real    0m1.584s
user    0m4.020s
sys     0m0.146s

使い方

JZb:a e# Push 19 in base 3; wrap each digit in an array. Pushes [[2] [0] [1]].
f{    e# For each row of the input, push it and [[2] [0] [1]]; then:
  .*  e# Repeat 2, 0 and 1 (win, loss, draw) the specified number of times.
  e_  e# Flatten the resulting array.
  1+  e# Append a 1 for the diagonal.
  e!  e# Push all possible permutations.
}     e#
:m*   e# Cartesian product; push all possible combinations of permutations.
:e_   e# Flatten the results.
5f/   e# Split into rows of length 5.
{     e# Filter:
  _z  e#   Push a transposed copy of the array.
  2\  e#   Swap the result with 2.
  ff- e#   Subtract all elements from 2.
  =   e#   Check for equality.
},    e# Keep the element if `=' pushed 1.
_,(   e# Get the length of the array of solutions and subtract 1.
0@?   e# Keep the array for length 1, push 0 otherwise.
~     e# Either dump the singleton array or turn 0 into -1.

4

Haskell、180 177バイト

import Data.List
z=zipWith
m=map
a#b|(c,d)<-splitAt a b=c++[0]++d
f t=take 1[x|x<-m(z(#)[0..])$sequence$m(permutations.concat.z(flip replicate)[1,-1,0])t,transpose x==m(m(0-))x]

勝ちは1、負けは-1、引き分けはとして表示され0ます。対角要素も0です。解決できないテーブルは空のリスト[]です。

使用例:f [[3,1,0],[1,2,1],[0,3,1],[0,2,2],[4,0,0]]-> [[[0,1,1,1,-1],[-1,0,1,0,-1],[-1,-1,0,0,-1],[-1,0,0,0,-1],[1,1,1,1,0]]]。

仕組み:ブルートフォース!入力に従って勝ち/負け/引き分けのリストを作成します。例えば、[3,1,0]-> [1,1,1,-1]、並べ替え、すべての組み合わせを作成し、対角線を挿入し、すべての要素が無効になった転置に等しいすべてのテーブルを保持します。最初のものを取ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.