In Twitch Plays Pokémon ist eines der nervigsten Hindernisse, denen man begegnen kann, ein Eispuzzle, bei dem man von einem Ort zum anderen wandern muss, indem man den ganzen Weg in eine Richtung gleitet, bis man auf eine Mauer oder einen Felsbrocken stößt.
Ihre Aufgabe ist es, ein Programm zu erstellen, das ein zufälliges, schwieriges Eispuzzle generiert.
Ihr Programm wird drei Zahlen akzeptieren, M
, N
, und P
, als Eingang (mit 10 <= M <= 30
, 15 <= N <= 40
und 0 <= P < 65536
):
12 18
und wird ausgeben:
- Ein
M
By-N
Grid bestehend aus.
undO
, das Eis bzw. einen Boulder darstellt. - Eine Positionsmarkierung, die angibt, von wo aus das Puzzle eingegeben wird. Diese Positionsmarke besteht aus einem Buchstaben
L
,R
,T
, oderB
, links Darstellen, rechts, oben und unten, gefolgt von einer Zahl , die Position darstellt (von links oder von oben) auf der Seite eingegeben wird aus. - Eine ähnliche Positionsmarkierung, die angibt, wo das Rätsel beendet wird.
- Die kürzeste Lösung des Rätsels, bestehend aus einer Folge von
L
,R
,U
, undD
sind.
Beispielausgabe:
..O...O...........
............O.....
..O...............
.......O..........
..................
...........O......
O..O...........O..
..........O.......
..O..........O....
........O.........
O....O.........O..
............O.....
R 4
B 5
LDLDRULD
(Note that this output is actually invalid because it is not actually long enough.)
Für eine Eingabe M
und N
muss die Lösung des Puzzles mindestens min(M, N)
Schritte haben und mindestens die 2 (M + N)
gesamten Leerzeichen bewegen . (Als Referenz, bewegt sich der oben Puzzle insgesamt 12 Schritte, Bewegen 69 Plätze.) Ihre Puzzle - Generator eine andere erzeugen muss M
durch N
Puzzle mit einem anderen Lösungsweg für jeden Samen (dh eine andere Abfolge von Schritten für jede Lösung) P
.
- Beachten Sie, dass die Anforderung eines anderen Lösungspfads darin besteht, Lösungen zu vermeiden, die versuchen, systematisch Felspfade zu generieren, wie hier Claudius Lösung . Wenn es zwei oder drei Paare identischer Lösungen aufgrund von Macken in der Zufälligkeit gibt, ist dies in Ordnung, solange das Programm nicht absichtlich versucht, systematisch Rätsel mit der gleichen Abfolge von Zügen zu generieren.
Der kürzeste Code für die oben genannten Aufgaben gewinnt.
>
und<
(oder ein beliebiges Zeichen) für die Eingabe und die Ausgabe verwenden? Die Rätsel sind leichter zu lesen.LDLDRULD
nur 8 Schritte langAntworten:
Python,
672548 Zeichen, interessantere RätselObwohl ich mich strikt an die Regeln halte, schlägt mein anderes Python-Programm dieses. Ich habe beschlossen, ein Programm zu schreiben, das ohnehin interessantere Rätsel generiert. Hier ist es:
Einrückungsstufen sind Leerzeichen, Tabulator, Tabulator + Leerzeichen.
Proben :
Es wird
P
als Startwert verwendet, sodass jedesP
das gleiche Rätsel generiert und jedes andereP
höchstwahrscheinlich anders ist:Es funktioniert einigermaßen schnell bis zu einer Größe von,
M=25,N=40
aber danach wird es sehr langsam. Es sollte theoretisch funktionieren,M=30, N=40
wenn Sie es lange genug laufen lassen. Ich habe hier in der Spur manuell geschrieben, da es schwer zu folgen ist - das Programm gibt nur das Puzzle aus.Erklärung :
Das Programm durchläuft eine Schleife und generiert eine zufällige Startposition oben, eine zufällige Endposition unten und ein zufälliges Raster mit der
12.5%
Chance, dass sich an einer bestimmten Stelle ein Felsbrocken befindet. Dann löst es das Rätsel mit einer Breitensuche. Wenn die Lösung existiert und größer als istmin(H,W)
, wird sie gedruckt und beendet.quelle
Java - 2632
Während ich die technische Reinheit von Claudius Antwort bewundere , habe ich mich entschlossen, etwas schwierigere Rätsel zu machen;)
Grundlegende Schritte (ziemlich einfach):
Ich markiere auch jeden Punkt als "Nogo", während ich rutsche. Wenn ich auf einem Nogo-Platz lande (oder direkt vor einem, was bedeuten würde, dass ein Stein dorthin geht), ist das ein ungültiger Schritt.
Die Idee ist also, zufällig viele Karten zu generieren und die erste gültige zu behalten. Ich habe vor, dieses Verfahren intelligenter zu gestalten (Backtracking usw.), aber es funktioniert derzeit einwandfrei. Wir werden sehen, dass dadurch möglicherweise auch redundanter Code eingespart wird.
So wie es ist, werden kleine Karten (15x10) fast sofort, mittlere Karten (30x20) in wenigen Sekunden und große Karten (40x30) in zufälliger Zeit zwischen 20 Sekunden und 20 Minuten erzeugt, abhängig vom Startwert. Es werden je nach Größe zwischen 300.000 und 500.000 Karten pro Sekunde auf meinem Computer getestet.
Randnotiz: Manchmal sind die Karten nicht zu schwer, einfach weil es nur so viele Steine wie Stufen gibt und es meistens nur eine Option gibt, wenn Sie einen tatsächlichen Stein treffen möchten, es sei denn, die Stufe führt Sie zu einer Mauer. Ich werde das später beheben, indem ich "zufällige" Steine an sicheren Stellen platziere, nachdem alle Schritte gezeichnet wurden. Da Nogo-Spots bereits markiert sind, sollte das ziemlich einfach sein. Genießen Sie vorerst nur diese Beispiele:
Ausgabe mit verschiedenen Größen / Samen:
Maximale Größe 40x30:
Golf gespielt:
Mit Zeilenumbrüchen:
quelle
while(o<3){...;o=...;}
seinfor(;o<3;o=...){...;}
, ein Byte zu speichern?if(w%2<1)return new Point(f.x,f.y+i*d);else return new Point(f.x+i*d,f.y);
->return new Point(f.x+(w%2<1?0:i*d),f.y+(w%2<1?f.y:0));
.Python,
235206185176 ZeichenVerwendung :
Die Eingabe erfolgt über die Standardeingabe des Formulars
[M, N, P]
.Sie sagten, die Karten müssten für jeden Samen unterschiedlich sein
P
... und das sind:Und ein Beispiel mit einer anderen Größe:
Erfüllt alle angegebenen objektiven Kriterien:
P
führt zu einem anderen RätselN + N%2
zumindest SchritteN
2 (M + N)
gesamte FlächeErklärung :
Jede Zeile wird erstellt, indem ein bestimmtes Zeichenfolgenelement wiederholt
W
und die Länge aufW
(Ich verwendeH
undW
anstelle von) begrenzt wirdM
undN
) erstellt.Die ersten beiden Reihen hängen davon ab
P
, um jedes Puzzle einzigartig zu machen. Beachten Sie grundsätzlich, dass diesP
in eine 16-Bit-Ganzzahl ohne Vorzeichen passt. Ich konvertiereP
nach binär und verwende.
für 0 undO
für 1:Das erste Zeilenelement sind die letzten 15 Bits,
t[1:]
während das zweite Zeilenelement das erste Bit istt[0]
. Ich konnte nicht alles in eine Zeile schreiben, da die minimale Breite 15 ist, was nicht für alle 16 Bits passen würde, wennP
schreiben, > 32767 Die ersten beiden Zeilen repräsentieren also eindeutig jeden der möglichen Werte vonP
.Die dritte Reihe ist eine volle Wand, so dass der Wert von
P
keinen Einfluss auf die Lösung hat.Folgen Sie dann den tatsächlichen Labyrinthelementen. Diese Linie druckt sie alle und wiederholt sie bis zur Kappe. Das Ergebnis ist wie oben dargestellt:
Der Rest wollte nur herausfinden, wie man das dynamisch erzeugte Labyrinth löst. Dies hängt nur von der Breite des Labyrinths ab. Ich stellte fest, dass die Lösungen für eine gegebene Breite waren:
usw. Daher wird es nur
URDR
wiederholt und an der richtigen Stelle abgeschnittenW+W%2
.quelle