Angenommen, wir haben eine Matrix wie diese:
11111
12221
12321
12221
11111
Diese Matrix repräsentiert ein Gelände und jede Zelle repräsentiert einen Teil des Geländes. Die Zahl in jeder Zelle gibt die Zeit an, die der Teil des Geländes entsprechend seiner Brennbarkeit vollständig verbrannt werden muss (in Minuten, wenn eine Maßeinheit benötigt wird) . Beginnt ein Feuer an einer bestimmten Position (Zelle), muss diese Zelle vollständig verbrannt werden, bevor sich das Feuer auf die benachbarten Zellen ausbreitet (nur horizontal und vertikal, nicht diagonal). Wenn also ein Feuer in der Mittelposition ausgelöst wird, benötigt das Feuer:
11111 11111 11111 11011 10001 00000
12221 3 m. 12221 2 m. 12021 1 m. 11011 1 m. 00000 1 m. 00000
12321 -----> 12021 -----> 10001 -----> 00000 -----> 00000 -----> 00000
12221 12221 12021 11011 00000 00000
11111 11111 11111 11011 10001 00000
Erläuterung:
- Feuer beginnt bei [2,2] (0-basiert), was eine Brenndauer von 3 hat.
- Nach 3 Minuten beginnen [1,2], [2,1], [2,3], [3,2] zu brennen.
- Nach 2 Minuten brennen diese Zellen nicht mehr und das Feuer breitet sich auf alle benachbarten Zellen aus, aber [0,2], [2,0], [2,4], [0,4] brauchen nur noch 1 Minute, um zu brennen
- Nach 1 Minute werden diese Zellen verbrannt und die Zelle breitet sich zu ihren benachbarten Zellen aus.
- Nach einer weiteren Minute brennen die restlichen Zellen aus Schritt 3 und das Feuer breitet sich auf die benachbarten Zellen aus (die bereits verbrannt sind, sodass nichts passiert).
- Nach einer letzten Minute brennt das Feuer auf dem gesamten Gelände.
Die Lösung für diesen Fall sind also 8 Minuten. Wenn das Feuer in der Zelle ganz oben links beginnt [0,0]:
11111 01111 00111 00011 00001 00000
12221 1 12221 1 02221 1 01221 1 00121 1 00011 1
12321 --> 12321 --> 12321 --> 02321 --> 01321 --> 00321 -->
12221 12221 12221 12221 02221 01221
11111 11111 11111 11111 11111 01111
00000 00000 00000 00000 00000
00000 1 00000 1 00000 1 00000 1 00000
00221 --> 00110 --> 00000 --> 00000 --> 00000
00221 00121 00020 00010 00000
00111 00011 00001 00000 00000
Die Gesamtzeit beträgt jetzt also 10 Minuten.
Die Herausforderung
Schreiben Sie bei einer NxM-Matrix (N> 0, M> 0) von ganzzahligen Werten, die die Zeit darstellen, die jede Zelle benötigt, um vollständig verbraucht zu werden, das kürzeste Programm / die kürzeste Funktion, die diese Matrix benötigt, und ein Paar ganzer Zahlen mit der Position, an der das Feuer beginnt , und gibt die Zeit aus, die das Feuer benötigt, um das gesamte Gelände vollständig zu verbrauchen.
- Jede Zelle hat eine positive Brenndauer (ungleich Null). Sie können keinen Maximalwert für die Zellen annehmen.
- Die Matrix muss weder quadratisch noch symmetrisch sein.
- Die Matrix kann 0-indiziert oder 1-indiziert sein, wie Sie möchten.
- Die Position kann als ein einzelner Parameter mit einem Tupel von ganzen Zahlen angegeben werden, zwei getrennte Parameter in jedem anderen vernünftigen Format.
- Die Abmessungen der Matrix können nicht als Eingabeparameter angegeben werden.
- Sie müssen nicht jeden Zwischenschritt ausgeben, sondern nur die angeforderte Zeit. Aber ich werde mich nicht beschweren, wenn die Schritte in irgendeiner Weise visualisiert werden.
Ein anderes Beispiel:
Fire starts at [1,1] (a '>' represents a minute):
4253 4253 4253 4153 4043 3033 2023 0001 0000
2213 > 2113 > 2013 > 1003 > 0002 > 0001 > 0000 >> 0000 > 0000
1211 1211 1211 1111 1001 0000 0000 0000 0000
Output: 9
Das ist Code-Golf , also kann das kürzeste Programm für jede Sprache gewinnen!
quelle
1
bisM*N
Antworten:
Matlab,
235257190182178 BytesEingabe: Matrix
A
, 1x2-Vektorp
mit den Startkoordinaten.Erläuterung:
Anstatt die Ausbreitung des Feuers zu simulieren, können wir dies auch als ein Problem "Finde den längsten kürzesten Weg" verstehen. Die Matrix wird in einen gewichteten gerichteten Graphen umgewandelt. Die Gewichte der Pfade zu einem einzelnen Knoten entsprechen der Zeit zum Brennen des Knotens. ZB für eine Matrix
Wir erhalten den zusammenhängenden Graphen:
Wobei Knoten 1 das obere linke Matrixelement und Knoten 12 das untere rechte Element ist. Bei gegebenen Startkoordinaten
p
wird der kürzeste Weg zu allen anderen Knoten berechnet. Dann entspricht die Länge des längsten Pfades dieser kürzesten Pfade + die Zeit zum Brennen des Anfangsknotens der Zeit zum Brennen der gesamten Matrix.Ungolfed und kommentierte Version mit Beispielstartwerten:
quelle
;
nach jeder Zeile das weggelassen habe . In Matlab verhindern diese, dass die Ergebnisse der einzelnen Befehle in der Konsole angezeigt werden. Derzeit ist der Code SEHR gesprächig und spammt die Konsole. Aber da dies kein strikter Fehlerzustand ist, habe ich es so gehalten. Aber es spielt keine Rolle, es ist nur 4 BytesJavaScript (ES6),
156152146144143 BytesDank Kevin Cruijssen 1 Byte gespeichert
Eine eher naive Umsetzung. Nimmt Eingaben in Curry-Syntax vor
(a)(s)
, wobei a ein 2D-Array und s ein Array aus zwei Ganzzahlen [ x, y ] ist, die die 0-basierten Koordinaten der Startposition darstellen.Formatiert und kommentiert
Testfälle
Code-Snippet anzeigen
quelle
==0
kann golfen werden,<1
wenn ich mich nicht irre.undefined<1
falsch ist. Vielen Dank!Oktave, 67 Bytes
Probieren Sie es online!
Um Zwischenergebnisse zu visualisieren, können Sie dies versuchen!
Eine Funktion, die als Eingabematrix für das Terrain
a
und die Anfangskoordinate eine Matrix aus 0 und 1 mit der gleichen Größe wie das Terrain verwendet.Eigentlich muss
endfunction
das Beispiel nicht ausgeführt werden, um es hinzuzufügen.Erläuterung:
Wenden Sie wiederholt morphologische Bilddilatation auf das Gelände an und subtrahieren Sie die verbrannten Bereiche davon.
Ungolfed Antwort:
quelle
n=1
zun=0
.MATL ,
2625 BytesEingabeformat ist:
Die erste Eingabe ist eine Matrix, die
;
als Zeilentrennzeichen verwendet wird.Die zweite Eingabe ist eine einzelne Zahl, die einen Eintrag der Matrix in einer auf 1 basierenden Spalten-Hauptreihenfolge adressiert (gemäß der Abfrage zulässig). Beispielsweise ist die Spaltenhauptkoordinate jedes Eintrags in einer 3 × 4-Matrix durch gegeben
So entsprechen zum Beispiel 1-basierte Koordinaten (2,2)
5
.Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Der Code enthält eine Liste der brennenden Einträge. Bei jeder Iteration werden alle Einträge dieser Liste dekrementiert. Wenn ein Eintrag Null erreicht, werden die benachbarten Einträge zur Liste hinzugefügt. Um Bytes zu sparen, werden Einträge, die Null erreichen, nicht aus der Liste entfernt. Stattdessen "brennen" sie mit negativen Werten weiter. Die Schleife wird verlassen, wenn keiner der Einträge positive Werte hat.
Sehen Sie sich das Programm Schritt für Schritt mit leicht verändertem Code an.
Kommentierter Code:
quelle
Python 2 , 170 Bytes
Probieren Sie es online!
quelle
Python 3 ,
277266 BytesProbieren Sie es online!
Definiert eine Funktion
f
, die eine 2D-Matrix und ein Tupel von Punkten aufnimmt. Das erste , was die Funktion hat, einen Satz von Tupel definiert den anfänglichen tuple Wert enthält gebenen:p={s}
. Die Funktion geht dann jedes Tupel von Punkten durchp
und subtrahiertm
an diesem Punkt eins von der Matrix , es sei denn, der Wert ist bereits Null. Es wird dann durchgeschleiftm
alle Punkte mit dem Wert Null erneut gesucht und die vier Nachbarn dieses Punkts zur Menge hinzugefügtp
. Aus diesem Grund habe ich mich für die Verwendung eines Sets entschieden, da Sets in Python keine doppelten Werte zulassen (was die Subtraktion sehr verkorksen würde). Leider müssenlist[-1] == list[len(list)-1]
die Indizes aufgrund von Listenindexumbrüchen (zB :) eingeschränkt werden, damit sie nicht negativ werden und die falschen Koordinaten hinzufügenp
.Nichts besonderes, gewöhnungsbedürftig. Hier gibt es definitiv Raum für Verbesserungen, ich werde weiter daran arbeiten.
quelle
APL (Dyalog) ,
936657 BytesProbieren Sie es online! oder Visualisiere es online!
Diese Funktion nimmt die Geländematrix als rechtes Argument und die Koordinaten (1-basiert) des ersten Feuers als linkes Argument. Gibt die Anzahl der Minuten zurück, die benötigt werden, um alles zu brennen.
Aktualisierung
Endlich einen Weg gefunden, um die Spread-Funktion abzuspielen.
* Seufz * es wäre so viel einfacher, wenn die Welt wäre toroid wäre .
TIO hat gerade ein Upgrade auf Dyalog 16.0 durchgeführt , was bedeutet, dass wir jetzt den glänzenden neuen Schablonenoperator haben
quelle
Python 2 , 268 Bytes
Probieren Sie es online!
Iterieren Sie rekursiv über Zeitschritte, in denen die Anzahl jeder Kachel verringert wird, wenn sie im Wesentlichen an eine 0 angrenzt. Sehr einfacher Algorithmus, der meines Erachtens immer noch für eine boolesche Effizienz verwendet werden kann ...
* Anmerkung: mein 'Online ausprobieren!' Der Code enthält die Bonus-Debug-Protokollierung in der Fußzeile. Ich beobachte gerne den Fortschritt des Algorithmus.
quelle
Haskell ,
138133 BytesProbieren Sie es online!
Angenommen, die Eingabe ist eine Liste von ((x, y), Zelle). Ungolfed:
quelle