Reazione a catena di bombe


32

Introduzione:

Prima dell'attività, ecco cosa fa ogni elemento sulla mappa:

Plain land ( X): questo non fa nulla.

Terra distrutta ( -): è uguale alla terra normale, ma distrutta da una bomba.

La bomba attiva ( !): su una mappa, questo distruggerà tutto in un quadrato 3x3:

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

La bomba passiva ( @): non fa nulla, finché non viene fatta esplodere da un'altra bomba. Questo ha anche un raggio di esplosione quadrato 3x3 :

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

Ma:

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

The nuke ( ~): non fa nulla, finché non viene fatto esplodere da un'altra bomba. La differenza è che questa bomba ha un raggio di esplosione di 5x5 quadrati:

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

Ma:

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

L'obiettivo

  • Data una mappa 9x9 , emette la mappa dopo la reazione a catena.
  • È possibile fornire una funzione o un programma.
  • Questo è , quindi vince l'invio con il minor numero di byte!

Casi test

Caso di prova 1 ( 3 passaggi ):

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 di prova 2 ( 2 passaggi ):

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

Caso di prova 3 ( 2 passaggi ):

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 di prova 4 ( 1 passaggio ):

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 di prova 5 ( 9 passaggi ):

!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 di prova 6 ( 9 passaggi ):

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

Caso di prova 7 ( 3 passaggi ):

!XXXXXXXX           ---XXXXXX
X@XXXXXXX           ----XXXXX
XX@XXXXXX           ----XXXXX
XXXXXXXXX           X---X----
XXXXXX@@!     >     XXXXX----
XXXXXXXXX           X---X----
XX@XXXXXX           ----XXXXX
X@XXXXXXX           ----XXXXX
!XXXXXXXX           ---XXXXXX

4
La mia risposta è significativamente più breve di quella accettata.
Adám,

Può basare una parte di un seminario su questa sfida?
Adám,

Risposte:


10

Matlab, 120 111 byte

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 convoluzione è la chiave del successo.

L'idea è la seguente: trova la bomba attiva. Ingrandisci quest'area su un quadrato 3x3. Trova nuove bombe interessate, allarga le aree di ricodifica alla dimensione corrispondente e aggiungi quelle alla zona precedentemente distrutta. Ripeti abbastanza volte (nel mio caso quante volte abbiamo i caratteri di input, solo perché questa è la variante più breve) per essere sicuri di aver raggiunto un punto fermo (= non più bombe esplosive). Quindi impostare tutta l'area distrutta su -e visualizzare il risultato.

Si presume che l'input sia una matrice di caratteri, ad es

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

10

Retina , 188 168 154 152 byte

Byte conteggiati come ISO 8859-1.

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

Provalo online!

Questa è più una prova di concetto. C'è un'orribile quantità di duplicati tra bombe e bombe nucleari, che proverò a eliminare prima di aggiungere una spiegazione. Bene, mi sono sbarazzato di quella duplicazione ma ha aumentato significativamente la complessità, quindi non ha comportato risparmi enormi ...


6

APL (Dyalog) , 56 caratteri o 62 byte *

Il mio collega Marshall ha trovato una soluzione elegante, 21 caratteri più corti dei miei:

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

Provalo online!

{... } funzione anonima in cui l'argomento è rappresentato da

'-'@(... )⍵precipitare in posizioni mascherata dalla seguente funzione tacita:

  '!'∘= Booleano in cui il punto esclamativo è uguale all'argomento

  (... )⍣≡ applica la seguente funzione tacita fino a quando non cambia più nulla:

   ×∘(... ) moltiplicare per la seguente costante:

    '~'=⍵ Booleano dove tilde è uguale all'argomento originale

    (... )+ a ciò, aggiungi:

     'X'≠⍵ Booleano in cui X è diverso dall'argomento originale

   {... }⌺5 5 per ciascuno, applica la seguente funzione sull'area 5 × 5 centrata su di essa:

    4↑1 prende i primi quattro elementi di uno, riempiendo di zeri [1,0,0,0]

    1+ aggiungere uno [2,1,1,1]

    5⍴ rimodellare ciclicamente in lunghezza cinque [2,1,1,1,2]

    ∘.⌈⍨ tabella massima con se stessa su entrambi gli assi

    ⍵≥ Booleano dove i vicini corrispondenti sono maggiori o uguali a quello

    1∊ Booleano, se presente, è vero


* Basta sostituire con ⎕U233A in Classico per singolo byte per carattere.


nel link tio, input (a sinistra di ">") è uguale a output (a destra di ">"), dovrebbe essere simile a quello?
ngn,

@ngn Ben individuato. La Dispfunzione non avrebbe mai potuto funzionare. Aggiornato per essere un operatore. Grazie.
Adám,

... e una domanda: @conta come 1 byte in classico? la mia ipotesi è sì
ngn

@ngn Sì.
Adám,

ecco un'idea per 61 byte: '-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕( ⎕io←0)
ngn

4

Java, 574 562 558 549 525 523 byte

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);}}

So che è passato un po 'di tempo da quando l'hai pubblicato. Ma puoi giocare a golf alcune cose: entrambi '-'possono esserlo 45. Entrambi Math.max(...,0)possono essere ...>0?...:0(si potrebbe fare lo stesso con, Math.min(...,9)ma è esattamente la stessa quantità di byte. 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);Può essere 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 forse potresti farne una funzione al posto del programma.
Kevin Cruijssen,

1

APL (Dyalog Classic) , 61 byte

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

Provalo online!

a←⎕ valutare l'input e assegnare a a

i←,⍳⍴a gli indici (coppie di corde) di tutte le cellule

('!'=,a)/ filtra solo le bombe inizialmente attive

{ }⍣≡ eseguire una trasformazione nell'elenco fino a quando non si stabilizza

  • 'X@~-'⍳a[⍵]sostituire 0 per X, 1 per @, ecc. 4 per qualsiasi altra cosa ( !)

  • 3|mod 3 per ottenere il "raggio" di impatto; deve essere maggiore o uguale al ...

  • (↓⌈/¨|⍵∘.-i)≤ ... Manhattan distanzia tra le celle dell'elenco e tutte le celle

  • i/⍨∨⌿↑ ottenere la maschera di bit di quali celle sono interessate e selezionarle i

'-'@( )⊢amettere -in quelle posizioni

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.