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 é código-golfe , 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
Respostas:
Matlab,
120111 bytesA 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
fonte
Retina ,
188168154152 bytesBytes contados como ISO 8859-1.
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 ...fonte
APL (Dyalog) , 56 caracteres ou 62 bytes *
Meu colega Marshall apresentou uma solução elegante, 21 caracteres menor que a minha:
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 aos1∊
Booleano se algum for verdadeiro* Basta substituir
⌺
com⎕U233A
sob clássico para um único byte por caractere.fonte
Disp
função nunca poderia ter funcionado. Atualizado para ser um operador. Obrigado.@
conta como 1 byte no clássico? meu palpite é sim'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕
(⎕io←0
)Java,
574562558549525523 bytesfonte
'-'
podem ser45
. AmbosMath.max(...,0)
podem ser...>0?...:0
(mesmo poderia ser feito comMath.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 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);
E talvez você poderia fazer uma função fora dele, em vez de programa..APL (Dyalog Classic) , 61 bytes
Experimente online!
a←⎕
avaliar a entrada e atribuir aa
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 porX
, 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élulasi/⍨∨⌿↑
obtenha bitmask de quais células são afetadas e selecione aquelas dei
'-'@( )⊢a
colocar-
nessas posiçõesfonte