Antecedentes
Considere un torneo round-robin, en el que cada participante juegue un juego contra cualquier otro participante. No hay sorteos, por lo que cada juego tiene un ganador y un perdedor. Un concursante A es un rey del torneo, si para cada otro competidor B , ya sea A venció B , o A vencer a otro concursante C que a su vez latido B . Se puede demostrar que cada torneo tiene al menos un rey (aunque puede haber varios). En este desafío, tu tarea es encontrar a los reyes de un torneo determinado.
Entrada y salida
Su entrada es una N × N
matriz booleana T
, y opcionalmente el número N ≥ 2
de concursantes. Cada entrada T[i][j]
representa el resultado del juego entre los concursantes i
y j
, con el valor 1 representa una victoria para i
y 0 una victoria para j
. Tenga en cuenta que T[i][j] == 1-T[j][i]
si i != j
. La diagonal de T
consiste en 0s.
Su salida será la lista de reyes en el torneo que T
representa, usando indexación basada en 0 o en 1. El orden de los reyes es irrelevante, pero no debe haber duplicados.
Tanto la entrada como la salida se pueden tomar en cualquier formato razonable.
Reglas y puntaje
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
Estos casos de prueba usan indexación basada en 0. Para la indexación basada en 1, incremente cada valor de salida.
2 [[0,0],[1,0]] -> [1]
3 [[0,1,0],[0,0,0],[1,1,0]] -> [2]
3 [[0,1,0],[0,0,1],[1,0,0]] -> [0,1,2]
4 [[0,1,1,1],[0,0,1,0],[0,0,0,0],[0,1,1,0]] -> [0]
4 [[0,1,1,0],[0,0,1,0],[0,0,0,1],[1,1,0,0]] -> [0,2,3]
5 [[0,1,0,0,1],[0,0,0,0,1],[1,1,0,0,0],[1,1,1,0,1],[0,0,1,0,0]] -> [3]
5 [[0,1,0,1,0],[0,0,1,1,1],[1,0,0,0,0],[0,0,1,0,1],[1,0,1,0,0]] -> [0,1,4]
5 [[0,0,0,0,0],[1,0,1,1,0],[1,0,0,0,1],[1,0,1,0,1],[1,1,0,0,0]] -> [1,3,4]
6 [[0,0,0,0,0,0],[1,0,1,1,0,0],[1,0,0,1,1,0],[1,0,0,0,1,1],[1,1,0,0,0,1],[1,1,1,0,0,0]] -> [1,2,3,4,5]
6 [[0,0,1,1,1,0],[1,0,0,1,1,1],[0,1,0,0,1,0],[0,0,1,0,0,1],[0,0,0,1,0,1],[1,0,1,0,0,0]] -> [0,1,2,3,5]
6 [[0,1,1,0,0,1],[0,0,0,1,0,1],[0,1,0,1,1,0],[1,0,0,0,1,1],[1,1,0,0,0,0],[0,0,1,0,1,0]] -> [0,1,2,3,4,5]
8 [[0,0,1,1,0,1,1,1],[1,0,1,0,1,1,0,0],[0,0,0,1,1,0,0,0],[0,1,0,0,0,1,0,0],[1,0,0,1,0,1,0,0],[0,0,1,0,0,0,1,0],[0,1,1,1,1,0,0,1],[0,1,1,1,1,1,0,0]] -> [0,1,4,6,7]
20 [[0,0,1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,1,0,1],[1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1],[0,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,1,1],[0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1],[1,0,1,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,0,1],[0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,1,0,1],[0,0,1,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,0],[1,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,1,0],[1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,1],[1,0,1,0,1,0,1,1,0,0,1,0,0,0,0,1,0,1,1,1],[1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0],[0,1,1,0,0,1,1,0,0,1,0,0,1,1,1,1,1,0,1,1],[0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1],[1,0,1,1,1,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1],[0,0,1,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1],[0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1],[0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,1,1],[0,0,1,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1],[1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0]] -> [0,1,3,4,5,7,8,11,15,17,18]
Respuestas:
Matlab,
36 3529 bytesAverigüemos si
i
es un rey. Luego para cada unoj
el valorT[i][j]==1 OR there is a k such that T[i][k] * T[k][l] == 1
. Pero la segunda condición también se puede reemplazar porsum_over_k(T[i][k] * T[k][l])>0
, pero esto es solo una entrada de la matrizT*T
(si se consideraT
como una matriz). ElOR
entonces se pueden reproducir mediante la adiciónT
a ese resultado, por lo que sólo tenemos que comprobar sin-1
los valores de la filai
deT*T+T
son mayores que cero, para ver sii
es el rey. Esto es exactamente lo que hace mi función.(Esto es MATLAB, por lo que los índices están basados en 1).
Las matrices de MATLAB deben codificarse con punto y coma como delimitadores de línea:
fuente
size(T,1)
Jalea,
131211 bytesLa salida está basada en 1. Pruébalo en línea!
Alternativamente, usando operadores bit a bit en lugar de manipulación de matriz:
Nuevamente, la salida se basa en 1. Pruébalo en línea!
Antecedentes
Para concursante A , podemos encontrar toda B tal que A venció C latido B mediante la adopción de todas las filas que corresponden a un C tal que C vencer a una . IFR el B º entrada del C º es 1 , tenemos que C venció B .
Si calculamos los OR lógicos de todas las entradas correspondientes de las columnas seleccionadas, obtenemos un único vector que indica si A venció a B por transitividad o no. Finalmente, ORing el vector resultante con la fila correspondiente de la matriz de entrada le da a Booleanos si A vence a B , ya sea por transitividad o directamente.
Repitiendo esto para cada fila, contamos el número de 1 en cada vector, por lo tanto, calculamos la cantidad de concursantes cada latido A. Los recuentos máximos corresponden a los reyes del torneo.
Cómo funciona
fuente
Python usando numpy, 54 bytes
Toma una matriz numpy, genera una matriz de fila numpy de índices basados en 0.
Otra forma de pensar en un rey es como un concursante para el cual todos los concursantes están en la unión del rey, la gente que el rey venció y la gente que esa gente venció. En otras palabras, para cada concursante, hay un camino de longitud como máximo 2 desde el rey hasta ellos entre la relación "beat".
La matriz
I + M + M*M
codifica el número de rutas de 0, 1 o 2 pasos desde cada fuente a cada destino. Un jugador es un rey si su fila de esta matriz solo tiene entradas positivas. Como 0 es Falsey,all
nos dice si una fila no es cero. Aplicamos esto a cada fila y mostramos los índices de los resultados distintos de cero.fuente
JavaScript (ES6), 83 bytes
fuente
MATL ,
12109 bytesLa entrada es: primero el número de concursantes, y en una línea separada una matriz con filas separadas por punto y coma. La salida está basada en 1.
Por ejemplo, el quinto caso de prueba tiene entrada
y el último caso de prueba tiene entrada
Pruébalo en línea!
Explicación
fuente
Javascript
136131121112 bytesLlamar usando:
cuidado porque la salida está indexada en 1 (se guardaron algunos bytes sin intentar filtrar 0s frente a falsos)
fuente