Descargo de responsabilidad: La historia contada dentro de esta pregunta es completamente ficticia e inventada únicamente con el propósito de proporcionar una introducción.
Soy un granjero malvado, y para aumentar el precio del trigo en mi área, he decidido quemar los campos de todos los granjeros que me rodean. Realmente me gustaría ver que los campos se incendiaran (para poder usar mi risa malvada y frotar mis manos con alegría), pero tampoco quiero que me atrapen observando, así que necesito que simules que el campo está siendo incinerado por mi
Tu tarea:
Escriba un programa o función que tome como entrada un campo y devuelva las etapas de grabación hasta que todo el campo sea ceniza. Una sección específica del campo que está en llamas está representada por un número entero que representa la intensidad de la llama. Un incendio comienza en "1" y pasa a "2" y luego a "3", y así sucesivamente. Una vez que el fuego alcanza "4", atrapa cualquier área adyacente directa (no diagonal) que sea inflamable en el fuego. Una vez que alcanza "8", se quema en la siguiente iteración y se convierte en ceniza, representada por una "A". Cuando un área aún no ha sido tocada por el fuego, se representa con un "0". Por ejemplo, si el campo se ve así:
100
000
Su programa debería generar esto:
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 lo desea, puede reemplazar los símbolos anteriores con cualquier conjunto de símbolos que elija, siempre que sean consistentes y distintos entre sí.
Entrada:
La posición inicial del campo, en cualquier forma estándar, como una cadena delimitada con una nueva línea como se indicó anteriormente.
Salida:
El campo en cada iteración a medida que se quema, ya sea como una matriz o como una cadena delimitada por algún carácter.
Casos de prueba:
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
Tanteo:
Este es el código de golf , ¡el puntaje más bajo en bytes gana!
fuente
Respuestas:
APL (Dyalog) , 52 bytes *
Asume
⎕IO←0
cuál es el valor predeterminado en muchos sistemas. Toma el campo usando 0 para espacios vacíos, 1 para campo que no se quema, 2 para fuego nuevo, 5 para propagación de fuego y 10 para cenizas. La entrada debe ser al menos 3 × 3, lo cual no es un problema ya que las filas y columnas adicionales pueden rellenarse con ceros (espacios en formato OP).Pruébalo en línea!
Mi formato hace que sea difícil verificar la corrección, por lo que aquí hay una versión con procesamiento previo y posterior agregado para traducir desde y hacia el formato de OP.
⍣{
...}
repite hasta:⍺
la próxima generación≡
es idéntico a⎕←⍵
la generación actual, producida{
...}⌺3 3
reemplace cada celda con el resultado de esta función aplicada a su vecindario Moore:,⍵
descifrar (aplanar) el argumento; da una lista de nueve elementosr←
asignar a r4⊃
escoge el cuarto elemento; el centro, es decir, el valor de celda originalc←
asignar a c1=
es uno igual a eso?:
si es así, entonces:⍳2
primero en encontrar dedos; 0 19⍴
r forma de longitud nueve; 0 1 0 1 0 1 0 1 0r/⍨
use eso para filtrar r (esto solo obtiene los vecinos ortogonales)4∊
es cuatro un miembro de eso? (es decir, ¿habrá cinco en la próxima generación?)1+
Agrega uno; 1 si no se incendió o 2 si se incendió⋄
más (es decir, el valor actual es 0 o ≥ 2)×c
el signo de cc+
c más eso (es decir, aumentar en uno si está en llamas)10⌊
mínimo de diez y eso (ya que la ceniza no se quema)* En Dyalog Classic, usando en
⎕U233A
lugar de⌺
.fuente
fire '0A000\n0A0A0\n0A0A0\n000A1'
funciona perfectamente en el formateado, pero no puedo obtener un equivalente para trabajar con el primer enlace. Probablemente estoy haciendo algo mal. Esto no funciona para mí:f ↑(0 0 0)(0 1 0)(0 0 0)
Python 3 , 232 bytes
Pruébalo en línea!
-3 bytes gracias a officialaimm al fusionar el otro lambda en
f
(parece desordenado pero guarda bytes y eso es todo lo que nos importa)-8 bytes gracias al Sr. Xoder
-26 bytes gracias a ovs
-6 bytes gracias a ppperry
fuente
JavaScript (ES6),
217210207204193192190 bytesAhorró 2 bytes gracias a la sugerencia de @ Shaggy de usar
9
comoA
.Usos en
9
lugar deA
. Ingrese como una matriz 2D de enteros. Salida como una matriz de tales matrices.fuente
9
lugar deA
?Simulando el mundo (en Emoji) , 1407 bytes?
¿No te encanta usar una explicación explorable como lenguaje de programación? La desventaja de esto es que generalmente no hay un programa muy bien definido, por lo que en este caso, estoy usando el JSON que exporta. (si tienes alguna idea mejor, házmelo saber)
Pruébalo aquí o aquí:
fuente
Retina ,
1039688 bytesPruébalo en línea! Usos
9
para cenizas; esto se puede cambiar a un costo de 4 bytes usandoT`1-8`2-8A
. Editar: Guardado 6 bytes gracias a @MartinEnder. Explicación:Agregue un separador para que las salidas no se encuentren entre sí. (También ayuda cuando coincide a continuación).
No imprima el estado final (que es el mismo que el estado anterior que ya se ha impreso). Repita hasta que el pase no cambie el estado. Imprima el estado actual antes de cada pase.
Avanza la intensidad de todo el fuego.
Encienda los campos apagados según corresponda. Subexplicación:
Mida el número de columna de este campo apagado.
Empareja el campo apagado.
Busque un campo adecuado a la derecha.
Busque un campo adecuado en la misma columna (usando un grupo de equilibrio) en la línea a continuación. Tenga en cuenta que si la entrada pudiera garantizarse rectangular entonces esto podría simplificarse
|.*¶(?>(?<-1>.)*)4
para un ahorro de 3 bytes.Busque un campo adecuado a la izquierda. (Dado que estamos mirando desde el lado derecho del campo, también vemos el campo apagado).
Busque un campo adecuado en la misma columna en la línea de arriba. Como se trata de una observación retrospectiva y, por lo tanto, de una coincidencia de derecha a izquierda, la condición del grupo de equilibrio debe aparecer antes de las columnas que el grupo de equilibrio ha hecho coincidir.
fuente
Perl 5 , 365 bytes
Pruébalo en línea!
Utiliza '9' en lugar de 'A' para indicar una ubicación quemada.
Explicado
fuente
Haskell , 162 bytes
Pruébalo en línea! Uso:
h
toma un campo como una lista de líneas y devuelve una lista de campos. Un campo sin quemar se indica mediante@
y cenizas por9
, los diferentes incendios son los dígitos1
a8
.f
gestiona la propagación del fuego de izquierda a derecha mediante la sustitución de todos los@
campos no quemados que están justo en un3
campo en llamas con0
.i
incrementa cada dígito siempre que sea menor que9
.g
aplicaf
a cada línea, luego invierte la línea, aplicaf
nuevamente y revierte. Luego se transpone la lista de líneas y nuevamente en cada línea yf
se aplica su reverso .h
se aplicag
a la entrada hasta que ya no cambie y recopile los resultados.fuente
_
. Si esto no es aceptable, me temo que tendría que eliminar la respuesta, ya que se centra en el uso detranspose
y no veo una manera de solucionarlo fácilmente sin introducir toneladas de bytes.C (gcc) ,
308305299297295291 bytesEste programa define una función que toma dos entradas, un puntero a una matriz de cadenas precedidas por su longitud, según lo permitido por este valor predeterminado de E / S. Salidas a STDOUT con una nueva línea final.
Pruébalo en línea!
fuente
80
.A
s, pero aparentemente asumí mal. De todos modos, gracias por la información. Ya está arreglado.Octava,
7269 bytesLa entrada se toma como una matriz 2D de números y puntos vacíos marcados con
Inf
.'A'
ha sido reemplazado por9
. Resultados intermedios (como conjunto de números) impresos implícitamente.Pruébalo en línea!
Explicación:
En un bucle, la función
imdilate
(dilatación de la imagen morfológica) del paquete de imágenes se utiliza para simular la propagación del fuego.fuente
[0 Inf 0 0 0;0 Inf 0 Inf 0;0 Inf 0 Inf 0;0 0 0 Inf 1]
- Muy agradablePython 2 , 325 bytes
f
toma la entrada como una matriz 2D de enteros y espacios vacíos marcados con''
.'A'
ha sido reemplazado por9
. La función genera un generador de todos los campos a lo largo del tiempo en el mismo formato.Pruébalo en línea!
fuente
Octava , 212 bytes
Para ejecutar, especifique una matriz de caracteres como:
... entonces hazlo:
Explicación del código a seguir ...
Pruébalo en línea!
Nota: Traté de ejecutar este código con tio.run , pero no obtuve ningún resultado. Tuve que usar otro servicio.
fuente
PHP,
226 212 210 209 185177 bytestoma entrada con una nueva línea final de un archivo llamado
m
;9
para las cenizasEjecutar
-nr
o probarlo en línea .primer enfoque: PHP 7.0, 209 bytes
toma entrada con una nueva línea final de un archivo llamado
m
.Ejecutar
-nr
o probarlo en línea .Notas de la versión de PHP (para un enfoque antiguo)
$c-4|
con$g[$y+$p=[1,0,-1][$a]][$q+=$x]!="0"||$g[$y+$p][$q]=1;
[1,0,-1][$a]
con$a%2*~-($a&2)
a&$c
con""<$c
,+$c
con0<$c
y$c-4
con$c!=4
fuente
Octava,
419312 bytesPruébalo en línea!
Esta es mi versión que funciona, así que ahora todavía necesito jugar golf. Creo que puede ser mucho más corto si encuentro una manera de encontrar los índices de los 4 en una matriz, pero no sé cómo.
PD: A es un 9 en mi código.
fuente
endif
endfor
yendwhile
puedes escribirend
Plantilla (
∊
modo) , 22 bytesPruébalo en línea!
Al igual que en la entrada de prueba, use números enteros separados por espacios para
0
-8
,' '
para espacios en blanco y'A'
paraA
. Recuerde agregar espacios en blanco finales también.fuente