Kettenreaktion von Bomben

32

Einführung:

Vor der Aufgabe macht jedes Element auf der Karte Folgendes:

Einfaches Land ( X): Das macht nichts.

Zerstörtes Land ( -): Dies ist dasselbe wie einfaches Land, wird jedoch durch eine Bombe zerstört.

Die aktive Bombe ( !): Auf einer Karte zerstört dies alles in einem 3x3 Quadrat:

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

Die passive Bombe ( @): Sie tut nichts, bis sie von einer anderen Bombe gezündet wird. Dies hat auch einen quadratischen Explosionsradius von 3x3 :

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

Aber:

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

Die Nuke ( ~): Es tut nichts, bis es von einer anderen Bombe zur Detonation gebracht wird. Der Unterschied ist, dass diese Bombe einen Explosionsradius von 5x5 Quadrat hat:

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

Aber:

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

Die Aufgabe

  • Bei einer 9x9-Karte wird die Karte nach der Kettenreaktion ausgegeben .
  • Sie können eine Funktion oder ein Programm bereitstellen.
  • Das ist , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!

Testfälle

Testfall 1 ( 3 Schritte ):

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

Testfall 2 ( 2 Schritte ):

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

Testfall 3 ( 2 Schritte ):

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

Testfall 4 ( 1 Schritt ):

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

Testfall 5 ( 9 Schritte ):

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

Testfall 6 ( 9 Schritte ):

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

Testfall 7 ( 3 Schritte ):

!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
quelle
4
Meine Antwort ist deutlich kürzer als die akzeptierte.
Adám
Darf sich ein Teil eines Workshops mit dieser Herausforderung befassen?
Adám

Antworten:

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

Faltung ist der Schlüssel zum Erfolg.

Die Idee ist folgende: Finden Sie die aktive Bombe. Vergrößern Sie diesen Bereich auf ein 3x3-Quadrat. Finden Sie neue betroffene Bomben, vergrößern Sie die korrespondierenden Bereiche auf die entsprechende Größe und fügen Sie diese dem zuvor zerstörten Bereich hinzu. Wiederholen Sie dies so oft (in meinem Fall so oft, wie wir Eingabezeichen haben, nur weil dies die kürzeste Variante ist), um sicherzustellen, dass wir einen stationären Punkt erreicht haben (= keine explodierenden Bomben mehr). Stellen Sie dann den gesamten zerstörten Bereich auf -und zeigen Sie das Ergebnis an.

Es wird angenommen, dass die Eingabe eine Matrix von Zeichen ist, z

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

Retina , 188 168 154 152 Bytes

Bytes gezählt als ISO 8859-1.

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

Probieren Sie es online!

Dies ist eher ein Proof of Concept. Es gibt eine schreckliche Menge an Überschneidungen zwischen Bomben und Atombomben, die ich zu beseitigen versuchen werde, bevor ich eine Erklärung hinzufüge. Nun, ich habe diese Duplizierung beseitigt, aber die Komplexität wurde dadurch erheblich erhöht, sodass keine großen Einsparungen erzielt wurden ...

Martin Ender
quelle
6

APL (Dyalog) , 56 Zeichen oder 62 Byte *

Mein Kollege Marshall hatte eine elegante Lösung, 21 Zeichen kürzer als meine:

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

Probieren Sie es online!

{} Anonyme Funktion, bei der das Argument durch ⍵ dargestellt wird

'-'@(An den Positionen, die von der folgenden stillschweigenden Funktion maskiert werden, mit einem )⍵Strich versehen werden:

  '!'∘= Boolescher Wert, bei dem das Ausrufezeichen dem Argument entspricht

  ()⍣≡ Wenden Sie die folgende stillschweigende Funktion an, bis sich nichts mehr ändert:

   ×∘(… Mit ) folgender Konstante multiplizieren:

    '~'=⍵ Boolescher Wert, bei dem die Tilde dem ursprünglichen Argument entspricht

    ()+ Dazu noch:

     'X'≠⍵ Boolescher Wert, bei dem sich X vom ursprünglichen Argument unterscheidet

   {Wenden Sie }⌺5 5 für jeden die folgende Funktion auf den 5 × 5-Bereich an, der darauf zentriert ist:

    4↑1 nimm die ersten vier Elemente von eins, aufgefüllt mit Nullen [1,0,0,0]

    1+ eins hinzufügen [2,1,1,1]

    5⍴ zyklisch in Länge fünf umformen [2,1,1,1,2]

    ∘.⌈⍨ maximaler Tisch mit sich selbst auf beiden Achsen

    ⍵≥ Boolescher Wert, bei dem die entsprechenden Nachbarn größer oder gleich sind

    1∊ Boolescher Wert, wenn ein Wert wahr ist


* Ersetzen Sie einfach mit ⎕U233A unter Classic für einzelne Byte pro Zeichen.

Adam
quelle
In der tio-Verknüpfung ist die Eingabe (links von ">") mit der Ausgabe (rechts von ">") identisch. Soll sie so aussehen?
25.
@ngn Schön entdeckt. Die DispFunktion hätte nie funktionieren können. Aktualisiert, um ein Operator zu sein. Vielen Dank.
Adám
... und eine Frage: @Zählt im Klassischen 1 Byte? Meine Vermutung ist ja
ngn
@ngn Ja.
Adám
Hier ist eine Idee für 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
quelle
Ich weiß, es ist schon eine Weile her, seit du das gepostet hast. Aber Sie können ein paar Dinge Golf spielen: Beides '-'kann sein 45. Beides Math.max(...,0)kann sein ...>0?...:0(dasselbe könnte man mit machen, Math.min(...,9)aber es ist genau die gleiche Menge an 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);Kann sein 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);. Und vielleicht könnten Sie eine Funktion daraus machen, anstatt ein Programm.
Kevin Cruijssen
1

APL (Dyalog Classic) , 61 Byte

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

Probieren Sie es online!

a←⎕ eingabe auswerten und zuordnen zu a

i←,⍳⍴a die Indizes (Koordinatenpaare) aller Zellen

('!'=,a)/ filtere nur die anfangs aktiven Bomben

{ }⍣≡ Führen Sie eine Transformation für die Liste durch, bis sie sich stabilisiert

  • 'X@~-'⍳a[⍵]Ersetzen Sie 0 für X, 1 für @, etc, 4 für alles andere ( !)

  • 3|mod 3, um den "Radius" des Aufpralls zu erhalten; es muss größer oder gleich sein ...

  • (↓⌈/¨|⍵∘.-i)≤ ... Manhattan-Abstände zwischen Zellen in der Liste und allen Zellen

  • i/⍨∨⌿↑ Holen Sie sich die Bitmaske, von der die Zellen betroffen sind, und wählen Sie diese aus i

'-'@( )⊢asetzen -an diesen Positionen

ngn
quelle