Walczysz z rozległą siecią szpiegów wroga . Wiesz, że każdy szpieg ma co najmniej jedną (czasem wielokrotną) fałszywą tożsamość, której lubią używać. Naprawdę chciałbyś wiedzieć, z iloma szpiegami faktycznie masz do czynienia.
Na szczęście twoi agenci kontrwywiadu wykonują swoją pracę i czasami mogą dowiedzieć się, kiedy dwie fałszywe tożsamości są faktycznie kontrolowane przez tego samego szpiega wroga.
To jest do powiedzenia:
- Twoi agenci nie zawsze wiedzą jednak, kiedy dwie fałszywe tożsamości mają za sobą tego samego szpiega
- Jeśli agent powie ci, że dwie fałszywe tożsamości są kontrolowane przez tego samego szpiega, masz nadzieję, że mają rację.
Wiadomości agenta
Agenci wysyłają ci tajemnicze wiadomości informujące, które tożsamości mają za sobą tego samego szpiega. Przykład:
Masz do czynienia z 2 agentami i 5 fałszywymi tożsamościami .
Pierwszy agent wysyła Ci wiadomość:
Red Red Blue Orange Orange
Oznacza to, że myślą, że są 3 szpiedzy:
- pierwszy (czerwony) kontroluje tożsamość 1 i 2
- drugi (niebieski) kontroluje tożsamość 3
- trzeci (pomarańczowy) kontroluje tożsamość 4 i 5
Drugi agent wysyła Ci wiadomość:
cat dog dog bird fly
Oznacza to, że myślą, że są 4 szpiedzy:
- pierwszy (kot) kontroluje tożsamość 1
- drugi (pies) kontroluje tożsamość 2 i 3
- trzeci (ptak) kontroluje tożsamość 4
- czwarty (mucha) kontroluje tożsamość 5
Kompilujemy informacje, które widzimy:
Identities: id1 id2 id3 id4 id5
Agent 1: |--same-spy--| |--same-spy--|
Agent 2: |--same-spy--|
Conclusion: |-----same-spy------||--same-spy--|
Oznacza to, że jest maksymalnie 2 szpiegów .
Notatki
Tożsamości należące do tego samego szpiega nie muszą być następujące po sobie, tzn. Wiadomość taka jak:
dog cat dog
jest ważny.
To samo słowo może być również używane przez dwóch różnych agentów - to nic nie znaczy, to tylko zbieg okoliczności, np .:
Agent 1: Steam Water Ice
Agent 2: Ice Ice Baby
Lód jest używany przez oba agenty - Ice
używany przez pierwszego agenta nie jest związany z dwoma przypadkami Ice
użycia przez drugiego agenta.
Wyzwanie
Zbierz wszystkie dane wywiadowcze swoich agentów i dowiedz się, ilu naprawdę jest szpiegów wroga. (Mówiąc ściślej, uzyskaj najniższą górną granicę, biorąc pod uwagę ograniczoną liczbę posiadanych informacji).
Najkrótszy kod w bajtach wygrywa.
Dane wejściowe i wyjściowe
Dane wejściowe to lista n linii, które reprezentują n wiadomości od agentów. Każda linia składa się z k oddzielonych spacjami tokenów, takich samych k dla wszystkich linii. Tokeny są alfanumeryczne, o dowolnej długości. Sprawa ma znaczenie.
Wynik powinien być pojedynczą liczbą, reprezentującą liczbę różnych szpiegów, na podstawie danych wywiadowczych twoich agentów.
Przykłady
Przykład 1
Wkład:
Angel Devil Angel Joker Thief Thief
Ra Ra Ras Pu Ti N
say sea c c see cee
Wydajność:
2
Przykład 2
Wkład:
Blossom Bubbles Buttercup
Ed Edd Eddy
Wydajność:
3
Przykład 3
Wkład:
Botswana Botswana Botswana
Left Middle Right
Wydajność:
1
Przykład 4
Wkład:
Black White
White Black
Wydajność:
2
Przykład 5
Wkład:
Foo Bar Foo
Foo Bar Bar
Wydajność:
1
Przykład 6
Wkład:
A B C D
A A C D
A B C C
A B B D
Wydajność:
1
Przykład 7
Wkład:
A B A C
Wydajność:
3
Przykład 8
Wkład:
A
B
C
Wydajność:
1
Przykład 9
Wkład:
X
Wydajność:
1
Odpowiedzi:
Młot 0,5.1 ,
1615 bajtówDekompresuje się do tej funkcji języka Wolfram (wersja ostateczna
&
jest domyślna):Wypróbuj online!
Transpose[StringSplit @ #1]
: Podziel każdy ciąg na liście wejściowej i zabierz kolumny (tożsamości szpiegowskie)RelationGraph[Inner[Equal, ##1, Or] &, ...]
: Zbuduj wykres, na którym dwa wierzchołki dzielą krawędź, jeśli co najmniej jedna pozycja jest równa (jeśli są klasyfikowane przez tego samego agenta jako ten sam szpieg)Length[ConnectedComponents[...]]
: Liczba podłączonych komponentów jest górną granicą możliwej liczby szpiegów.źródło
JavaScript (Node.js) ,
155 150 142141 bajtówWypróbuj online!
W jaki sposób?
Dla każdej kolumny tworzymy maskę bitów połączonych kolumn (w tym tej kolumny). W końcu zwracamy liczbę różnych masek bitowych.x m x
Skomentował
źródło
Galaretka , 19 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako listę oddzielonych spacjami wierszy (uwzględnia to stopka).
Uwaga:
ḲŒQ)PS
nie nie działa.źródło
Python 3 ,
132162154139135 bajtówWypróbuj online!
Jest to bardzo kompaktowa implementacja algorytmu grafowego identyfikującego klastry.
Dla każdego czynnika, tworzymy mapę profili i ich alias, który jest najniższy wskaźnik wygląd:
[map(b.index,b)for b in map(str.split,a)]
. To znaczy[0,1,2,1,2]
identyfikuje trzech szpiegów, w których pierwszy profil należy do jednego, drugi i czwarty do drugiego, a trzeci i piąty do ostatniego. Indeks grupy jest także indeksem pierwszego profilu w grupie.Transponując tę macierz (
[*zip(*m...)]
), otrzymujemy członkostwo w grupie dla każdego profilu. Tworzy to ukierunkowany, acykliczny wykres, ponieważ indeksy grupowe są podzbiorem indeksów profilu, a wszystkie krawędzie idą w kierunku indeksów niższych lub równych. Profile odpowiadające temu samemu szpiegowi tworzą teraz klaster bez połączeń z innymi profilami. Wciąż mamy jednak zduplikowane ścieżki, ponieważ indeksy profili są powiązane z indeksami wielu grup.Za pomocą następujących pętli minimalizujemy wykres do płaskiego lasu, w którym wszystkie profile są połączone bezpośrednio z najniższym indeksem w drzewie, tj. Korzeniem:
min(min(u)for u in r if min(w)in u)
Wreszcie zwraca liczbę korzeni w lesie, czyli wskaźniki związane z siebie:
return sum(i==...)
.źródło
Węgiel ,
4943 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Mógłby zaoszczędzić kilka bajtów przy użyciu uciążliwego formatu wejściowego. Wyjaśnienie:
Wprowadź listę pierwszego agenta.
Powtórz dla pozostałych agentów.
Wpisz ich listę.
Pętla nad indeksem każdego elementu.
Znajdź pierwszy element na liście tego agenta o tej samej tożsamości i zaktualizuj listę pierwszego agenta, aby pokazać, że są one tej samej tożsamości.
Policz liczbę pozostałych unikalnych tożsamości.
źródło
Galaretka ,
2515 bajtówWypróbuj online!
Łącze monadyczne zawierające listę rozdzielających spacje oświadczeń agenta i zwracające najniższą górną granicę liczby różnych szpiegów.
Wyjaśnienie
Dzięki @Arnauld i @JonathanAllan za identyfikację problemów z poprzednimi wersjami oraz @JonathanAllan ponownie za zapisanie bajtu! Jeśli specyfikacja wejściowa została zmieniona, aby umożliwić listę list, zaoszczędziłoby to jeden bajt.
źródło
Ġ
są sortowane, a spłaszczony, zduplikowany wynik filtrufƇFQ
zawsze po wielokrotnym zastosowaniu kończyłby się nimi w uporządkowanej kolejności (np.'a a b b c', 'a b a b c
Nie znalazłby żadnego[3,4,1,2]
, nawet jeśli pojawi się po drodze). WięcḲĠ)ẎfƇFQɗⱮQ$ÐLL
może być dobry na 15?JavaScript (Node.js) , 120 bajtów
Wypróbuj online!
źródło
Łuska , 12 bajtów
Wypróbuj online!
Wyjaśnienie
Chodzi o to, aby utworzyć listę wszystkich grup szpiegów, o których wiadomo, że to ta sama osoba, a następnie stopniowo łączyć przecinające się grupy, aż do osiągnięcia ustalonego punktu. Dane wyjściowe to liczba pozostałych grup, których nie można scalić.
źródło
Python 3 ,
191182 bajtyDziękuję rekursywnie
Wypróbuj online!
źródło
Ruby ,
123117 bajtówUżywa podobnego pomysłu do rozwiązania Movatica w języku Python 3, ale oblicza najniższy indeks szpiegowania dla każdego „drzewa” w nieco inny sposób (poprzez śledzenie wcześniej napotkanych profili, znajdowanie nakładki, jeśli istnieje, i łączenie ich)
-6 bajtów z @GB.
Wypróbuj online!
Wyjaśnienie
źródło
s.split.map{|i|s.index i}
jest przyjemna, ale może tworzyć przypadki krawędziowe w zależności od długości danych wejściowych. Dane wejściowe powinny zwracać wartość 3, a nie 2.Python 2 ,
229221 bajtówWypróbuj online!
8 bajtów dzięki za wilkben .
źródło
g
jest używany tylko raz, czy nie można go zdefiniować bezpośrednio? Trochę zapominam, czy jest to możliwe w Pythonie, ale wydaje mi się, że tak jest.Czysty , 137 bajtów
Wypróbuj online!
Kojarzy ciągi używane przez agentów z numerem linii, w którym się pojawiają, aby zapobiec równości między agentami, a następnie wielokrotnie sprawdza, czy jakieś wyrażenia dla dowolnej pozycji nakładają się, i zlicza liczbę zestawów wynikowych.
źródło
PHP , 271 bajtów
To nie zadziała, jeśli którakolwiek z tożsamości to tylko liczby, ponieważ przechowuję „numer szpiegowski” wraz z tożsamościami. Nie sądzę jednak, żeby to było trudne.
Wypróbuj online!
Wyjaśnienie
Trochę zdezorientowałem się, pisząc to, ale działa to dla wszystkich przypadków testowych!
Wypróbuj online!
źródło