Étant donné un tableau des victoires, des défaites et des matchs nuls, affichez le résultat de chaque match d'un tournoi sportif

11

Cette question s'inspire du tournoi en cours du "jeu du hooligan joué par des messieurs", la Coupe du monde de rugby , qui vient de terminer l'étape de la poule. Il y a 20 équipes dans le tournoi, et elles sont divisées en 4 groupes de 5 équipes chacun. Pendant la phase de poule, chaque équipe joue contre toutes les autres équipes de sa poule (un total de 10 matchs par poule), et les 2 meilleures équipes de chaque poule progressent vers la phase à élimination directe.

À la fin de la phase de poule, il y a un tableau pour chaque poule indiquant le nombre de victoires, de défaites et de tirages pour chaque équipe. Le défi pour cette question est d'écrire un programme qui entre le nombre de victoires, de pertes et de tirages pour chaque équipe dans un groupe, et à partir de cette information, les résultats individuels de chacun des 10 matchs (qui a gagné, perdu ou fait match nul contre qui ) si possible ou génère un message d'erreur dans le cas contraire.

Par exemple, voici le tableau de la poule D du tournoi de cette année:

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

De ces informations, on peut déduire que l'Irlande a gagné contre le Canada, la France, l'Italie et la Roumanie, car ils ont gagné tous leurs matchs. La France a dû gagner contre le Canada, l'Italie et la Roumanie mais a perdu contre l'Irlande, car ils n'en ont perdu qu'un et ce doit être à l'Irlande invaincue. Nous venons de comprendre que l'Italie a perdu contre l'Irlande et la France, ils ont donc dû gagner contre le Canada et la Roumanie. Le Canada a perdu tous ses matchs et la victoire de la Roumanie a donc dû être contre le Canada.

         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       -

Voici un exemple plus compliqué (fictif):

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

Dans ce cas, on peut en déduire que la Roumanie a gagné contre le Canada, la France, l'Italie et l'Irlande, car ils ont gagné tous leurs matchs. Le Canada a dû gagner contre l'Irlande, l'Italie et la France, mais a perdu contre la Roumanie. Nous venons de comprendre que l'Italie a perdu contre la Roumanie et le Canada, ils ont donc dû tirer contre la France et l'Irlande. Cela signifie que l'Irlande a fait match nul contre l'Italie et a perdu contre tout le monde, et que la France a donc dû battre l'Irlande, tirer contre l'Italie et perdre contre le Canada et la Roumanie.

         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       -

Certaines tables sont insolubles, par exemple le Pool B de cette année, dans lequel 3 équipes ont obtenu les mêmes totaux 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

Cependant, certains tableaux avec des lignes en double peuvent être résolus, comme celui-ci (fictif):

            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

Contribution

Votre programme ou votre fonction doit accepter 15 numéros spécifiant les totaux de victoires, de pertes et de tirages pour chacune des 5 équipes. Vous pouvez utiliser le délimiteur de votre choix, saisir les nombres dans l'ordre principal des lignes ou des colonnes et accepter les nombres via stdin ou transmis via un tableau à une fonction.

Parce que victoires + pertes + nuls = 4, vous pouvez omettre l'une des valeurs et la calculer à partir des autres si vous le souhaitez, ce qui signifie que vous n'avez qu'à entrer 10 chiffres.

Vous n'avez pas besoin de saisir de nom d'équipe.

Exemple d'entrée:

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

Production

La sortie de votre programme ou fonction doit se présenter sous la forme d'une grille 5 x 5 imprimée sur stdout ou d'un tableau renvoyé par une fonction. Chaque élément doit spécifier si l'équipe donnée en position rangée a gagné, perdu ou fait match nul contre l'équipe en position colonne. L'ordre des lignes pour la sortie doit correspondre à l'entrée. Vous pouvez définir ce qui dénote une victoire, une perte ou un match nul, de sorte que les lettres W, L, D ou les chiffres 0 1 2 ou tout ce que vous voulez peuvent être utilisés tant qu'ils sont clairement définis et peuvent être distingués les uns des autres. Les éléments diagonaux ne sont pas définis, vous pouvez tout afficher, mais cela devrait être le même dans chaque cas. Les valeurs peuvent être séparées par des virgules, des espaces ou tout autre caractère que vous aimez, ou pas de caractère. L'entrée et la sortie peuvent être formatées avec toutes les valeurs sur une seule ligne si vous le souhaitez.

Si une table n'a pas de solution unique, vous devez générer un message d'erreur simple de votre choix.

Exemple de sortie:

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

Exemple de sortie pour une table insoluble:

dunno mate

Il s'agit de code golf, donc le programme le plus court en octets l'emporte.

Concernant la photo (Japon contre Afrique du Sud):

entrez la description de l'image ici

samgak
la source

Réponses:

4

CJam, 57 49 47 45 octets

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

Il s'agit d'une fonction anonyme qui extrait un tableau bidimensionnel de la pile et en laisse un en retour. Il contient 2pour les victoires, les 1matchs nuls et les 0pertes. Il contient également des 1éléments diagonaux, pour lesquels vous pouvez tout afficher . Si le problème n'est pas résolu, la fonction revient -1.

Le code fonctionnera en ligne, mais cela prendra un certain temps. Essayez-le dans l' interpréteur CJam .

Essai

$ 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

Comment ça fonctionne

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
la source
4

Haskell, 180 177 octets

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]

Une victoire est représentée par 1, une perte par -1et un match nul par 0. Les éléments diagonaux le sont également 0. Les tableaux insolubles sont des listes vides, c'est-à-dire [].

Exemple d'utilisation: 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]]].

Comment ça marche: la force brute! Créez une liste de victoires / pertes / tirages en fonction de l'entrée, par exemple [3,1,0]-> [1,1,1,-1], permutez, créez toutes les combinaisons, insérez des diagonales et conservez toutes les tables qui sont égales à leur transposition avec tous les éléments annulés. Prenez le premier.

nimi
la source