Pour simuler une invasion de zombies, commencez par une grille #
et représentant la carte:
## ##
### #
## ##
# ###
# ####
#
représente la terre.représente l'eau.
Les zombies commencent à un point de la carte ...
## ##
### #
## %#
# ###
# ####
... et se propager. %
désigne une terre infectée par des zombies.
Cependant, les zombies ne savent pas nager . Ils peuvent se déplacer à travers les terres de la même manière qu'un roi se déplace aux échecs - une case dans n'importe quelle direction diagonale ou orthogonale:
!!!
!%!
!!!
À la fin de la simulation, certains terrains seront infectés par des zombies:
%% ##
%%% #
%% %%
% %%%
# %%%%
Votre tâche consiste à simuler l'invasion de zombies. Écrivez un programme (ou une fonction) qui prend en entrée une chaîne représentant l'état initial de la grille et deux nombres représentant les coordonnées du zombie initial. Le programme devrait sortir (ou retourner) l'état final de l'invasion.
Caractéristiques
- Votre programme peut imprimer une nouvelle ligne de fin facultative.
- Vous pouvez supposer que l'entrée sera au format correct (avec des espaces), avec un retour à la ligne facultatif.
- Vous pouvez supposer que le zombie initial commencera sur terre et ne mourra pas immédiatement.
- Il s'agit de code-golf , donc la réponse la plus courte (en octets) l'emporte.
- -100% de bonus si votre code peut également résoudre le problème d'arrêt pour les machines de Turing arbitraires.
- Votre programme doit gérer des largeurs de carte pouvant atteindre 50 caractères.
la source
Réponses:
APL (Dyalog) , 44 octets
Essayez-le en ligne!
Suppose
⎕IO←0
.Argument de gauche: ligne 0 indexée
r
de%, colonne 0 indexéec
de%:r c
argument de droite: matrice de caractères
la source
Kotlin,
283218octetsLambda sans nom (avec une fonction imbriquée, heh).
Golfé
Non golfé
Quelques octets enregistrés en passant à une solution récursive.
la source
JavaScript (ES6), 144 octets
Où
\n
représente le caractère de nouvelle ligne littéral. Prend des coordonnées indexées 0.la source
Befunge,
324323 octetsEssayez-le en ligne!
Explication
L'implémentation de cela dans Befunge a été un peu compliquée car nous sommes limités à 80x25 caractères de "mémoire" qui doivent être partagés avec le code source lui-même. L'astuce pour ajuster une carte 50x50 dans cette zone était d'aplatir la carte 2D en un tableau 1D avec deux emplacements de carte par octet. Ce tableau 1D est ensuite à nouveau enveloppé dans un tableau 2D afin qu'il puisse tenir dans la largeur de 80 caractères du champ de jeu Befunge.
L'algorithme d'infection commence par convertir les coordonnées initiales en un décalage dans le tableau 1D qu'il pousse sur la pile. La boucle principale prend une valeur de la pile et recherche l'état de la carte pour ce décalage. S'il s'agit d'un terrain non infecté, il est marqué comme infecté et huit nouveaux décalages sont poussés sur la pile (représentant le terrain tout autour de la position actuelle). Ce processus se poursuit jusqu'à ce que la pile soit vide.
Pour éviter d'avoir à vérifier les valeurs hors plage, la carte est stockée avec une bordure d'eau à un caractère sur tous les bords.
la source
Pip , 59 octets
Fonction qui prend une chaîne multiligne, la ligne du zombie initial (indexé 0) et la colonne du zombie initial (indexée 0). Essayez-le en ligne!
Comment?
Parce que Pip a une indexation cyclique (généralement une bonne chose, mais mauvaise pour ce problème parce que nous ne voulons pas que les bords de la carte soient encapsulés), j'ai opté pour une solution de remplacement d'expression régulière.
Ya@?n
trouve l'index de la première nouvelle ligne (c.-à-d. la largeur de la grille) et le retirey
.(ac+b+b*Ya@?n):'%
après avoir fait ce qui précède, calcule(width + 1) * row + col
, c'est-à-direc+b+b*y
, et définit le caractère de cet index sur%
.L2*#a
Loops2*len(a)
Times, ce qui nous donne suffisamment d'itérations pour que le remplissage de l'inondation se propage entièrement et assure que le nombre d'itérations est pair (c'est important)..`#(.?.?.{`.y-1.`})?%`
construit une expression régulière qui correspond à un#
suivi d'un%
, avec 0, largeur-1, largeur ou largeur + 1 caractères entre les deux. (Le.
début fait.
le regex correspond aux nouvelles lignes.) Ce regex correspond à l'une des configurations suivantes:aR ... '%.@>_
remplace les correspondances de cette expression régulière par le caractère%
ajouté à.
tous sauf le premier caractère@>
de la correspondance_
; bref, remplacer le#
par%
.a:RV ...
inverse cela et le réattribuea
. Nous inversons parce que l'expression régulière ne correspond#
qu'avant%
dans la chaîne, pas après; mais lorsque la chaîne est inversée, après devient avant et nous pouvons le faire correspondre à la prochaine itération. C'est aussi pourquoi le nombre d'itérations doit être pair.Une fois la boucle terminée, nous renvoyons simplement la valeur modifiée de
a
.la source
TSQL, 267 octets
Golfé:
Non golfé:
Essaye le
la source
PHP,
209189188183 octetspeut être jouable au golf
Courir avec
php -r '<code>' '<grid>' <y> <x>
la source
J, 152 octets
Pas très bien joué au golf, je suis sûr qu'il existe un moyen de supprimer ces dernières structures de contrôle.
Implémente un algorithme de remplissage d'inondation. La fonction g formate l'entrée dans un tableau de caractères avant d'appliquer f.
Notez que les coordonnées sont un peu bizarres:
est le coin supérieur gauche. Augmenter la première coordonnée:
Déplace la position vers le bas dans la direction y.
À part cela, les coordonnées sont normales.
Exemple:
la source