Reação em cadeia de bombas

32

Introdução:

Antes da tarefa, eis o que todo elemento faz no mapa:

Terra plana ( X): Isso não faz nada.

Terra destruída ( -): é o mesmo que terra plana, mas destruída por uma bomba.

A bomba ativa ( !): em um mapa, isso destruirá tudo em um quadrado 3x3:

XXXXX                         XXXXX
XXXXX                         X---X
XX!XX     > will become >     X---X
XXXXX                         X---X
XXXXX                         XXXXX

A bomba passiva ( @): Não faz nada até ser detonada por outra bomba. Isso também tem um raio de explosão quadrado de 3x3 :

XXXXX                         XXXXX
XXXXX                         XXXXX
XX@XX     > will become >     XX@XX (nothing happened)
XXXXX                         XXXXX
XXXXX                         XXXXX

Mas:

XXXXX                         XXXXX
XXXXX                         X---X
XX@XX     > will become >     ----X (both bombs have exploded)
X!XXX                         ----X
XXXXX                         ---XX

A bomba nuclear ( ~): Não faz nada, até que seja detonada por outra bomba. A diferença é que esta bomba tem um raio de explosão quadrado de 5x5 :

XXXXX                         XXXXX
XXXXX                         XXXXX
XX~XX     > will become >     XX~XX (nothing happened)
XXXXX                         XXXXX
XXXXX                         XXXXX

Mas:

XXXXX                         -----
XXXXX                         -----
XX~XX     > will become >     ----- (both bombs have exploded)
X!XXX                         -----
XXXXX                         -----

A tarefa

  • Dado um mapa 9x9 , produza o mapa após a reação em cadeia.
  • Você pode fornecer uma função ou um programa.
  • Isso é , então a submissão com a menor quantidade de bytes ganha!

Casos de teste

Caso de teste 1 ( 3 etapas ):

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 teste 2 ( 2 etapas ):

XXXXXXXXX           XXXXXXXXX
XXXXXXXXX           XXXXXXXXX
XX~XXXXXX           XX~XXXXXX
---------           ---------
XXXX!XXXX     >     XXX---XXX
XXXXXXXXX           XXX------
XXX@@X@!X           XXX@@----
XXXXXXXXX           XXXXX----
XXXXXXXXX           XXXXXXXXX

Caso de teste 3 ( 2 etapas ):

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 teste 4 ( 1 etapa ):

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 teste 5 ( 9 etapas ):

!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 teste 6 ( 9 etapas ):

XX@@@XXXX           ------XXX
XXXXXXXXX           ------XXX
~XXXXXXXX           ---XXXXXX
XXXXXXXXX           ---XXXXXX
~XXXXXXXX     >     ---XXXXXX
XXXXXXXXX           ---XXXXXX
~XXXXXXXX           ---XXXXXX
@XXXXXXXX           ---XXXXXX
!XXXXXXXX           ---XXXXXX

Caso de teste 7 ( 3 etapas ):

!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
fonte
4
Minha resposta é significativamente mais curta que a aceita.
Adám
Pode basear parte de um workshop neste desafio?
Adám 03/07

Respostas:

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)='-'

Convolução é a chave do sucesso.

A idéia é a seguinte: Encontre a bomba ativa. Amplie esta área para um quadrado 3x3. Encontre novas bombas afetadas, amplie as áreas correspodificadoras para o tamanho correspondente e adicione-as à área destruída anteriormente. Repita isso várias vezes (no meu caso, quantas vezes tivermos caracteres de entrada, apenas porque essa é a variante mais curta) para garantir que atingimos um ponto estacionário (= não há mais bombas explosivas). Em seguida, defina toda a área destruída para -e exiba o resultado.

A entrada é assumida como uma matriz de caracteres, por exemplo

['!XXXXXXXX';
'X@XXXXXXX';
'XX@XXXXXX';
'XXX@XXXXX';
'XXXX@XXXX';
'XXXXX@XXX';
'XXXXXX@XX';
'XXXXXXX@X';
'XXXXXXXX@'];
flawr
fonte
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)

Experimente online!

Isso é mais uma prova de conceito. Há uma quantidade horrível de duplicação entre bombas e bombas nucleares, da qual tentarei me livrar antes de adicionar uma explicação. Bem, eu me livrei dessa duplicação, mas aumentou significativamente a complexidade, para que não resultasse em grandes economias ...

Martin Ender
fonte
6

APL (Dyalog) , 56 caracteres ou 62 bytes *

Meu colega Marshall apresentou uma solução elegante, 21 caracteres menor que a minha:

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

Experimente online!

{} Função anônima em que o argumento é representado por

'-'@()⍵Traço nas posições mascaradas pela seguinte função tácita:

  '!'∘= Booleano onde o ponto de exclamação é igual ao argumento

  ()⍣≡ Aplique a seguinte função tácita até que nada mais mude:

   ×∘() Multiplique pela seguinte constante:

    '~'=⍵ Booleano onde til é igual ao argumento original

    ()+ Para isso, adicione:

     'X'≠⍵ Booleano em que X é diferente do argumento original

   {}⌺5 5 Para cada um, aplique a seguinte função na área 5 × 5 centralizada:

    4↑1 pegue os quatro primeiros elementos de um, preenchendo com zeros [1,0,0,0]

    1+ adicione um [2,1,1,1]

    5⍴ remodelar ciclicamente no comprimento cinco [2,1,1,1,2]

    ∘.⌈⍨ mesa máxima consigo nos dois eixos

    ⍵≥ Booleano em que os vizinhos correspondentes são maiores ou iguais aos

    1∊ Booleano se algum for verdadeiro


* Basta substituir com ⎕U233A sob clássico para um único byte por caractere.

Adão
fonte
no link tio, a entrada (à esquerda de ">") é igual à saída (à direita de ">"), deve parecer com isso?
ngn
Bem visto. A Dispfunção nunca poderia ter funcionado. Atualizado para ser um operador. Obrigado.
Adám 25/09/17
... e uma pergunta: @conta como 1 byte no clássico? meu palpite é sim
ngn
@ngn Sim.
Adám 25/09
aqui está uma idéia para 61 bytes: '-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕( ⎕io←0)
ngn
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
fonte
Eu sei que já faz um bom tempo desde que você postou isso. Mas você pode jogar golfe algumas coisas: ambas '-'podem ser 45. Ambos Math.max(...,0)podem ser ...>0?...:0(mesmo poderia ser feito com Math.min(...,9), mas é exatamente a mesma quantidade 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);Pode 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);E talvez você poderia fazer uma função fora dele, em vez de programa..
Kevin Cruijssen
1

APL (Dyalog Classic) , 61 bytes

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

Experimente online!

a←⎕ avaliar a entrada e atribuir a a

i←,⍳⍴a os índices (pares de cordas) de todas as células

('!'=,a)/ filtrar apenas as bombas inicialmente ativas

{ }⍣≡ realizar uma transformação na lista até estabilizar

  • 'X@~-'⍳a[⍵]substitua 0 por X, 1 por @, etc, 4 por qualquer outra coisa ( !)

  • 3|mod 3 para obter o "raio" do impacto; deve ser maior ou igual ao ...

  • (↓⌈/¨|⍵∘.-i)≤ ... Manhattan distâncias entre as células da lista e todas as células

  • i/⍨∨⌿↑ obtenha bitmask de quais células são afetadas e selecione aquelas de i

'-'@( )⊢acolocar -nessas posições

ngn
fonte