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 Code-Golf , 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
Antworten:
Matlab,
120111 BytesDie 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
quelle
Retina ,
188168154152 BytesBytes gezählt als ISO 8859-1.
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 ...quelle
APL (Dyalog) , 56 Zeichen oder 62 Byte *
Mein Kollege Marshall hatte eine elegante Lösung, 21 Zeichen kürzer als meine:
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 sind1∊
Boolescher Wert, wenn ein Wert wahr ist* Ersetzen Sie einfach
⌺
mit⎕U233A
unter Classic für einzelne Byte pro Zeichen.quelle
Disp
Funktion hätte nie funktionieren können. Aktualisiert, um ein Operator zu sein. Vielen Dank.@
Zählt im Klassischen 1 Byte? Meine Vermutung ist ja'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕
(⎕io←0
)Java,
574562558549525523 Bytesquelle
'-'
kann sein45
. BeidesMath.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 seinint 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.APL (Dyalog Classic) , 61 Byte
Probieren Sie es online!
a←⎕
eingabe auswerten und zuordnen zua
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ürX
, 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 Zelleni/⍨∨⌿↑
Holen Sie sich die Bitmaske, von der die Zellen betroffen sind, und wählen Sie diese ausi
'-'@( )⊢a
setzen-
an diesen Positionenquelle