Introducción:
Antes de la tarea, esto es lo que hace cada elemento en el mapa:
Llanura ( X
): Esto no hace nada.
Tierra destruida ( -
): Esto es lo mismo que tierra llana, pero destruida por una bomba.
La bomba activa ( !
): en un mapa, esto destruirá todo en un cuadrado de 3x3:
XXXXX XXXXX
XXXXX X---X
XX!XX > will become > X---X
XXXXX X---X
XXXXX XXXXX
La bomba pasiva ( @
): no hace nada, hasta que es detonada por otra bomba. Esto también tiene un radio de explosión cuadrado de 3x3 :
XXXXX XXXXX
XXXXX XXXXX
XX@XX > will become > XX@XX (nothing happened)
XXXXX XXXXX
XXXXX XXXXX
Pero:
XXXXX XXXXX
XXXXX X---X
XX@XX > will become > ----X (both bombs have exploded)
X!XXX ----X
XXXXX ---XX
La bomba nuclear ( ~
): no hace nada, hasta que es detonada por otra bomba. La diferencia es que esta bomba tiene un radio de explosión cuadrado de 5x5 :
XXXXX XXXXX
XXXXX XXXXX
XX~XX > will become > XX~XX (nothing happened)
XXXXX XXXXX
XXXXX XXXXX
Pero:
XXXXX -----
XXXXX -----
XX~XX > will become > ----- (both bombs have exploded)
X!XXX -----
XXXXX -----
La tarea
- Dado un mapa de 9x9 , genera el mapa después de la reacción en cadena.
- Puede proporcionar una función o un programa.
- Este es el código de golf , por lo que gana el envío con la menor cantidad de bytes.
Casos de prueba
Caso de prueba 1 ( 3 pasos ):
XXXXXXXXX XXXXXXXXX
----XXXXX ----XXXXX
XXXX@XXXX XXXX@XXXX
XXXXXXXX- XXX---XX-
XXXX@XXXX > ------XXX
XXXXXXXX- ------XX-
XX~XXXXXX -----XXXX
X!XXXXXX- -----XXX-
XXXXXXXXX -----XXXX
Caso de prueba 2 ( 2 pasos ):
XXXXXXXXX XXXXXXXXX
XXXXXXXXX XXXXXXXXX
XX~XXXXXX XX~XXXXXX
--------- ---------
XXXX!XXXX > XXX---XXX
XXXXXXXXX XXX------
XXX@@X@!X XXX@@----
XXXXXXXXX XXXXX----
XXXXXXXXX XXXXXXXXX
Caso de prueba 3 ( 2 pasos ):
XXXXXXXXX XXXXXXXXX
XXXXXXXXX XXXXXXXXX
XX~XXXXXX XX~XXXXXX
XXXXXXXXX XXX---XXX
XXXX!XXXX > XXX---XXX
XXXXXXXXX XXX------
XXX@@X@!X XXX@@----
XXXXXXXXX XXXXX----
XXXXXXXXX XXXXXXXXX
Caso de prueba 4 ( 1 paso ):
XXXXXXXXX XXXXXXXXX
XXXX-XXXX XXXX-XXXX
XXXXXXXXX XXX---XXX
XX-X!X-XX XX-----XX
XXXXXXXXX > XXX---XXX
XX-----XX XX-----XX
XXXX-XXXX XXXX-XXXX
XXXXXXXXX XXXXXXXXX
XXXXXXXXX XXXXXXXXX
Caso de prueba 5 ( 9 pasos ):
!XXXXXXXX ---XXXXXX
X@XXXXXXX ----XXXXX
XX@XXXXXX -----XXXX
XXX@XXXXX X-----XXX
XXXX@XXXX > XX-----XX
XXXXX@XXX XXX-----X
XXXXXX@XX XXXX-----
XXXXXXX@X XXXXX----
XXXXXXXX@ XXXXXX---
Caso de prueba 6 ( 9 pasos ):
XX@@@XXXX ------XXX
XXXXXXXXX ------XXX
~XXXXXXXX ---XXXXXX
XXXXXXXXX ---XXXXXX
~XXXXXXXX > ---XXXXXX
XXXXXXXXX ---XXXXXX
~XXXXXXXX ---XXXXXX
@XXXXXXXX ---XXXXXX
!XXXXXXXX ---XXXXXX
Caso de prueba 7 ( 3 pasos ):
!XXXXXXXX ---XXXXXX
X@XXXXXXX ----XXXXX
XX@XXXXXX ----XXXXX
XXXXXXXXX X---X----
XXXXXX@@! > XXXXX----
XXXXXXXXX X---X----
XX@XXXXXX ----XXXXX
X@XXXXXXX ----XXXXX
!XXXXXXXX ---XXXXXX
Respuestas:
Matlab,
120111 bytesLa idea es la siguiente: Encuentra la bomba activa. Amplíe esta área a un cuadrado de 3x3. Encuentra nuevas bombas afectadas, amplía las áreas correspondientes al tamaño correspondiente y agrégalas al área previamente destruida. Repita esto suficientes veces (en mi caso tantas veces como tengamos caracteres de entrada, solo porque esa es la variante más corta) para asegurarnos de que llegamos a un punto estacionario (= no más bombas explosivas). Luego configure todo el área destruida
-
y muestre el resultado.Se supone que la entrada es una matriz de caracteres, p. Ej.
fuente
Retina ,
188168154152 bytesBytes contados como ISO 8859-1.
Pruébalo en línea!
Esto es más una prueba de concepto. Hay una cantidad horrible de duplicación entre bombas y bombas nucleares, de lo que trataré de deshacerme antes de agregar una explicación.Bueno, me deshice de esa duplicación, pero aumentó la complejidad significativamente, por lo que en realidad no resultó en grandes ahorros ...fuente
APL (Dyalog) , 56 caracteres o 62 bytes *
A mi colega Marshall se le ocurrió una solución elegante, 21 caracteres más corta que la mía:
Pruébalo en línea!
{
...}
función anónima donde el argumento está representado por ⍵'-'@(
…)⍵
Salta a las posiciones enmascaradas por la siguiente función tácita:'!'∘=
Booleano donde el signo de exclamación es igual al argumento(
...)⍣≡
aplique la siguiente función tácita hasta que nada más cambie:×∘(
...)
multiplicar por la siguiente constante:'~'=⍵
Booleano donde tilde es igual al argumento original(
...)+
a eso, agregue:'X'≠⍵
Booleano donde X es diferente del argumento original{
...}⌺5 5
para cada uno, aplique la siguiente función en el área 5 × 5 centrada en él:4↑1
tome los primeros cuatro elementos de uno, rellenando con ceros [1,0,0,0]1+
agregue uno [2,1,1,1]5⍴
remodelar cíclicamente en longitud cinco [2,1,1,1,2]∘.⌈⍨
mesa máxima consigo misma en ambos ejes⍵≥
Booleano donde los vecinos correspondientes son mayores o iguales que1∊
Booleano si alguno es cierto* Solo reemplácelo
⌺
por⎕U233A
debajo de Clásico para un solo byte por carácter.fuente
Disp
función nunca podría haber funcionado. Actualizado para ser un operador. Gracias.@
cuenta como 1 byte en el clásico? mi suposición es sí'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕
⎕io←0
Java,
574562558549525523 bytesfuente
'-'
pueden ser45
. AmbosMath.max(...,0)
pueden ser...>0?...:0
(se podría hacer lo mismoMath.min(...,9)
pero es exactamente la misma cantidad de bytes.for(int i=0;i<9;i++){int j=0;for(char c:q.nextLine().toCharArray())g[i][j++]=c;}for(int j=0;j<9;j++)for(int k=0;k<9;k++)if(g[j][k]==33)d(j,k,1);
Puede serint i=0,j;for(;i<9;i++){j=0;for(char c:q.nextLine().toCharArray())g[i][j++]=c;}for(i=0;i<9;i++)for(j=0;j<9;j++)if(g[i][j]<34)d(i,j,1);
. Y tal vez podría hacer una función fuera de él en lugar del programa.APL (Dyalog Classic) , 61 bytes
Pruébalo en línea!
a←⎕
evaluar la entrada y asignar aa
i←,⍳⍴a
los índices (pares de coordenadas) de todas las celdas('!'=,a)/
filtra solo las bombas inicialmente activas{ }⍣≡
realizar una transformación en la lista hasta que se estabilice'X@~-'⍳a[⍵]
sustituya 0 porX
, 1 por@
, etc., 4 por cualquier otra cosa (!
)3|
mod 3 para obtener el "radio" de impacto; debe ser mayor o igual que ...(↓⌈/¨|⍵∘.-i)≤
... Manhattan distancias entre celdas en la lista y todas las celdasi/⍨∨⌿↑
obtener una máscara de bits de las células afectadas y seleccionarlas dei
'-'@( )⊢a
poner-
en esas posicionesfuente