Reacción en cadena de bombas

32

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 , 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
Adnan
fuente
44
Mi respuesta es significativamente más corta que la aceptada.
Adám
¿Puede basar parte de un taller en este desafío?
Adám

Respuestas:

10

Matlab, 120 111 bytes

function f=c(f);c=@(x,i)conv2(x+0,ones(i),'s');a=c(f<34,3);for k=f;a=c(a&f<65,3)|a;a=c(a&f>99,5)|a;end;f(a)='-'

La convolución es la clave del éxito.

La 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.

['!XXXXXXXX';
'X@XXXXXXX';
'XX@XXXXXX';
'XXX@XXXXX';
'XXXX@XXXX';
'XXXXX@XXX';
'XXXXXX@XX';
'XXXXXXX@X';
'XXXXXXXX@'];
falla
fuente
10

Retina , 188 168 154 152 bytes

Bytes contados como ISO 8859-1.

+Tm`@~X!:`!:\-`(.)?.?.(.?(?<1>.)?)(?<=(:|(?(1)_)!|^(?(5)_)(?<-5>.)*(:|(?(1)_)!)(?<1>.*¶)?.*¶(.)*.|(?=(.)*¶.*(?<1>¶.*)?(:|(?(1)_)!)(?<-6>.)*(?(6)_)$))\2)

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 ...

Martin Ender
fuente
6

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:

{'-'@(({1∊⍵≥∘.⌈⍨51+41}⌺5 5×∘(('X'≠⍵)+'~'=⍵))⍣≡'!'∘=)⍵}

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 que

    1∊ Booleano si alguno es cierto


* Solo reemplácelo por ⎕U233A debajo de Clásico para un solo byte por carácter.

Adán
fuente
en el enlace tio, la entrada (a la izquierda de ">") es lo mismo que la salida (a la derecha de ">"), ¿se supone que debe verse así?
ngn
@ngn Muy bien visto. La Dispfunción nunca podría haber funcionado. Actualizado para ser un operador. Gracias.
Adám
... y una pregunta: ¿ @cuenta como 1 byte en el clásico? mi suposición es sí
ngn
@ngn Sí.
Adám
'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕⎕io←0
He
4

Java, 574 562 558 549 525 523 bytes

import java.util.*;interface B{static char[][]g=new char[9][9];static void d(int i,int j,int r){g[i][j]=45;for(int x=Math.max(i-r,0);x<Math.min(i+r+1,9);x++)for(int y=Math.max(j-r,0);y<Math.min(j+r+1,9);y++)if(g[x][y]==64){d(x,y,1);}else if(g[x][y]>99){d(x,y,2);}else g[x][y]=45;}static void main(String[]a){Scanner q=new Scanner(System.in);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);for(char[]z:g)System.out.println(z);}}
SuperJedi224
fuente
Sé que ha pasado bastante tiempo desde que publicaste esto. Pero puedes jugar al golf algunas cosas: ambas '-'pueden ser 45. Ambos Math.max(...,0)pueden ser ...>0?...:0(se podría hacer lo mismo Math.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 ser int 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.
Kevin Cruijssen
1

APL (Dyalog Classic) , 61 bytes

'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕

Pruébalo en línea!

a←⎕ evaluar la entrada y asignar a a

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 por X, 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 celdas

  • i/⍨∨⌿↑ obtener una máscara de bits de las células afectadas y seleccionarlas de i

'-'@( )⊢aponer -en esas posiciones

ngn
fuente