Um eine Zombie-Invasion zu simulieren, beginnen Sie mit einem Raster #
und stellen Sie die Karte dar:
## ##
### #
## ##
# ###
# ####
#
Land darstellt.steht für Wasser.
Die Zombies starten an einem Punkt auf der Karte ...
## ##
### #
## %#
# ###
# ####
... und sich ausbreiten. %
bezeichnet von Zombies infiziertes Land.
Allerdings Zombies können nicht schwimmen . Sie können sich auf die gleiche Weise über Land bewegen, wie sich ein König im Schach bewegt - ein Feld in einer beliebigen diagonalen oder orthogonalen Richtung:
!!!
!%!
!!!
Am Ende der Simulation wird ein Teil des Landes mit Zombies infiziert:
%% ##
%%% #
%% %%
% %%%
# %%%%
Ihre Aufgabe ist es, die Zombie-Invasion zu simulieren. Schreiben Sie ein Programm (oder eine Funktion), das eine Zeichenfolge als Eingabe verwendet, die den Anfangszustand des Gitters darstellt, und zwei Zahlen, die die Koordinaten des Anfangszombies darstellen. Das Programm sollte den Endzustand der Invasion ausgeben (oder zurückgeben).
Spezifikationen
- Ihr Programm druckt möglicherweise eine optionale abschließende Newline.
- Sie können davon ausgehen, dass die Eingabe im richtigen Format erfolgt (mit Leerzeichen aufgefüllt), mit einer optionalen nachgestellten Newline.
- Sie können davon ausgehen, dass der erste Zombie an Land startet und nicht sofort stirbt.
- Das ist Code-Golf , also gewinnt die kürzeste Antwort (in Bytes).
- -100% Bonus, wenn Ihr Code auch das Halteproblem für beliebige Turing-Maschinen lösen kann .
- Ihr Programm sollte Kartenbreiten von bis zu 50 Zeichen unterstützen.
quelle
Antworten:
APL (Dyalog) , 44 Bytes
Probieren Sie es online!
Geht davon aus
⎕IO←0
.Linkes Argument: 0-indizierte Zeile
r
von%, 0-indizierte Spaltec
von%:r c
Rechtes Argument: Zeichenmatrix
quelle
Kotlin,
283.218BytesUnbenanntes Lambda (mit einer verschachtelten Funktion, heh).
Golf gespielt
Ungolfed
Durch den Wechsel zu einer rekursiven Lösung wurden einige Bytes eingespart.
quelle
JavaScript (ES6), 144 Byte
Wobei
\n
das wörtliche Zeilenumbruchzeichen darstellt. Nimmt 0-indizierte Koordinaten.quelle
Befunge,
324323 BytesProbieren Sie es online!
Erläuterung
Die Implementierung in Befunge war etwas kompliziert, da der "Speicher" auf 80 x 25 Zeichen begrenzt ist, der mit dem Quellcode selbst geteilt werden muss. Der Trick beim Einpassen einer 50x50-Karte in diesen Bereich bestand darin, die 2D-Karte in ein 1D-Array mit zwei Kartenpositionen pro Byte zu reduzieren. Dieses 1D-Array wird dann erneut in ein 2D-Array eingebunden, sodass es in die Breite von 80 Zeichen des Befunge-Spielfelds passt.
Der Infektionsalgorithmus konvertiert zunächst die Anfangskoordinaten in einen Versatz im 1D-Array, den er auf den Stapel schiebt. Die Hauptschleife entnimmt einen Wert aus dem Stapel und sucht den Kartenstatus für diesen Versatz. Wenn es sich um nicht infiziertes Land handelt, wird es als infiziert markiert, und acht neue Offsets werden auf den Stapel geschoben (wobei das Land um die aktuelle Position herum dargestellt wird). Dieser Vorgang wird fortgesetzt, bis der Stapel leer ist.
Um zu vermeiden, dass auf Werte außerhalb des Bereichs geprüft werden muss, wird die Karte mit einem einstelligen Wasserrahmen an allen Rändern gespeichert.
quelle
Pip , 59 Bytes
Eine Funktion, die eine mehrzeilige Zeichenfolge, die Zeile des anfänglichen Zombies (0-indiziert) und die Spalte des anfänglichen Zombies (0-indiziert) enthält. Probieren Sie es online!
Wie?
Da Pip eine zyklische Indizierung hat (normalerweise eine gute Sache, aber für dieses Problem eine schlechte, weil die Kartenränder nicht umbrochen werden sollen), habe ich mich für eine Regex-Ersatzlösung entschieden.
Ya@?n
Findet den Index der ersten neuen Zeile (dh die Breite des Gitters) und zieht ihn hineiny
.(ac+b+b*Ya@?n):'%
Berechnet(width + 1) * row + col
, dhc+b+b*y
und setzt das Zeichen an diesem Index auf%
.L2*#a
Schleifen2*len(a)
, die uns genügend Iterationen geben, damit sich die Flutfüllung vollständig ausbreitet, und sicherstellen, dass die Iterationszahl gleichmäßig ist (das ist wichtig)..`#(.?.?.{`.y-1.`})?%`
Erstellt einen regulären Ausdruck, der mit einem#
gefolgt von einem%
Zeichen (entweder 0, width-1, width oder width + 1) übereinstimmt . (Die.
am Anfang.
im regulären Ausdruck vorgenommenen Anpassungen entsprechen Zeilenumbrüchen.) Dieser reguläre Ausdruck entspricht einer der folgenden Konfigurationen:aR ... '%.@>_
ersetzt Matches dieses regex mit dem Charakter%
zu voran.
alle , aber dem ersten Zeichen@>
des Spiels_
; kurz gesagt, ersetzen die#
mit%
.a:RV ...
kehrt das um und weist es wieder zua
. Wir kehren um, weil der reguläre Ausdruck nur vorher passt#
%
und nicht nachher in der Zeichenfolge . Wenn die Zeichenfolge umgekehrt wird, wird after zu before und wir können sie bei der nächsten Iteration abgleichen. Dies ist auch der Grund, warum die Anzahl der Iterationen gerade sein muss.Nachdem die Schleife abgeschlossen ist, geben wir einfach den geänderten Wert von zurück
a
.quelle
TSQL, 267 Bytes
Golf gespielt:
Ungolfed:
Versuch es
quelle
PHP,
209189188183 Byteskann golf sein
Laufen Sie mit
php -r '<code>' '<grid>' <y> <x>
quelle
J, 152 Bytes
Ich bin mir sicher, dass es keinen Weg gibt, die letzten Kontrollstrukturen zu entfernen.
Implementiert einen Flood-Fill-Algorithmus. Die Funktion g formatiert die Eingabe in ein Zeichenfeld, bevor f angewendet wird.
Beachten Sie, dass Koordinaten etwas seltsam sind:
ist die obere linke Ecke. Erhöhen der ersten Koordinate:
Verschiebt die Position in y-Richtung nach unten.
Ansonsten sind die Koordinaten normal.
Beispiel:
quelle