Haftungsausschluss: Die Geschichte, die in dieser Frage erzählt wird, ist vollständig fiktiv und wurde ausschließlich zum Zweck der Bereitstellung eines Intro erfunden.
Ich bin ein böser Bauer, und um die Weizenpreise in meiner Gegend zu vertreiben, habe ich beschlossen, die Felder aller Bauern um mich herum zu verbrennen. Ich würde wirklich gerne sehen, wie die Felder in Flammen aufgehen (damit ich mein böses Lachen gebrauchen und meine Hände vor Freude reiben kann), aber ich möchte auch nicht beim Zuschauen erwischt werden, also musst du das Feldwesen simulieren für mich verbrannt.
Deine Aufgabe:
Schreiben Sie ein Programm oder eine Funktion, die als Eingabe ein Feld verwendet und die Phasen des Brennens zurückgibt, bis das gesamte Feld Asche ist. Ein bestimmter Abschnitt des brennenden Feldes wird durch eine ganze Zahl dargestellt, die die Intensität der Flamme darstellt. Ein Feuer beginnt bei "1" und geht weiter zu "2" und dann zu "3" und so weiter. Sobald ein Feuer "4" erreicht, erfasst es alle direkt (nicht diagonal) angrenzenden Bereiche, die im Feuer brennbar sind. Sobald es "8" erreicht, brennt es bei der nächsten Iteration aus und verwandelt sich in Asche, dargestellt durch ein "A". Wenn ein Bereich noch nicht vom Feuer berührt wurde, wird er durch eine "0" dargestellt. Wenn das Feld beispielsweise so aussieht:
100
000
Ihr Programm sollte dies ausgeben:
100
000
200
000
300
000
410
100
520
200
630
300
741
410
852
520
A63
630
A74
741
A85
852
AA6
A63
AA7
A74
AA8
A85
AAA
AA6
AAA
AA7
AAA
AA8
AAA
AAA
Wenn Sie möchten, können Sie die obigen Symbole durch einen beliebigen Satz von Symbolen ersetzen, sofern diese konsistent und voneinander verschieden sind.
Eingang:
Die Startposition des Felds in einer beliebigen Standardform, z. B. einer Zeichenfolge mit Trennlinie wie oben.
Ausgabe:
Das Feld in jeder Iteration, während es brennt, entweder als Array oder als Zeichenfolge, die von einem Zeichen begrenzt wird.
Testfälle:
0301
000A
555
|
v
0301
000A
555
1412
010A
666
2523
020A
777
3634
030A
888
4745
141A
AAA
5856
252A
AAA
6A67
363A
AAA
7A78
474A
AAA
8A8A
585A
AAA
AAAA
6A6A
AAA
AAAA
7A7A
AAA
AAAA
8A8A
AAA
AAAA
AAAA
AAA
Wertung:
Dies ist Code-Golf , die niedrigste Punktzahl in Bytes gewinnt!
quelle
Antworten:
APL (Dyalog) , 52 Byte *
Nimmt an,
⎕IO←0
was auf vielen Systemen Standard ist. Nimmt das Feld mit 0 für leere Felder, 1 für nicht brennendes Feld, 2 für neues Feuer, 5 für ausgebreitetes Feuer und 10 für Asche. Die Eingabe muss mindestens 3 × 3 sein, was kein Problem darstellt, da zusätzliche Zeilen und Spalten mit Nullen (Leerzeichen im OP-Format) aufgefüllt werden können.Probieren Sie es online!
Mein Format macht es schwierig, die Korrektheit zu überprüfen. Hier ist eine Version mit zusätzlicher Vor- und Nachbearbeitung, die vom und zum OP-Format übersetzt werden kann.
⍣{
…}
Wiederholen bis:⍺
die nächste Generation≡
ist identisch mit⎕←⍵
die aktuelle Generation, ausgegeben{
…}⌺3 3
Ersetzen Sie jede Zelle durch das Ergebnis dieser Funktion, das auf die Umgebung von Moore angewendet wird:,⍵
ravel (platt) das Argument; Gibt eine Liste mit neun Elementenr←
r zuweisen4⊃
Wähle das vierte Element aus. das Zentrum, dh der ursprüngliche Zellwertc←
zuweisen c1=
ist man dem gleich?:
wenn ja, dann:⍳2
zuerst zu ɩ ntegers; 0 19⍴
r eshape auf Länge neun; 0 1 0 1 0 1 0 1 0r/⍨
benutze das um r zu filtern (dies erhält nur die orthogonalen Nachbarn)4∊
Ist vier ein Mitglied davon? (Wird es in der nächsten Generation eine Fünf geben?)1+
füge eins hinzu; 1, wenn nicht Feuer gefangen oder 2, wenn Feuer gefangen⋄
sonst (dh der aktuelle Wert ist 0 oder ≥ 2)×c
das Zeichen von cc+
c plus das (dh im Brandfall um eins erhöhen)10⌊
mindestens zehn und das (da Asche nicht anbrennt)* Verwenden Sie in Dyalog Classic
⎕U233A
anstelle von⌺
.quelle
fire '0A000\n0A0A0\n0A0A0\n000A1'
perfekt mit dem formatierten Link, aber ich kann kein Äquivalent für den ersten Link finden. Ich mache wahrscheinlich etwas falsch. Das funktioniert bei mir nicht:f ↑(0 0 0)(0 1 0)(0 0 0)
Python 3 , 232 Bytes
Probieren Sie es online!
-3 Bytes dank officialaimm durch Zusammenführen des anderen Lambda in
f
(sieht chaotisch aus, spart aber Bytes und das ist alles, was uns interessiert)-8 Bytes dank Mr. Xoder
-26 Bytes dank ovs
-6 Bytes dank ppperry
quelle
JavaScript (ES6),
217210207204193192190 Bytes2 Bytes gespart dank @ Shaggys Vorschlag,
9
as zu verwendenA
.Verwendet
9
anstelle vonA
. Eingabe als 2D-Array von Ganzzahlen. Ausgabe als Array solcher Arrays.quelle
9
anstelle von verwendenA
?Simulation der Welt (in Emoji) , 1407 Bytes?
Lieben Sie es nicht, eine erklärbare Sprache als Programmiersprache zu verwenden? Der Nachteil dabei ist, dass es normalerweise kein genau definiertes Programm gibt. In diesem Fall verwende ich den JSON, den es exportiert. (Wenn Sie bessere Ideen haben, lassen Sie es mich wissen)
Probieren Sie es hier oder hier:
quelle
Retina ,
1039688 BytesProbieren Sie es online! Verwendet
9
für Asche; Dies kann zu einem Preis von 4 Bytes mit geändert werdenT`1-8`2-8A
. Bearbeiten: 6 Bytes dank @MartinEnder gespeichert. Erläuterung:Fügen Sie ein Trennzeichen hinzu, damit die Ausgänge nicht ineinander laufen. (Hilft auch beim Matching weiter unten.)
Drucken Sie nicht den endgültigen Status (der dem vorherigen Status entspricht, der bereits gedruckt wurde). Wiederholen, bis der Pass den Status nicht mehr ändert. Druckt den aktuellen Status vor jedem Durchgang.
Erhöhen Sie die Intensität des gesamten Feuers.
Helle unbeleuchtete Felder nach Bedarf. Untererklärung:
Messen Sie die Spaltennummer dieses unbeleuchteten Feldes.
Passen Sie das unbeleuchtete Feld an.
Suchen Sie rechts nach einem geeigneten Feld.
Suchen Sie in der Zeile darunter nach einem geeigneten Feld in derselben Spalte (mit einem Bilanzkreis). Beachten Sie, dass, wenn die Eingabe garantiert rechteckig sein könnte, dies
|.*¶(?>(?<-1>.)*)4
für eine Einsparung von 3 Bytes vereinfacht werden könnte .Suchen Sie links nach einem geeigneten Feld. (Da wir von der rechten Seite des Feldes schauen, sehen wir auch das unbeleuchtete Feld.)
Suchen Sie in derselben Spalte in der Zeile oben nach einem geeigneten Feld. Da dies ein Lookbehind und damit eine Übereinstimmung von rechts nach links ist, muss die Bilanzkreisbedingung vor den Spalten stehen, die von dem Bilanzkreis abgeglichen wurden.
quelle
Perl 5 , 365 Bytes
Probieren Sie es online!
Verwendet '9' anstelle von 'A', um einen ausgebrannten Ort anzuzeigen.
Erklärt
quelle
Haskell , 162 Bytes
Probieren Sie es online! Verwendung:
h
Nimmt ein Feld als Liste von Zeilen und gibt eine Liste von Feldern zurück. Ein nicht verbranntes Feld wird durch@
und Asche durch angezeigt9
, die verschiedenen Brände sind die Ziffern1
bis8
.f
verwaltet die Ausbreitung des Feuers von links nach rechts, indem alle nicht@
verbrannten Felder, die rechts von einem brennenden3
Feld sind, durch ersetzt werden0
.i
erhöht jede Ziffer, solange sie kleiner als ist9
.g
giltf
für jede Zeile, kehrt dann die Zeile um, giltf
erneut und kehrt zurück. Dann wird die Liste der Zeilen transponiert und erneut auf jede Zeile und ihre Umkehrungf
angewendet.h
giltg
für die Eingabe, bis sie sich nicht mehr ändert und die Ergebnisse sammelt.quelle
_
. Wenn dies nicht akzeptabel ist, muss die Antwort leider gelöscht werden, da sie sich auf die Verwendung von konzentrierttranspose
und ich keine Möglichkeit sehe, sie einfach zu beheben, ohne Tonnen von Bytes einzuführen.C (gcc) ,
308305299297295291 BytesDieses Programm definiert eine Funktion, die zwei Eingaben akzeptiert, einen Zeiger auf ein Array von Zeichenfolgen, denen die Länge vorausgeht, wie in dieser E / A-Standardeinstellung zulässig . Ausgabe an STDOUT mit nachfolgendem Zeilenumbruch.
Probieren Sie es online!
quelle
80
.A
s werden müssen, aber anscheinend habe ich falsch angenommen. Trotzdem danke für die Information. Es ist jetzt behoben.Octave,
7269 BytesDie Eingabe wird als 2D-Zahlenfeld interpretiert und leere Stellen mit gekennzeichnet
Inf
.'A'
wurde ersetzt durch9
. Zwischenergebnisse (als Array von Zahlen) werden implizit gedruckt.Probieren Sie es online!
Erläuterung:
In einer Schleife wird die Funktion
imdilate
(morphologische Bilderweiterung) aus dem Bildpaket verwendet, um die Brandausbreitung zu simulieren.quelle
[0 Inf 0 0 0;0 Inf 0 Inf 0;0 Inf 0 Inf 0;0 0 0 Inf 1]
- Sehr schönPython 2 , 325 Bytes
f
Nimmt die Eingabe als 2D-Array von Ganzzahlen und leere Stellen, die mit gekennzeichnet sind''
.'A'
wurde ersetzt durch9
. Die Funktion gibt einen Generator aller Felder über die Zeit im gleichen Format aus.Probieren Sie es online!
quelle
Oktave , 212 Bytes
Geben Sie zum Ausführen ein Zeichenarray an, z.
... dann mach:
Erklärung des folgenden Codes ...
Probieren Sie es online!
Hinweis: Ich habe versucht, diesen Code mit tio.run auszuführen , aber keine Ausgabe erhalten. Ich musste einen anderen Dienst nutzen.
quelle
PHP,
226 212 210 209 185177 BytesNimmt Eingaben mit einem nachgestellten Zeilenumbruch aus einer Datei mit dem Namen an
m
.9
für asche.Laufen Sie mit
-nr
oder versuchen Sie es online .erster Ansatz: PHP 7.0, 209 Bytes
Nimmt Eingaben mit einem nachgestellten Zeilenumbruch aus einer Datei mit dem Namen
m
.Laufen Sie mit
-nr
oder versuchen Sie es online .PHP-Versionshinweise (für alten Ansatz)
$c-4|
durch$g[$y+$p=[1,0,-1][$a]][$q+=$x]!="0"||$g[$y+$p][$q]=1;
[1,0,-1][$a]
durch$a%2*~-($a&2)
a&$c
mit""<$c
,+$c
mit0<$c
und$c-4
mit$c!=4
quelle
Oktave,
419312 BytesProbieren Sie es online!
Dies ist meine Version, die es funktioniert, also muss ich jetzt noch Golf spielen. Ich denke, es kann viel kürzer sein, wenn ich einen Weg finde, die Indizes der 4 in einer Matrix zu finden, aber ich weiß nicht wie.
PS: A ist eine 9 in meinem Code.
quelle
endif
endfor
undendwhile
du kannst schreibenend
Schablone (
∊
-Modus) , 22 ByteProbieren Sie es online!
Verwenden Sie wie in der Testeingabe ganze Zahlen, die durch Leerzeichen für
0
-8
,' '
für Leerzeichen und'A'
für getrennt sindA
. Denken Sie daran, auch nachgestellte Leerzeichen einzufügen.quelle