Ponieważ jutro jest 4 maja, oto krótki post z motywem Gwiezdnych Wojen, aby przygotować się mentalnie na wszystkie złe żarty, które nadejdą jutro.
BACKSTORY
Podczas sesji galaktycznego senatu wszyscy senatorzy siedzą w n*n
siatce. Nagły wybuch grypy JarJar (trwający wiecznie i powodujący, że zarażeni mówią tak, jak JarJar Binks) powoduje zarażenie niektórych senatorów.
Oto przykład z 6*6
siatką, w której X
są zainfekowani senatorzy, odpowiednia lista to [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[0,5]]
:
Następnie infekcja zaczyna się rozprzestrzeniać krok po kroku. Dwóch senatorów sąsiaduje, jeśli dzielą całą krawędź siatki (tj. Góra, dół, prawo, lewa strona), co oznacza, że wykluczamy przekątne.
Możemy stwierdzić, że senator może sąsiadować z 2,3 lub 4 innymi senatorami i zgłosić następujące zasady dotyczące infekcji:
- Zarażony senator pozostaje zarażony na zawsze
- Senator jest zarażany na jednym etapie, jeśli sąsiadował z 2 lub więcej zarażonymi senatorami na poprzednim etapie
Oto przykład z poprzednią siatką, która pokazuje 2 pierwsze kroki infekcji:
Po kolejnych krokach cały senat zostanie zainfekowany
TWOJE ZADANIE
Twój kod nie musi obsługiwać nieprawidłowych danych wejściowych, takich jak lista większa niż n*n
lub współrzędne, które nie są różnicami.
Twój kod pobierze jako dane wejściowe listę par liczb całkowitych (lub siatkę binarną lub dowolny inny format, który pasuje do twojego języka) i liczbę całkowitą n
(co może być niepotrzebne, jeśli używasz innego formatu niż lista), na przykład:
8 [[1,2],[1,1],[7,4],[2,7],[4,3]]
n jest stroną siatki, co oznacza, że siatka będzie siatką * n, a lista par liczb całkowitych jest współrzędnymi komórek początkowo zainfekowanych senatorów.
Lewy dolny róg siatki to [0,0], a prawy górny - [n-1, n-1]. Lewy górny róg to [0, n-1].
Twój kod musi wypisywać liczbę całkowitą:
-1
lub wartość fałszowania lub błąd, jeśli cała sieć nigdy nie zostanie całkowicie zainfekowana lub minimalna liczba kroków wymaganych do zainfekowania całej sieci
Przypadki testowe
6 [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[5,0]] => 7
4 [[1,1][0,3][1,0][3,0][3,3]] => 9
Pamiętaj, że jest to golf golfowy , dlatego wygrywa najkrótsza odpowiedź w bajtach!
n
? Czy istnieje wartość maksymalna?CellularAutomaton
...Odpowiedzi:
MATL,
2928 bajtówDane wejściowe mają postać macierzy 2D z jedynkami i zerami
Wypróbuj w MATL Online
Wyjaśnienie
źródło
tn:"tlY6Z+1>Z|t?x@D.]]N?xl_
? (Nie testowałem wiele). Jeśli w pewnym momencie wszystkie elementy mają wartość 1, natychmiast wyświetl indeks pętli i usuń stos. Na końcu pętli, jeśli stos nie jest pusty, usuń i wciśnij-1
APL (Dyalog 16.0), 54 znaki lub 60 bajtów
Jako argument przyjmuje zamkniętą macierz, zwraca numer kroku, który kończy infekcję, tzn. 1 = jest już w pełni zainfekowany. 0 = nie rozkłada się w pełni, co stanowi zaledwie 1 + numery PO.
54 znaki (Unicode):
60 bajtów (Classic):
⌺
jest równa⎕U233A
Przebieg przykładów:
Kroki są następujące:
źródło
Pyth , 49 bajtów
Zestaw testowy .
Używa 1-indeksowania dla danych wyjściowych.
źródło
Python, 231 bajtów
Zgłasza błąd, jeśli nie jest to możliwe.
Wypróbuj online!
źródło
0/0
zapisuje dwa bajty zraise
. Może1/(g!=h)
by zadziałało? (wtedy całośćwhile
mogłaby być również wstawiona).q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0
oszczędza 12. Można usunąć przestrzeń pomiędzy (a)1
ifor
(b)]
ifor
zbyt.JavaScript (ES6), 132 bajty
Gdzie
\n
reprezentuje dosłowny znak nowej linii. Staje wejścia jako ciąg0
S i1
S w tablicy nowej linii rozdzielany. Zwraca,NaN
jeśli siatka nigdy nie zostanie całkowicie zainfekowana.źródło