Aby zasymulować inwazję zombie, zacznij od siatki #
i reprezentującej mapę:
## ##
### #
## ##
# ###
# ####
#
reprezentuje ziemię.reprezentuje wodę.
Zombie zaczynają się w punkcie na mapie ...
## ##
### #
## %#
# ###
# ####
... i się rozprzestrzeniają. %
oznacza ziemię zainfekowaną zombie.
Jednak zombie nie mogą pływać . Mogą poruszać się po lądzie w taki sam sposób, w jaki król porusza się w szachach - jedno pole w dowolnym ukośnym lub prostopadłym kierunku:
!!!
!%!
!!!
Pod koniec symulacji część ziemi zostanie zainfekowana zombie:
%% ##
%%% #
%% %%
% %%%
# %%%%
Twoim zadaniem jest symulacja inwazji zombie. Napisz program (lub funkcję), który przyjmuje jako dane wejściowe ciąg reprezentujący początkowy stan siatki oraz dwie liczby reprezentujące współrzędne początkowego zombie. Program powinien wypisać (lub zwrócić) końcowy stan inwazji.
Dane techniczne
- Twój program może wydrukować opcjonalny znak nowej linii.
- Możesz założyć, że dane wejściowe będą miały poprawny format (wypełniony spacjami), z opcjonalnym końcowym znakiem nowej linii.
- Możesz założyć, że początkowy zombie zacznie się na lądzie i nie umrze natychmiast.
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź (w bajtach).
- -100% bonusu, jeśli Twój kod może rozwiązać problem zatrzymania dla dowolnych maszyn Turinga.
- Twój program powinien obsługiwać tablice o szerokości do 50 znaków.
code-golf
ascii-art
simulation
Esolanging Fruit
źródło
źródło
Odpowiedzi:
APL (Dyalog) , 44 bajty
Wypróbuj online!
Zakłada
⎕IO←0
.Lewy argument: 0
r
% indeksowany wiersz , 0% indeksowany kolumnac
%:r c
Prawy argument: Matryca znaków
źródło
Kotlin,
283218 bajtówNienazwana lambda (z funkcją zagnieżdżoną, heh).
Grał w golfa
Nie golfił
Zaoszczędzono sporo bajtów, przechodząc na rozwiązanie rekurencyjne.
źródło
JavaScript (ES6), 144 bajty
Gdzie
\n
reprezentuje dosłowny znak nowej linii. Przyjmuje współrzędne 0-indeksowane.źródło
Befunge,
324323 bajtyWypróbuj online!
Wyjaśnienie
Wdrożenie tego w Befunge było trochę skomplikowane, ponieważ jesteśmy ograniczeni do 80x25 znaków „pamięci”, które muszą być współdzielone z samym kodem źródłowym. Sztuczka polegająca na dopasowaniu mapy 50x50 w tym obszarze polegała na spłaszczeniu mapy 2D do tablicy 1D z dwoma lokalizacjami mapy na bajt. Ta tablica 1D jest następnie ponownie zawijana w tablicę 2D, aby zmieściła się na szerokości 80 znaków na polu gry Befunge.
Algorytm infekcji rozpoczyna się od konwersji początkowych współrzędnych na przesunięcie w tablicy 1D, którą wypycha na stos. Główna pętla pobiera wartość ze stosu i sprawdza stan mapy dla tego przesunięcia. Jeśli jest to niezainfekowana ziemia, zostaje oznaczona jako zainfekowana, a osiem nowych odsunięć jest wypychanych na stos (reprezentujących ziemię wokół bieżącej pozycji). Proces ten trwa, dopóki stos nie będzie pusty.
Aby uniknąć konieczności sprawdzania wartości spoza zakresu, mapa jest przechowywana z jednoznakową ramką wodną wokół wszystkich krawędzi.
źródło
Pip , 59 bajtów
Funkcja, która pobiera wielowierszowy ciąg, wiersz początkowego zombie (0-indeksowany) i kolumnę początkowego zombie (0-indeksowany). Wypróbuj online!
W jaki sposób?
Ponieważ Pip ma cykliczne indeksowanie (zwykle jest to dobra rzecz, ale złe dla tego problemu, ponieważ nie chcemy, aby krawędzie mapy się zawijały), wybrałem rozwiązanie zastępujące wyrażenia regularne.
Ya@?n
znajduje indeks pierwszego nowego wiersza (tj. szerokość siatki) i ciągnie go doy
.(ac+b+b*Ya@?n):'%
po wykonaniu powyższego oblicza(width + 1) * row + col
, tj.c+b+b*y
i ustawia znak pod tym indeksem na%
.L2*#a
2*len(a)
razy pętli , co daje nam wystarczającą liczbę iteracji, aby wypełnienie powodziowe mogło się w pełni rozprzestrzenić i zapewnia, że liczba iteracji jest równa (to ważne)..`#(.?.?.{`.y-1.`})?%`
konstruuje wyrażenie regularne,#
po którym następuje a%
, z 0, szerokość-1, szerokość lub szerokość + 1 znaków pomiędzy. (Na.
początku sprawia,.
że wyrażenie regularne dopasowuje nowe wiersze.) To wyrażenie regularne pasuje do dowolnej z następujących konfiguracji:aR ... '%.@>_
zastępuje dopasowania tego wyrażenia regularnego znakiem%
poprzedzającym.
wszystko oprócz pierwszego znaku@>
dopasowania_
; w skrócie, zastępując#
z%
.a:RV ...
odwraca to i przypisuje z powrotem doa
. Odwracamy, ponieważ regex pasuje tylko#
przed%
ciągiem, a nie po nim; ale gdy łańcuch jest odwrócony, po staje się przed i możemy dopasować go przy następnej iteracji. Dlatego też liczba iteracji musi być parzysta.Po zakończeniu pętli po prostu zwracamy zmodyfikowaną wartość parametru
a
.źródło
TSQL, 267 bajtów
Gra w golfa:
Nie golfowany:
Wypróbuj to
źródło
PHP,
209189188183 bajtówmoże być golfa
Biegnij z
php -r '<code>' '<grid>' <y> <x>
źródło
J, 152 bajtów
Nie bardzo dobrze gra w golfa, jestem pewien, że istnieje sposób na usunięcie tych ostatnich struktur kontrolnych.
Implementuje algorytm wypełniania zalania. Funkcja g formatuje dane wejściowe do tablicy znaków przed zastosowaniem f.
Pamiętaj, że współrzędne są nieco dziwne:
to lewy górny róg. Zwiększenie pierwszej współrzędnej:
Przesuwa pozycję w dół w kierunku y.
Poza tym współrzędne są normalne.
Przykład:
źródło