tło
Rozważ turniej typu round-robin, w którym każdy zawodnik gra w jedną grę z każdym innym zawodnikiem. Nie ma remisów, więc każda gra ma zwycięzcę i przegranego. Uczestnik jest król turnieju, jeśli dla każdej innej zawodnik B , albo pokonać B lub pobić kolejny zawodnik C , który z kolei rytm B . Można wykazać, że każdy turniej ma co najmniej jednego króla (choć może ich być kilka). W tym wyzwaniu Twoim zadaniem jest znaleźć królów danego turnieju.
Wejście i wyjście
Twój wkład to N × N
macierz boolowska T
i opcjonalnie liczba N ≥ 2
uczestników. Każdy wpis T[i][j]
reprezentuje wynik meczu pomiędzy zawodników i
i j
, o wartości 1 reprezentujących wygrać i
i 0 wygraną dla j
. Zauważ, że T[i][j] == 1-T[j][i]
jeśli i != j
. Przekątna T
składa się z zer.
Twój wynik będzie listą królów w turnieju, która T
reprezentuje, przy użyciu indeksowania 0 lub 1. Kolejność królów nie ma znaczenia, ale nie powinno być duplikatów.
Zarówno dane wejściowe, jak i wyjściowe można przyjmować w dowolnym rozsądnym formacie.
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
Te przypadki testowe wykorzystują indeksowanie oparte na 0. W przypadku indeksowania opartego na 1, zwiększaj każdą wartość wyjściową.
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]
Odpowiedzi:
Matlab,
36 3529 bajtówDowiedzmy się, czy
i
jest królem. Następnie dla każdejj
wartościT[i][j]==1 OR there is a k such that T[i][k] * T[k][l] == 1
. Ale drugi warunek można również zastąpićsum_over_k(T[i][k] * T[k][l])>0
, ale jest to tylko wpis macierzyT*T
(jeśli uważa się jąT
za macierz).OR
Mogą być następnie odtwarzane przez dodanieT
do tego wyniku, więc po prostu trzeba sprawdzić, czyn-1
wartości rzędui
odT*T+T
jest większa od zera, aby zobaczyć, czyi
jest królem. To właśnie robi moja funkcja.(To jest MATLAB, więc indeksy są oparte na 1).
Matryce MATLAB powinny być kodowane średnikami jako ogranicznikami linii:
źródło
size(T,1)
Galaretka,
131211 bajtówWyjście jest oparte na 1. Wypróbuj online!
Alternatywnie, używając operatorów bitowych zamiast manipulacji tablicami:
Ponownie, wyjście jest oparte na 1. Wypróbuj online!
tło
Dla zawodnik A , możemy znaleźć wszystkie B takie, że dudnienie C rytmu B poprzez wszystkie wiersze, które odpowiadają C takie, że C pokonać . IFR w B th wpisu C th jest 1 , że mamy C pokonać B .
Jeśli obliczymy logiczne OR wszystkich odpowiednich wpisów wybranych kolumn, otrzymamy pojedynczy wektor wskazujący, czy A bicie B przez przechodniość, czy nie. Na koniec ORing otrzymanego wektora odpowiednim wierszem macierzy wejściowej daje booleanom, czy A bije B , albo przez przechodniość, albo bezpośrednio.
Powtarzając to dla każdego rzędu, liczymy liczbę 1 w każdym wektorze, dlatego obliczamy liczbę zawodników w każdym uderzeniu A. Maksymalne liczby odpowiadają królom turnieju.
Jak to działa
źródło
Python używa numpy, 54 bajtów
Pobiera macierz numpy, generuje macierz numpy wierszy wskaźników opartych na 0.
Innym sposobem myślenia o królu jest uczestnik, w którym wszyscy uczestnicy są w związku króla, ludu, który król pokonał, i ludzi, których pokonali ludzie. Innymi słowy, dla każdego uczestnika istnieje relacja długości co najwyżej 2 od króla do nich wśród relacji „beat”.
Matryca
I + M + M*M
koduje liczbę ścieżek 0, 1 lub 2 kroków od każdego źródła do każdego celu. Gracz jest królem, jeśli jego rząd tej macierzy ma tylko pozytywne wpisy. Ponieważ 0 to Falsey,all
mówi nam, czy cały wiersz jest niezerowy. Stosujemy to do każdego wiersza i wyprowadzamy wskaźniki niezerowych wyników.źródło
JavaScript (ES6), 83 bajty
źródło
MATL ,
12109 bajtówDane wejściowe to: najpierw liczba uczestników, a na osobnej linii macierz z wierszami oddzielonymi średnikami. Wyjście jest oparte na 1.
Na przykład piąty przypadek testowy ma dane wejściowe
a ostatni przypadek testowy ma dane wejściowe
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript
136131121 121112 bajtówZadzwoń za pomocą:
uważaj, ponieważ dane wyjściowe są indeksowane 1 (zapisano kilka bajtów, nie próbując odfiltrować 0 względem fal)
źródło