Geben Sie anhand einer Tabelle mit Siegen, Verlusten und Unentschieden das Ergebnis jedes Spiels in einem Sportturnier aus

11

Diese Frage ist inspiriert von dem laufenden Turnier "Das von Gentlemen gespielte Hooligan-Spiel", der Rugby-Weltmeisterschaft , die gerade die Poolphase abgeschlossen hat. Das Turnier besteht aus 20 Teams, die in 4 Pools zu je 5 Teams aufgeteilt sind. Während der Poolphase spielt jedes Team gegen alle anderen Teams in seinem Pool (insgesamt 10 Spiele pro Pool), und die beiden besten Teams jedes Pools erreichen die Ko-Phase.

Am Ende der Poolphase gibt es für jeden Pool eine Tabelle mit der Anzahl der Siege, Verluste und Unentschieden für jedes Team. Die Herausforderung für diese Frage besteht darin, ein Programm zu schreiben, das die Anzahl der Siege, Verluste und Unentschieden für jedes Team in einem Pool eingibt und aus diesen Informationen die individuellen Ergebnisse jedes der 10 Spiele (wer hat gewonnen, verloren oder gegen wen gezogen) ausgibt ) wenn möglich oder gibt eine Fehlermeldung aus, wenn nicht.

Hier ist zum Beispiel die Tabelle für Pool D des diesjährigen Turniers:

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

Aus diesen Informationen können wir schließen, dass Irland gegen Kanada, Frankreich, Italien und Rumänien gewonnen hat, weil sie alle ihre Spiele gewonnen haben. Frankreich muss gegen Kanada, Italien und Rumänien gewonnen, aber gegen Irland verloren haben, weil es nur einen verloren hat und es gegen das ungeschlagene Irland gewesen sein muss. Wir haben gerade herausgefunden, dass Italien gegen Irland und Frankreich verloren hat, also müssen sie gegen Kanada und Rumänien gewonnen haben. Kanada hat alle Spiele verloren, und so muss Rumäniens Sieg gegen Kanada gewesen sein.

         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       -

Hier ist ein komplizierteres (fiktives) Beispiel:

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

In diesem Fall können wir schließen, dass Rumänien gegen Kanada, Frankreich, Italien und Irland gewonnen hat, weil sie alle ihre Spiele gewonnen haben. Kanada muss gegen Irland, Italien und Frankreich gewonnen, aber gegen Rumänien verloren haben. Wir haben gerade herausgefunden, dass Italien gegen Rumänien und Kanada verloren hat, also müssen sie gegen Frankreich und Irland unentschieden gespielt haben. Das bedeutet, dass Irland gegen Italien unentschieden gespielt und gegen alle anderen verloren hat. Daher muss Frankreich Irland geschlagen, gegen Italien unentschieden und gegen Kanada und Rumänien verloren haben.

         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       -

Einige Tabellen sind unlösbar, zum Beispiel der diesjährige Pool B, in dem 3 Teams die gleichen W / L / D-Summen erhalten haben:

            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

Einige Tabellen mit doppelten Zeilen sind jedoch lösbar, wie diese (fiktive):

            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

Eingang

Ihr Programm oder Ihre Funktion sollte 15 Zahlen akzeptieren, die die Gewinn-, Verlust- und Ziehungssummen für jedes der 5 Teams angeben. Sie können ein beliebiges Trennzeichen verwenden, die Zahlen in Zeilen- oder Spaltenhauptreihenfolge eingeben und die Zahlen entweder über stdin akzeptieren oder über ein Array an eine Funktion übergeben.

Da Gewinne + Verluste + Unentschieden = 4 sind, können Sie einen der Werte weglassen und auf Wunsch aus den anderen herausarbeiten, sodass Sie nur 10 Zahlen eingeben müssen.

Sie müssen keine Teamnamen eingeben.

Beispieleingabe:

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

Ausgabe

Die Ausgabe Ihres Programms oder Ihrer Funktion sollte in Form eines 5 x 5-Rasters erfolgen, das auf stdout gedruckt wird, oder eines Arrays, das von einer Funktion zurückgegeben wird. Jedes Element sollte angeben, ob das in der Zeilenposition angegebene Team das Team in der Spaltenposition gewonnen, verloren oder unentschieden gespielt hat. Die Zeilenreihenfolge für die Ausgabe sollte mit der Eingabe übereinstimmen. Sie können definieren, was einen Gewinn, einen Verlust oder ein Unentschieden bedeutet, sodass die Buchstaben W, L, D oder die Ziffern 0 1 2 oder was auch immer Sie möchten verwendet werden können, solange sie klar definiert und voneinander unterscheidbar sind. Diagonale Elemente sind undefiniert, Sie können alles ausgeben, aber es sollte in jedem Fall gleich sein. Werte können durch Kommas, Leerzeichen oder ein beliebiges Zeichen getrennt werden oder nicht. Falls gewünscht, können sowohl Eingabe als auch Ausgabe mit allen Werten in einer einzelnen Zeile formatiert werden.

Wenn eine Tabelle keine eindeutige Lösung hat, müssen Sie eine einfache Fehlermeldung Ihrer Wahl ausgeben.

Beispielausgabe:

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

Beispielausgabe für unlösbare Tabelle:

dunno mate

Dies ist Code Golf, damit das kürzeste Programm in Bytes gewinnt.

Bildbezogen (Japan versus Südafrika):

Geben Sie hier die Bildbeschreibung ein

Samgak
quelle

Antworten:

4

CJam, 57 49 47 45 Bytes

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

Dies ist eine anonyme Funktion, die ein zweidimensionales Array aus dem Stapel entfernt und eines zurücklässt. Es enthält 2für Gewinne, 1für Unentschieden und 0für Verluste. Es enthält auch 1diagonale Elemente, für die Sie alles ausgeben können . Wenn das Problem nicht lösbar ist, kehrt die Funktion zurück -1.

Der Code funktioniert online, aber es wird eine Weile dauern. Probieren Sie es im CJam-Interpreter aus .

Testlauf

$ 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

Wie es funktioniert

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.
Dennis
quelle
4

Haskell, 180 177 Bytes

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]

Ein Gewinn wird als 1, ein Verlust als -1und ein Unentschieden als angezeigt 0. Diagonale Elemente sind auch 0. Unlösbare Tabellen sind leere Listen, dh [].

Anwendungsbeispiel: 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]]].

Wie es funktioniert: Brute Force! Erstellen Sie eine Liste von Gewinnen / Verlusten / Unentschieden gemäß der Eingabe, z. B. [3,1,0]-> [1,1,1,-1], permutieren Sie, erstellen Sie alle Kombinationen, fügen Sie Diagonalen ein und behalten Sie alle Tabellen bei, die ihrer Transposition entsprechen, wobei alle Elemente negiert werden. Nimm den ersten.

Nimi
quelle