Ich weiß, dass es einen ähnlichen (alten) Thread gibt ( hier) ) , aber ich möchte ihn mit einigen Änderungen neu starten.
Das Ziel: Erstellen Sie ein zufällig aussehendes Labyrinth mit einem Algorithmus Ihrer Wahl und geben Sie das Labyrinth grafisch aus ( Anzahl der Ausdrucke).
- Die Breite und Höhe bestimmen Sie.
- Es sollte mindestens einen Weg von mindestens einem Eingang zu mindestens einem Ausgang geben.
- Das Format des Labyrinths (wie Sie es anzeigen, Eingang (e) oder Ausgang (e) markieren) liegt ebenfalls bei Ihnen.
- Je schöner, desto besser.
- Trivial-Labyrinthe (z. B. leere Labyrinthe, Gitter-Labyrinthe, Labyrinthe der Größe 1x1) werden nicht empfohlen.
- Zyklen im Labyrinth sind erlaubt und werden empfohlen, wenn das Ergebnis angemessen ist.
- Sprachmissbrauch wird gefördert.
- Das Labyrinth sollte einigermaßen zufällig aussehen (aber ein vollständig deterministischer (z. B. chaotischer) Algorithmus, der dies erzeugt, ist auch in Ordnung).
Bearbeiten: Der Hauptfokus liegt hier auf der kleinstmöglichen Implementierung. Ich möchte jedoch einen gewissen Spielraum innerhalb dieser Einschränkung einräumen, um den Glanz zu fördern. Ich habe absichtlich genau gelassen, welche "Merkmale" das Labyrinth offen hat, aber als grobe Richtlinie sollten Sie versuchen, die meiste Menge an Knall in das am wenigsten lexikalische Geld zu packen.
code-golf
popularity-contest
maze
imallett
quelle
quelle
Antworten:
C:
265253 Bytes(Erfordert ein Terminal mit 65 Zeichen) Erzeugt ein relativ zufälliges 31x31-Labyrinth mit einem garantierten Pfad vom Eingang zum Ausgang.
Beispielausgabe (mit simuliertem Terminal mit 65 Zeichen):
quelle
int p,int c
.p,c
ist genug ...Mathematica,
144132 BytesSeit Inception wissen wir alle, wie ein Labyrinth am effizientesten gezeichnet werden kann .
Ungolfed und Beispielausgabe:
Natürlich sind die Linien die Wände. Du bist der Minotaurus, der in der Mitte beginnt und aussteigen muss.
quelle
C: 364 Bytes
Hinweis: Oben habe ich Zeilenumbrüche hinzugefügt, damit sie auf die Seite passen. Erwartete Ausgabe (auf einem Terminal mit 80 Zeichen) (Anfang und Ende oben links beachten):
quelle
Mathematica,
134.130ZeichenTatsächlich können wir diesen Algorithmus verwenden, um aus jedem (ungerichteten) Graphen ein Labyrinth zu generieren.
Erstellen Sie beispielsweise ein Labyrinth aus dem Tourdiagramm des 8 * 8- Ritters (
KnightTourGraph[8,8]
):quelle
Bash, 53 Bytes
Ähnliche Idee zum C64-Code. Verwendet Unicode-Zeichen als Schrägstriche, da sie in einem Terminal, das Unicode unterstützt, viel besser aussehen. Beispielausgabe auf dem OS X-Terminal (Menlo-Schriftart):
quelle
yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash
. Sehen Sie diesen BeitragJavaScript (ES6), 174
Dies ist der Labyrinthbauer, den ich in dieser anderen Herausforderung verwendet habe , nur Golf. Es ist eine Funktion mit 2 Parametern: Zeilen und Spalten. Das Labyrinth ist vollständig ohne Schleifen verbunden, sodass jeder Ort der Start- oder Endpunkt sein kann.
Beispiel
Ausgabe
Prüfung
quelle
ZX Basic - 54 Zeichen
Hier ist das Labyrinth, das eine Route durch das Labyrinth zeigt (Leerzeichen zwischen den Linien)
und ein kleiner Ausschnitt aus der Zeit, als ich dies zum ersten Mal tat (vor einigen Jahren) und ein bisschen Zeit damit verbrachte, bessere Grafiken zu machen.
quelle
BBC BASIC, 18 Bytes
Eine Längenverbesserung gegenüber der 23-Byte-C64-Endlosschleifenversion von @nneonneo. VDU sendet ein einzelnes Zeichen an den VDU-Controller: entweder 2 + 1 * 45 = ASCII 47
/
oder 2 + 2 * 45 = ASCII 92\
BBC BASIC, 35 Bytes /
10795 Bytes35 Bytes sind nur für die letzte Zeile, was ein 25-Zeilen-Labyrinth in 40-Spalten-Layout ergibt. MODE1 stellt sicher, dass kein zusätzlicher Abstand zwischen den Zeilen verbleibt. Der Rest des Programms ist optional und verbessert die Formatierung. Die VDU23-Anweisungen definieren die Schriftart für die Zeichen 47 und 92 neu (8 Bytes bilden eine 8x8-Bitmap). Ich füge in allen vier Ecken ein helles Pixel ein, um zu verhindern, dass gerade Abläufe eingeklemmt werden. Der Nebeneffekt davon ist, dass ein Punkt in den leeren Diamanten erscheint. Insgesamt 107 Byte, einschließlich 2 Zeilenumbrüche.
Das Editieren dieses Programms kann auf 95 Byte verkürzt werden, indem einige der 8-Bit-VDU-Codes in 16-Bit-Small-Endian-Werte (durch ein Semikolon nach ihnen anstelle eines Kommas gekennzeichnet) codiert und die MODE-Anweisung wie folgt als Paar von VDU-Codes dargestellt werden .
Ausgabe
Verwenden von BBC Basic für Windows von bbcbasic.co.uk
Letzte Zeile nur 35 Bytes
Gesamtes Programm,
10795 BytesWie ich @ Brians Antwort kommentierte, teilt der Schrägstrich das Quadrat in zwei dunkle Dreiecke, von denen jedes genau zwei Ein- / Ausgänge hat. Dies garantiert einen (trivialen, unverzweigten) Pfad von einem beliebigen Punkt am Rand des Labyrinths zu einem anderen Punkt am Rand des Labyrinths. Viele davon sind sehr kurz, aber es scheinen immer ein paar lange zu sein. Natürlich gibt es in der Mitte des Labyrinths auch einige Schleifen.
Da andere Antworten dies nicht erwähnt haben, möchte ich mir die hellen Bereiche genauer ansehen. Diese sind durch dunkle Bereiche begrenzt, daher berührt ein heller Bereich, der außen von N dunklen Bereichen begrenzt ist, den Rand des Feldes an N (genau so vielen) Punkten. Daher treten einige ziemlich große helle Bereiche auf, und diese bilden interessante, verzweigte Irrgärten.
Im folgenden Beispiel können Sie die Rohausgabe (Monochrom) aus meinem Programm sehen. Darunter habe ich (mit Windows Paint) die beiden längsten dunklen Bereiche blau eingefärbt. Dann habe ich den größten hellen Bereich gelb und die beiden blau umrandeten Bereiche rot und grün eingefärbt. Die gelben, grünen (und sogar die roten) Labyrinthe sind sehr interessant und nicht trivial.
EDIT - Automatische Auswahl von Labyrinthen und Starts / Ends
Für eine weitere Zeile (59 Zeichen) kann das Programm automatisch bis zu 6 Labyrinthe auswählen, indem Sie nach dem Zufallsprinzip Quadrate auswählen und die Farben Rot, Grün, Gelb, Blau, Magenta und Cyan füllen. Es wird nicht immer eine volle 6 gefunden, da es nichts tut, wenn es ein zufälliges Quadrat auswählt, das bereits gefärbt wurde.
Der Rest des Codes unten zeigt einen Anfang für jede Farbe, indem jede Spalte von oben nach unten und von links nach rechts gescannt wird und das erste Quadrat ausgewählt wird, auf das sie trifft. Es nimmt ein Ende, indem es in die entgegengesetzte Richtung scannt.
Dies erzeugt eine Reihe von farbenfrohen, ineinander verschlungenen Irrgärten. Manchmal sind sie so miteinander verflochten, als müssten sich die Irrgärten irgendwo kreuzen. Aber natürlich nicht!
Zusätzlicher Code und Ausgabe 59 + 187 = 246 zusätzliche Zeichen, die am Ende des ursprünglichen Programms hinzugefügt werden sollen (zur Verbesserung über die Frage-Spezifikation hinaus)
quelle
C: 235 Bytes
Hinweis: Oben habe ich Zeilenumbrüche hinzugefügt, damit sie auf die Seite passen. Erwartete Ausgabe (auf einem Terminal mit 80 Zeichen):
Ich bedaure, dass dies kein sehr hartes Labyrinth ist (in der Tat ist kein Zurückverfolgen zu inneren Ringen erforderlich (und Sie sollten in der Lage sein, einen Pfad vom Umfang zum Zentrum zu finden). Es hat jedoch eine schöne Implementierung von Bresenhams Kreis Zeichnungsalgorithmus im Kern.
quelle
i+=2
ani+=3
, könnte es klar sein , was passiert.Ich habe meinem Kind dabei geholfen, ein bisschen Programmieren zu lernen: http://jsfiddle.net/fs2000/4KLUC/34/ Wie gefällt es dir?
quelle
Commodore 64 BASIC - 38 Bytes
Dies ist nicht meine Erfindung, ich wiederhole einfach ein sehr schönes und kurzes Programm vergangener Tage. Tatsächlich gibt es ein ganzes Buch, das
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
diesen Code feiert!Sie können die Ausgabe auf diesem YouTube-Video sehen . Hier ist eine Screencap:
Hier bei dieser StackOverflow-Frage sind weitere Implementierungen dieses Labyrinth-Generator-Programms. Die kürzeste Implementierung des Programms ist das folgende 23-Byte-C64-BASIC-Programm, das vom Autor dieser Frage veröffentlicht wurde:
Hier werden Kleinbuchstaben unverändert und Großbuchstaben mit der Umschalttaste eingegeben (diese werden auf einem tatsächlichen C64-Bildschirm unterschiedlich dargestellt).
quelle
Java: 700
Hier ist ein rekursiver Wandaddierer. Der Algorithmus wird auf dieser Site beschrieben :
Grundsätzlich wird jedes Rechteck mit einer Wand (und einem Durchgang) in zwei Teile geteilt, dann werden die Rechtecke in zwei Teile geteilt usw. Es wird ein "perfektes" Labyrinth erzeugt - eines ohne Zyklen - das einen Pfad von jedem Punkt zu jedem anderen Punkt hat. Viele Sackgassen, daher ist es für größere Labyrinthe in keiner Weise "trivial".
So kann der Ein- und Ausgang beliebig entschieden werden. Wenn ich eine auswählen muss, heißt es einfach oben / links und unten / rechts.
Es wird in Ascii mit doppelter Breite gezeichnet, daher ist es eine gute Idee, die Ausgabe an eine Datei weiterzuleiten, wenn Sie eine Datei beliebiger Größe erstellen. Hier ist eine 20x20 in Konsole:
Und eine 100x100 in Notepad ++ (ich musste herauszoomen, um alles zu bekommen, also ist es etwas ... klein ):
Code mit Zeilenumbrüchen:
quelle
ZX Basic - 281 Zeichen
Dies ist eher ein "richtiges" Labyrinth, weniger golferisch, aber mehr fusselig. Sogenannter binärer Labyrinthalgorithmus, jede Zelle kann einen Ausgang haben, der nach unten oder rechts geht, aber nicht beides. (Enthält jetzt markierte Anfangsbuchstaben "S" und Endbuchstaben "E", um zu verhindern, dass man nur eine Seite entlang fährt).
Das "::" ist die Art und Weise, wie ZXB Spectrum-Grafikzeichen in eine Textdatei eingibt. Dies entspricht einem verkauften Blockzeichen.
quelle
C-244
So sieht es aus:
Hinweis: Diese Lösung ist inspiriert vom nicht vertrauenswürdigen Spiellevel 8: in den Wald.
quelle