Avertissement: L'histoire racontée dans cette question est entièrement fictive et inventée uniquement dans le but de fournir une intro.
Je suis un mauvais fermier, et pour faire monter le prix du blé dans ma région, j'ai décidé de brûler les champs de tous les fermiers autour de moi. J'aimerais vraiment voir les champs s'enflammer (afin que je puisse utiliser mon rire diabolique et me frotter les mains avec joie), mais je ne veux pas non plus être pris en train de regarder, alors j'ai besoin de vous pour simuler le champ incinéré pour moi.
Ta tâche:
Écrivez un programme ou une fonction qui prend en entrée un champ et renvoie les étapes de sa gravure jusqu'à ce que le champ entier soit en cendres. Une section spécifique du champ qui est en feu est représentée par un entier représentant l'intensité de la flamme. Un incendie commence à "1" et passe à "2" puis à "3", et ainsi de suite. Une fois qu'un incendie atteint «4», il attrape directement (non en diagonale) les zones adjacentes qui sont inflammables en feu. Une fois qu'il atteint "8", il s'éteint à la prochaine itération et se transforme en cendre, représentée par un "A". Lorsqu'une zone n'a pas encore été touchée par le feu, elle est représentée par un "0". Par exemple, si le champ ressemble à ceci:
100
000
Votre programme devrait produire ceci:
100
000
200
000
300
000
410
100
520
200
630
300
741
410
852
520
A63
630
A74
741
A85
852
AA6
A63
AA7
A74
AA8
A85
AAA
AA6
AAA
AA7
AAA
AA8
AAA
AAA
Si vous le souhaitez, vous pouvez remplacer les symboles ci-dessus par tout ensemble de symboles que vous choisissez, à condition qu'ils soient cohérents et distincts les uns des autres.
Contribution:
La position de départ du champ, sous n'importe quelle forme standard, telle qu'une chaîne délimitée par un retour à la ligne comme ci-dessus.
Sortie:
Le champ à chaque itération lors de sa gravure, soit sous forme de tableau, soit sous forme de chaîne délimitée par un caractère.
Cas de test:
0301
000A
555
|
v
0301
000A
555
1412
010A
666
2523
020A
777
3634
030A
888
4745
141A
AAA
5856
252A
AAA
6A67
363A
AAA
7A78
474A
AAA
8A8A
585A
AAA
AAAA
6A6A
AAA
AAAA
7A7A
AAA
AAAA
8A8A
AAA
AAAA
AAAA
AAA
Notation:
C'est le code-golf , le score le plus bas en octets gagne!
la source
Réponses:
APL (Dyalog) , 52 octets *
Suppose
⎕IO←0
que c'est la valeur par défaut sur de nombreux systèmes. Prend le champ en utilisant 0 pour les emplacements vides, 1 pour le champ non allumé, 2 pour le nouveau feu, 5 pour propager le feu et 10 pour les cendres. L'entrée doit être d'au moins 3 × 3, ce qui n'est pas un problème car des lignes et des colonnes supplémentaires peuvent être complétées par des zéros (espaces au format OP).Essayez-le en ligne!
Mon format rend difficile la vérification de l'exactitude, alors voici une version avec pré et post-traitement supplémentaire pour traduire à partir du format OP.
⍣{
…}
Répéter jusqu'à:⍺
la prochaine génération≡
est identique à⎕←⍵
la génération actuelle, sortie{
…}⌺3 3
Remplace chaque cellule par le résultat de cette fonction appliquée à son voisinage de Moore:,⍵
défiler (aplatir) l'argument; donne une liste de neuf élémentsr←
affecter à r4⊃
choisissez le quatrième élément; le centre, c'est-à-dire la valeur de cellule d'originec←
affecter à c1=
est-ce égal à cela?:
si oui, alors:⍳2
premier à ɩ ntegers; 0 19⍴
r Eshape à la longueur de neuf; 0 1 0 1 0 1 0 1 0r/⍨
utiliser cela pour filtrer r (cela n'obtient que les voisins orthogonaux)4∊
est-ce que quatre en sont membres? (c.-à-d. y aura-t-il un cinq dans la prochaine génération?)1+
ajoute un; 1 si pas pris feu ou 2 si pris feu⋄
sinon (c'est-à-dire que la valeur actuelle est 0 ou ≥ 2)×c
le signum de cc+
c plus cela (c.-à-d. augmenter d'une unité en cas d'incendie)10⌊
minimum de dix et cela (car les cendres ne brûlent pas)* Dans Dyalog Classic, utilisez
⎕U233A
au lieu de⌺
.la source
fire '0A000\n0A0A0\n0A0A0\n000A1'
fonctionne parfaitement sur le formaté, mais je ne peux pas obtenir un équivalent pour travailler avec le premier lien. Je fais probablement quelque chose de mal. Cela ne fonctionne pas pour moi:f ↑(0 0 0)(0 1 0)(0 0 0)
Python 3 , 232 octets
Essayez-le en ligne!
-3 octets grâce à officialaimm en fusionnant l'autre lambda dans
f
(semble désordonné mais économise les octets et c'est tout ce qui nousimporte ) -8 octets grâce à M. Xoder
-26 octets grâce aux ovs
-6 octets grâce à ppperry
la source
JavaScript (ES6),
217210207204193192190 octetsSauvegardé 2 octets grâce à la suggestion de @ Shaggy d'utiliser
9
asA
.Utilise
9
au lieu deA
. Entrée sous forme de tableau 2D d'entiers. Sortie sous forme de tableau de ces tableaux.la source
9
au lieu deA
?Simuler le monde (en Emoji) , 1407 octets?
N'aimez-vous pas utiliser une explication explorable comme langage de programmation? L'inconvénient est qu'il n'y a généralement pas de programme très bien défini, donc dans ce cas, j'utilise le JSON qu'il exporte. (si vous avez de meilleures idées, faites le moi savoir)
Essayez-le ici ou ici:
la source
Rétine ,
1039688 octetsEssayez-le en ligne!Utilise la
9
cendre; cela peut être changé à un coût de 4 octets en utilisantT`1-8`2-8A
. Edit: sauvé 6 octets grâce à @MartinEnder. Explication:Ajoutez un séparateur pour que les sorties ne se rencontrent pas. (Aide également lors de la correspondance ci-dessous.)
N'imprimez pas l'état final (qui est le même que l'état précédent qui a déjà été imprimé). Répétez jusqu'à ce que la passe ne change pas l'état. Imprime l'état actuel avant chaque passage.
Faites avancer l'intensité de tout le feu.
Allumez les champs non éclairés selon le cas. Sous-explication:
Mesurez le numéro de colonne de ce champ éteint.
Faites correspondre le champ non éclairé.
Recherchez un champ approprié à droite.
Recherchez un champ approprié dans la même colonne (en utilisant un groupe d'équilibrage) dans la ligne ci-dessous. Notez que si l'entrée pouvait être garantie rectangulaire, cela pourrait être simplifié
|.*¶(?>(?<-1>.)*)4
pour une économie de 3 octets.Recherchez un champ approprié à gauche. (Puisque nous regardons du côté droit du champ, nous voyons également le champ non éclairé.)
Recherchez un champ approprié dans la même colonne de la ligne ci-dessus. Dans la mesure où il s'agit d'une correspondance et donc d'une correspondance de droite à gauche, la condition du groupe d'équilibrage doit apparaître avant les colonnes qui ont été mises en correspondance par le groupe d'équilibrage.
la source
Perl 5 , 365 octets
Essayez-le en ligne!
Utilise «9» au lieu de «A» pour indiquer un emplacement brûlé.
Expliqué
la source
Haskell , 162 octets
Essayez-le en ligne! Utilisation:
h
prend un champ comme une liste de lignes et renvoie une liste de champs. Un champ non brûlé est indiqué par@
et cendres par9
, les différents feux sont les chiffres1
à8
.f
gère la propagation du feu de gauche à droite en remplaçant tous les@
champs non brûlés qui sont à droite d'un3
champ en feu par0
.i
incrémente chaque chiffre tant qu'il est inférieur à9
.g
s'appliquef
à chaque ligne, puis inverse la ligne, s'applique àf
nouveau et inverse. Ensuite, la liste des lignes est transposée et à nouveau sur chaque ligne et son inversef
est appliqué.h
s'appliqueg
à l'entrée jusqu'à ce qu'elle ne change plus et recueille les résultats.la source
_
. Si ce n'est pas acceptable, je crains de devoir supprimer la réponse, car elle est centrée sur l'utilisation detranspose
et je ne vois pas de moyen de le corriger facilement sans introduire des tonnes d'octets.C (gcc) ,
308305299297295291 octetsCe programme définit une fonction qui prend deux entrées, un pointeur vers un tableau de chaînes précédé de sa longueur, comme le permet cette entrée / sortie par défaut. Sorties vers STDOUT avec une nouvelle ligne de fin.
Essayez-le en ligne!
la source
80
.A
s, mais apparemment j'ai supposé faux. Quoi qu'il en soit, merci pour l'information. C'est réparé maintenant.Octave,
7269 octetsL'entrée est considérée comme un tableau 2D de nombres et les espaces vides marqués d'un
Inf
.'A'
a été remplacé par9
. Les résultats intermédiaires (sous forme de tableau de nombres) sont imprimés implicitement.Essayez-le en ligne!
Explication:
Dans une boucle, la fonction
imdilate
(dilatation morphologique de l'image) de l'ensemble d'images est utilisée pour simuler la propagation du feu.la source
[0 Inf 0 0 0;0 Inf 0 Inf 0;0 Inf 0 Inf 0;0 0 0 Inf 1]
- Very NicePython 2 , 325 octets
f
prend l'entrée comme un tableau 2D d'entiers et les espaces vides marqués avec''
.'A'
a été remplacé par9
. La fonction génère un générateur de tous les champs dans le temps dans le même format.Essayez-le en ligne!
la source
Octave , 212 octets
Pour exécuter, spécifiez un tableau de caractères tel que:
... alors fais:
Explication du code à suivre ...
Essayez-le en ligne!
Remarque: J'ai essayé d'exécuter ce code avec tio.run , mais je n'obtenais aucune sortie. J'ai dû utiliser un autre service.
la source
PHP,
226 212 210 209 185177 177 octetsprend une entrée avec un retour à la ligne à partir d'un fichier nommé
m
;9
pour les cendres.Courez avec
-nr
ou essayez-le en ligne .première approche: PHP 7.0, 209 octets
prend une entrée avec un retour à la ligne à partir d'un fichier nommé
m
.Courir avec
-nr
ou essayez-le en ligne .Notes de version PHP (pour l'ancienne approche)
$c-4|
par$g[$y+$p=[1,0,-1][$a]][$q+=$x]!="0"||$g[$y+$p][$q]=1;
[1,0,-1][$a]
par$a%2*~-($a&2)
a&$c
par""<$c
,+$c
par0<$c
et$c-4
par$c!=4
la source
Octave,
419312 octetsEssayez-le en ligne!
Ceci est ma version, cela fonctionne, alors maintenant j'ai encore besoin de jouer au golf. Je pense que cela peut être beaucoup plus court si je trouve un moyen de trouver les indices des 4 dans une matrice, mais je ne sais pas comment.
PS: A est un 9 dans mon code.
la source
endif
endfor
etendwhile
vous pouvez écrireend
Pochoir (
∊
-mode) , 22 octetsEssayez-le en ligne!
Tout comme dans l'entrée de test, utilisez des entiers séparés par des espaces pour
0
-8
,' '
pour les blancs et'A'
pourA
. N'oubliez pas d'ajouter également des blancs de fin.la source