Stellen Sie sich einen Brandstifter vor, der durch die Stadt läuft und seine Opfer nach einem ganz bestimmten Muster auswählt (oder stellen Sie sich eine Biene vor, die durch den Garten fliegt und ihre Blumen pflückt, um sie nach einem ganz bestimmten Muster zu pollen ). Angenommen, die Stadt ist eine N × N- Matrix, wobei N eine ganze Zahl größer oder gleich 2 ist . Der Brandstifter beginnt in der oberen linken Ecke und setzt nacheinander die M- Punkte des Hauses vor sich (wobei M die Nummer des Hauses ist, in dem er sich gerade befindet), während er die Richtung ändert, in die er sich nach jedem Brand bewegt, in der angegebenen Reihenfolge Osten ⟶ Süden ⟶ Westen ⟶ Norden ⟶ Osten ⟶ Süden ... und so weiter. Das Wiegenliedder Brandstifter ist der Wert von M , der sie dazu bringt, die Stadt zu verlassen (dh das letzte Haus, das sie besuchen, bevor sie den Greuel stoppen). Dies ist anhand eines Beispiels viel einfacher zu verstehen. Nehmen Sie zum Beispiel die folgende Matrix:
3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Wir beginnen in der oberen linken Ecke, also ist M = 3 (
X
markiert die aktuelle und vorherige Position des Brandstifters):X 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Gemäß der bekannten Ordnung, geht es zunächst nach Osten M (3) Punkte und landet auf einem 2 so M entsprechend ändert:
X 2 3 X 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Dann geht es nach Süden 2 Spots und M ist jetzt 1 :
X 2 3 X 7 3 1 4 1 6 2 5 3 X 1 4 4 3 2 4 1 1 1 1 1
- Jetzt rückt es 1 Punkt nach Westen und M wird 3 :
X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
- Nachdem es sich 3 Punkte nach Norden bewegt hat , verlässt es die Stadt! Deshalb ist 3 das Wiegenlied dieses Brandstifters:
X X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
Wenn Sie eine N × N- Matrix haben (Sie können optional auch N als Eingabe verwenden), finden Sie das Wiegenlied des Brandstifters. Ich habe ein Programm geschrieben, mit dem Sie weitere Testfälle generieren und den Weg des Brandstifters visualisieren können: Probieren Sie es online aus!
- Sie können davon ausgehen , dass der arsonist hat ein Schlaflied hat (das heißt, es tatsächlich die Matrix heraus kann).
- Die Matrix enthält der Einfachheit halber nur positive ganze Zahlen, die kleiner oder gleich 9 (Ziffern) sind. Lösungen, die mit jeder positiven Ganzzahl umgehen, sind ausdrücklich erwünscht.
- Beachten Sie, dass der Brandstifter an einer Stelle landen kann , an der er sich bereits niedergebrannt hat, für den Fall, dass das Gefühl, in das er sich bewegt, sich vom ersten Mal unterscheidet. Nehmen Sie in einem solchen Szenario einfach den Wert dieses Elements und verschieben Sie es wie gewohnt.
- Sie können in jeder Programmiersprache antreten und über jede Standardmethode Eingaben und Ausgaben vornehmen. Beachten Sie jedoch, dass diese Lücken standardmäßig verboten sind. Dies ist Codegolf , daher gewinnt die kürzeste Übermittlung (in Bytes) für jede Sprache .
Testfälle
------------- 9 2 3 1 7 2 8 7 6 Wiegenlied: 9 ------------- 2 1 2 1 3 1 1 2 1 2 2 1 1 1 1 3 Wiegenlied: 2 ------------- 3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1 Wiegenlied: 3 ------------- 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 Wiegenlied: 2 ------------- 3 2 1 2 1 1 1 2 3 2 3 2 1 1 2 1 1 1 3 1 2 3 1 1 1 1 1 1 4 5 2 3 1 1 1 1 2 1 2 1 2 2 1 2 2 3 2 1 2 Wiegenlied: 3 -------------
Die Matrizen in einem anderen Format:
[[9, 2, 3], [1, 7, 2], [8, 7, 6]] [[2, 1, 2, 1], [3, 1, 1, 2], [1, 2, 2, 1], [1, 1, 1, 3]] [[3, 2, 3, 2, 7], [3, 1, 4, 1, 6], [2, 5, 3, 1, 1], [4, 4, 3, 2, 4], [ 1, 1, 1, 1, 1]] [[1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2]] [[3, 2, 1, 2, 1, 1, 1], [2, 3, 2, 3, 2, 1, 1], [2, 1, 1, 1, 3, 1, 2], [ 3, 1, 1, 1, 1, 1], [4, 5, 2, 3, 1, 1, 1], [1, 2, 1, 2, 1, 2, 2], [1, 2, 2, 3, 2, 1, 2]]
Der fünfte Testfall ist sehr interessant zu visualisieren .
quelle
Antworten:
MATL , 32 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Wie es funktioniert
Die Eingabematrix wird beispielsweise mit einem Frame von fünf Nullen aufgefüllt
wird
Der Nullrahmen wird verwendet, um festzustellen, wann die
Brandstifterbienedie Matrix verlassen hat. Die Erweiterung mit fünf Nullen stellt sicher, dass eine modulare Verschiebung der Länge9
von einem Eintrag ungleich Null bis in eine beliebige Richtung korrekt in einer Null landet, ohne dass ein Eintrag ungleich Null umgebrochen wird.In Matrixkoordinaten beginnt die Biene mit der Eingabe
(6,6)
der erweiterten Matrix. Es liest diesen Eintrag und aktualisiert die Koordinaten nach Bedarf, wobei eine (modulare) Verschiebung der gelesenen Länge in die entsprechende Richtung angewendet wird. Dies wird in einer Schleife wiederholt, bis der gelesene Wert ist0
. Der Eintrag, der vor diesem gelesen wurde (dh der letzte Eintrag ungleich Null), ist die Ausgabe.Die Koordinaten werden eigentlich als komplexe Zahl gespeichert ist , so beispielsweise
(6,6)
wird6+6j
. Auf diese Weise können die vier zyklischen Richtungen als Potenzen der imaginären Einheit realisiert werden. Die entsprechende Leistung (j
,1
,-j
oder-1
) durch den Leseeintrag multipliziert die komplexe Verschiebung zu erhalten , die für die Aktualisierung der Koordinaten verwendet wird.Die nacheinander gelesenen Werte bleiben auf dem Stapel. Wenn die Schleife verlassen wird, enthält der Stapel alle Lesewerte ungleich Null in der Reihenfolge, dann den zuletzt gelesenen Wert
0
, also die neuesten komplexen Koordinaten. Das drittoberste Element ist also die erforderliche Ausgabe.quelle
JavaScript (ES6),
7068 BytesProbieren Sie es online!
Kommentiert
Da das Vorzeichen des Moduls in JS das der Dividende ist, wird die Richtung folgendermaßen aktualisiert:
quelle
Holzkohle ,
2518 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Drucken Sie die Eingabezeichenfolge, aber verschieben Sie die Druckposition nicht.
Drehen Sie den Zapfen nach links, sodass die Druckrichtung jetzt oben ist.
Wiederholen, solange sich ein Zeichen unter der Druckposition befindet.
Speichern Sie das Zeichen in einer Variablen.
Wirf den Charakter in eine Zahl und drucke so viele Zeilenumbrüche. Da die Druckrichtung jetzt oben ist, wird horizontal gedruckt. Das Ergebnis ist, dass wir die Druckposition um den Betrag in die gewünschte Richtung verschoben haben, den die Zahl unter der Druckposition angibt.
Drehen Sie den Drehpunkt so, dass die nächsten Zeilen die Druckposition für den nächsten Durchgang der Schleife im Uhrzeigersinn verschieben.
Leider haben wir immer noch die Eingabe, die unsere Zeichenfläche überfüllt, und noch bedauerlicher ist, dass wir, wenn wir die Zeichenfläche löschen, auch unsere Variable löschen. Das ist also ein kleiner Trick: Eine Liste der leeren Zeichenfolge und der Variablen wird durchgeschleift. Beim ersten Durchlauf der Schleife ist die Schleifenvariable leer, sodass die Zeichenfläche und die Schleifenvariable sowie die Ergebnisvariable gelöscht werden. Aber die Schleife ist noch nicht fertig! Beim zweiten Durchlauf der Schleife erhalten wir weiterhin Zugriff auf unsere Variable, die sorgfältig in unserer Schleifenliste gespeichert wurde. Es bleibt nur zu drucken.Löschen Sie die Zeichenfläche und drucken Sie die gespeicherte Variable. (Danke an @ ASCII-only für die Korrektur von Charcoal.)
quelle
Python 2 ,
8584 BytesProbieren Sie es online!
Geben Sie Mr. Xcoder für 1 Byte den Hut .
quelle
Charcoal ,
504946343326 BytesProbieren Sie es online aus
Der Link verweist auf die ausführliche Version des Codes
Die Eingabe muss N in einer eigenen Zeile sein, danach die Zeilen des Arrays in separaten Zeilen.
Jegliche Möglichkeiten, Bytes auszuschalten, sind willkommen und erwünscht, da ich kein guter Golfer in Charcoal bin!
-12 Bytes dank @Neil! -1 Byte dank nur @ ASCII! -7 Bytes dank @ ASCII-only (Fehler beim
Clear
Zurücksetzen von Variablen behoben)quelle
Rot , 145 Bytes
Probieren Sie es online!
Besser lesbar:
quelle
Perl 6 , 62 Bytes
Probieren Sie es online!
Nimmt die Matrix als flache Liste und Breite.
quelle
Sauber , 141 Bytes
Probieren Sie es online!
Definiert die Funktion
? :: {#{#Int}} -> Int
, indem ein nicht gepacktes Array von nicht gepackten Arrays von Ganzzahlen verwendet und das Ergebnis zurückgegeben wird.quelle
Java 8, 121 Bytes
Probieren Sie es online aus.
Alternative mit der gleichen Anzahl von 121 Bytes :
Verwendet try-finally, anstatt zu überprüfen, ob die
x,y
-Koordinate noch innerhalb der Grenzen liegt.Probieren Sie es online aus.
Erläuterung:
quelle
Perl 5 , 92 Bytes
Probieren Sie es online!
Wie?
Der Satz verschachtelter Maps und der Join erzeugen Folgendes:
welches dann ausgewertet wird, um zu bestimmen, ob die Schleife endet. Da der Boolesche Wert von links nach rechts ausgewertet wird,
$n
ändert sich der Wert von tatsächlich (bis zu) viermal während der Auswertung. Da die boolesche Logik in Perl kurzschließt, ist der Wert von$n
das Schlaflied, wenn die Schleife verlassen wird.quelle
Python 3 ,
8584 Bytesxcoder: -1 (Ich erinnere mich nie an den + ~ Trick)
Probieren Sie es online!
Anstatt sich in verschiedene Richtungen (E, S, W, N) zu bewegen, bewegt sich diese Lösung immer nach Osten und dreht das Gitter nach jeder Bewegung gegen den Uhrzeigersinn. Nach dem Drehen ist die letzte Spalte jetzt die erste Zeile. Wenn der Zeilenindex also kleiner als Null ist, bedeutet dies, dass wir vom Brett gerannt sind.
quelle
-d-1
=>+~d
Netzhaut , 161 Bytes
Probieren Sie es online!
quelle