Hintergrund
Stellen Sie sich ein Round-Robin-Turnier vor, bei dem jeder Teilnehmer ein Spiel gegen jeden anderen Teilnehmer spielt. Es gibt keine Unentschieden, also hat jedes Spiel einen Gewinner und einen Verlierer. Ein Teilnehmer A ist ein König des Turniers, wenn für jeden anderen Teilnehmer B entweder A Schlag B oder A Schlag ein anderer Teilnehmer ist C ist, der seinerseits B schlägt . Es kann gezeigt werden, dass jedes Turnier mindestens einen König hat (obwohl es mehrere geben kann). In dieser Herausforderung besteht deine Aufgabe darin, die Könige eines bestimmten Turniers zu finden.
Ein- und Ausgabe
Ihre Eingabe ist eine N × N
boolesche Matrix T
und optional die Anzahl N ≥ 2
der Teilnehmer. Jeder Eintrag T[i][j]
repräsentiert das Ergebnis des Spiels zwischen Teilnehmern i
und j
, mit dem Wert 1 einen Gewinn für darstellte i
und 0 einen Gewinn für j
. Beachten Sie, dass T[i][j] == 1-T[j][i]
wenn i != j
. Die Diagonale von T
besteht aus 0s.
Ihre Ausgabe soll die Liste der Könige des Turniers sein, T
für die entweder eine 0-basierte oder eine 1-basierte Indexierung verwendet wird. Die Reihenfolge der Könige ist irrelevant, aber es sollte keine Duplikate geben.
Sowohl die Eingabe als auch die Ausgabe kann in jedem vernünftigen Format erfolgen.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
Diese Testfälle verwenden eine 0-basierte Indizierung. Erhöhen Sie bei einer 1-basierten Indizierung jeden Ausgabewert.
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]
Antworten:
Matlab,
36 3529 BytesLassen Sie uns herausfinden, ob
i
es ein König ist. Dann für jedenj
den WertT[i][j]==1 OR there is a k such that T[i][k] * T[k][l] == 1
. Die zweite Bedingung kann aber auch durch ersetzt werdensum_over_k(T[i][k] * T[k][l])>0
, dies ist aber nur ein Eintrag der MatrixT*T
(wenn SieT
als Matrix betrachten). DasOR
kann dann wiederholt werden, indemT
zu diesem Ergebnis addiert wird. Wir müssen also nur prüfen, ob dien-1
Werte in der Zeilei
vonT*T+T
größer als Null sind, um festzustellen, obi
König ist. Genau das macht meine Funktion.(Dies ist MATLAB, daher basieren die Indizes auf 1.)
Die MATLAB-Matrizen sollten mit Semikolons als Zeilenbegrenzer codiert werden:
quelle
size(T,1)
Jelly,
131211 BytesDie Ausgabe ist 1-basiert. Probieren Sie es online!
Alternativ können Sie bitweise Operatoren anstelle der Array-Manipulation verwenden:
Auch hier ist die Ausgabe 1-basiert. Probieren Sie es online!
Hintergrund
Für Teilnehmer A können wir alle B so finden, dass A Schlag C Schlag B ist, indem wir alle Zeilen nehmen, die einem C entsprechen, so dass C Schlag A ist . Ifr der B - te Eingabe des C - ten ist 1 , haben wir , dass C B schlagen .
Wenn wir die logischen ODER-Verknüpfungen aller entsprechenden Einträge der ausgewählten Spalten berechnen, erhalten wir einen einzelnen Vektor, der angibt, ob A durch Transitivität B schlägt oder nicht. Durch ODER-Verknüpfung des resultierenden Vektors mit der entsprechenden Zeile der Eingabematrix erhält man schließlich Boolesche Werte ob A B schlägt , entweder durch Transitivität oder direkt.
Wiederholen dieses für jede Zeile, wir die Anzahl der Zählung 1 ‚s in jedem Vektor, also die Berechnung der Menge der Kandidaten jedes A Beat. Die maximale Anzahl entspricht den Königen des Turniers.
Wie es funktioniert
quelle
Python mit Numpy, 54 Bytes
Nimmt eine Zahlenmatrix auf, gibt eine Zahlenzeilenmatrix mit 0-basierten Indizes aus.
Ein anderer Weg, sich einen König vorzustellen, ist, als Teilnehmer zu gelten, für den alle Teilnehmer in der Vereinigung des Königs stehen, des Volkes, das der König schlägt, und des Volkes, das das Volk schlägt. Mit anderen Worten, für jeden Wettkämpfer gibt es einen Längenweg von höchstens 2 vom König zu ihnen unter der "Schlag" -Beziehung.
Die Matrix
I + M + M*M
codiert die Anzahl der Pfade mit 0, 1 oder 2 Schritten von jeder Quelle zu jedem Ziel. Ein Spieler ist ein König, wenn seine Reihe dieser Matrix nur positive Einträge enthält. Da 0 Falsey ist,all
wird angegeben, ob eine Zeile ungleich Null ist. Wir wenden dies auf jede Zeile an und geben die Indizes der Nicht-Null-Ergebnisse aus.quelle
JavaScript (ES6), 83 Byte
quelle
MATL ,
12109 BytesDie Eingabe ist: Zuerst die Anzahl der Teilnehmer und in einer separaten Zeile eine Matrix mit durch Semikolons getrennten Zeilen. Die Ausgabe ist 1-basiert.
Zum Beispiel hat der fünfte Testfall eine Eingabe
und der letzte Testfall hat Eingang
Probieren Sie es online!
Erläuterung
quelle
Javascript
136131121112 BytesAnrufen mit:
Achtung, da die Ausgabe 1-indiziert ist (ein paar Bytes gespart, ohne zu versuchen, 0s gegen Falses herauszufiltern)
quelle