fundo
Considere um torneio round-robin, no qual cada competidor joga um jogo contra todos os outros competidores. Não há empates, então cada jogo tem um vencedor e um perdedor. Um competidor Um é um rei do torneio, se por qualquer outro concorrente B , ou A batida B ou A derrotou outro concorrente C , que por sua vez batida B . Pode ser demonstrado que todo torneio tem pelo menos um rei (embora possa haver vários). Neste desafio, sua tarefa é encontrar os reis de um determinado torneio.
Entrada e saída
Sua entrada é uma N × N
matriz booleana T
e, opcionalmente, o número N ≥ 2
de concorrentes. Cada entrada T[i][j]
representa o resultado do jogo entre competidores i
e j
, com o valor 1 representando uma vitória i
e 0 uma vitória j
. Observe que T[i][j] == 1-T[j][i]
se i != j
. A diagonal de T
consiste em 0s.
Sua saída será a lista de reis no torneio que T
representa, usando a indexação com base em 0 ou em 1. A ordem dos reis é irrelevante, mas não deve haver duplicatas.
Tanto a entrada como a saída podem ser obtidas em qualquer formato razoável.
Regras e pontuação
Você pode escrever um programa completo ou uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.
Casos de teste
Esses casos de teste usam indexação baseada em 0. Para indexação baseada em 1, incremente cada valor de saída.
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]
fonte
Respostas:
Matlab,
36 3529 bytesVamos descobrir se
i
é um rei. Então, para cada um,j
o valorT[i][j]==1 OR there is a k such that T[i][k] * T[k][l] == 1
. Mas a segunda condição também pode ser substituída porsum_over_k(T[i][k] * T[k][l])>0
, mas essa é apenas uma entrada da matrizT*T
(se você considerarT
uma matriz). OOR
pode então ser repetido adicionandoT
a esse resultado, portanto, apenas precisamos verificar se osn-1
valores da linhai
deT*T+T
são maiores que zero, para ver sei
é rei. É exatamente isso que minha função faz.(Este é o MATLAB, portanto, os índices são baseados em 1).
As matrizes MATLAB devem ser codificadas com ponto e vírgula como delimitadores de linha:
fonte
size(T,1)
Geléia,
131211 bytesA saída é baseada em 1. Experimente online!
Como alternativa, usando operadores bit a bit em vez de manipulação de matriz:
Novamente, a saída é baseada em 1. Experimente online!
fundo
Para o competidor A , podemos encontrar todos B tal que uma batida C batida B , tomando todas as linhas que correspondem a um C tal que C bater um . IFR o B th entrada da C th é 1 , temos que C bater B .
Se computarmos os ORs lógicos de todas as entradas correspondentes das colunas selecionadas, obteremos um único vetor indicando se A vence B por transitividade ou não. Finalmente, ORing o vetor resultante com a linha correspondente da matriz de entrada fornece aos booleanos se A vence B , por transitividade ou diretamente.
Repetindo este para cada linha, contamos o número de 1 's em cada vetor, portanto, calcular a quantidade de concorrentes cada uma batida. A contagem máxima corresponde aos reis do torneio.
Como funciona
fonte
Python usando numpy, 54 bytes
Recebe uma matriz numpy, gera uma matriz de linhas numpy de índices baseados em 0.
Outra maneira de pensar em um rei é como um competidor pelo qual todos os competidores estão na união do rei, as pessoas que o rei derrotou e as pessoas que essas pessoas vencem. Em outras palavras, para todo competidor, existe um caminho de no máximo 2 do rei para eles entre a relação "batida".
O Matrix
I + M + M*M
codifica o número de caminhos de 0, 1 ou 2 etapas de cada origem para cada destino. Um jogador é rei se a sua linha desta matriz tiver apenas entradas positivas. Como 0 é Falsey,all
nos diz se uma linha é diferente de zero. Aplicamos isso a cada linha e produzimos os índices dos resultados diferentes de zero.fonte
JavaScript (ES6), 83 bytes
fonte
MATL ,
12109 bytesA entrada é: primeiro o número de participantes e, em uma linha separada, uma matriz com linhas separadas por ponto e vírgula. A saída é baseada em 1.
Por exemplo, o quinto caso de teste tem entrada
e o último caso de teste tem entrada
Experimente online!
Explicação
fonte
Javascript
136131121112 bytesLigue usando:
watchout porque a saída é indexada em 1 (salvou alguns bytes sem tentar filtrar 0s e falsas)
fonte