Dada una tabla de victorias, derrotas y empates, muestra el resultado de cada partido en un torneo deportivo

11

Esta pregunta está inspirada en el torneo en curso del "juego del hooligan jugado por caballeros", la Copa Mundial de Rugby , que acaba de completar la etapa de billar. Hay 20 equipos en el torneo, y se dividen en 4 grupos de 5 equipos cada uno. Durante la etapa de grupo, cada equipo juega contra todos los otros equipos en su grupo (un total de 10 partidos por grupo), y los 2 mejores equipos de cada grupo avanzan a la etapa eliminatoria.

Al final de la etapa de grupo hay una tabla para cada grupo que muestra el número de victorias, pérdidas y empates para cada equipo. El desafío para esta pregunta es escribir un programa que ingrese el conteo de victorias, derrotas y empates para cada equipo en un grupo, y de esa información salgan los resultados individuales de cada uno de los 10 partidos (quién ganó, perdió o empató contra quién) ) si es posible o muestra un mensaje de error si no.

Por ejemplo, aquí está la tabla para el Grupo D del torneo de este año:

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

A partir de esta información, podemos deducir que Irlanda ganó contra Canadá, Francia, Italia y Rumania, porque ganaron todos sus juegos. Francia debe haber ganado contra Canadá, Italia y Rumania, pero perdió ante Irlanda, porque solo perdió uno y debe haber sido contra la invicta Irlanda. Acabamos de descubrir que Italia perdió contra Irlanda y Francia, por lo que deben haber ganado contra Canadá y Rumania. Canadá perdió todos sus juegos, por lo que la victoria de Rumania debe haber sido contra Canadá.

         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       -

Aquí hay un ejemplo más complicado (ficticio):

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

En este caso, podemos deducir que Rumania ganó contra Canadá, Francia, Italia e Irlanda, porque ganaron todos sus juegos. Canadá debe haber ganado contra Irlanda, Italia y Francia, pero perdió ante Rumania. Acabamos de descubrir que Italia perdió contra Rumania y Canadá, por lo que deben haber empatado contra Francia e Irlanda. Eso significa que Irlanda empató con Italia y perdió con todos los demás, y por lo tanto Francia debió vencer a Irlanda, empató con Italia y perdió con Canadá y Rumania.

         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       -

Algunas tablas son insolubles, por ejemplo, el Grupo B de este año, en el que 3 equipos obtuvieron los mismos totales 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

Sin embargo, algunas tablas con filas duplicadas son solucionables, como esta (ficticia):

            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

Entrada

Su programa o función debe aceptar 15 números que especifiquen los totales de ganancias, pérdidas y sorteos para cada uno de los 5 equipos. Puede usar cualquier delimitador que desee, ingresar los números en el orden principal de fila o columna y aceptar los números a través de stdin o pasarlos a través de una matriz a una función.

Debido a que victorias + pérdidas + empates = 4, puede omitir uno de los valores y resolverlo de los demás si lo desea, lo que significa que solo tiene que ingresar 10 números.

No necesita ingresar ningún nombre de equipo.

Entrada de muestra:

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

Salida

La salida de su programa o función debe tener la forma de una cuadrícula de 5 x 5 impresa en stdout, o una matriz devuelta desde una función. Cada elemento debe especificar si el equipo dado en la posición de la fila ganó, perdió o empató contra el equipo en la posición de la columna. El orden de las filas para la salida debe coincidir con la entrada. Puede definir qué denota una victoria, pérdida o empate, de modo que las letras W, L, D o los dígitos 0 1 2 o lo que desee se pueden usar siempre que estén claramente definidos y se puedan distinguir entre sí. Los elementos diagonales no están definidos, puede generar cualquier cosa, pero debe ser lo mismo en cada caso. Los valores se pueden separar con comas, espacios o cualquier carácter que desee, o no carácter. Tanto la entrada como la salida pueden formatearse con todos los valores en una sola línea si se desea.

Si una tabla no tiene una solución única, debe enviar un mensaje de error simple de su elección.

Salida de muestra:

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

Salida de muestra para tabla insoluble:

dunno mate

Este es el código de golf, por lo que gana el programa más corto en bytes.

Relacionado con la foto (Japón versus Sudáfrica):

ingrese la descripción de la imagen aquí

samgak
fuente

Respuestas:

4

CJam, 57 49 47 45 bytes

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

Esta es una función anónima que saca una matriz bidimensional de la pila y deja una a cambio. Contiene 2para victorias, 1para empates y 0para pérdidas. También contiene 1elementos diagonales, para los cuales puede generar cualquier cosa . Si el problema no se puede resolver, la función vuelve -1.

El código funcionará en línea, pero llevará un tiempo. Pruébelo en el intérprete de CJam .

Prueba de funcionamiento

$ 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

Cómo funciona

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
fuente
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]

Una victoria se muestra como 1, una pérdida como -1y un empate como 0. Los elementos diagonales también lo son 0. Las tablas sin resolver son listas vacías, es decir [].

Ejemplo de uso: 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]]].

Cómo funciona: fuerza bruta! Cree una lista de victorias / pérdidas / sorteos de acuerdo con la entrada, por ejemplo, [3,1,0]-> [1,1,1,-1], permutar, construir todas las combinaciones, insertar diagonales y mantener todas las tablas que sean iguales a su transposición con todos los elementos negados. Toma el primero.

nimi
fuente