Schreiben Sie ein Programm oder eine Funktion, die drei Ganzzahlen, eine Breite w
, eine Höhe h
und eine Schrittzahl enthält s
. Sie werden einen nicht-selbstschneidende zeichnen werden Irrfahrt s
auf einem langen Schritte 5*w
von 5*h
Pixelbild , wo all 5 von 5 Pixelzelle entweder leer (reine beige) ist oder eine dieser zwölf einfachen „Rohre“:
Das Bild oben ist vergrößert, um Details anzuzeigen. Hier sind die Pfeifen in Originalgröße:
(Die grauen Linien dienen nur zur Trennung der Rohrtypen.)
Die zufällige Wanderung ist ein einzelner durchgehender Rohrleitungspfad, der an einem Rohrleitungsendpunkt (einer der unteren vier Rohrleitungstypen) beginnt und an einem anderen Rohrleitungsendpunkt endet.
Beginnen Sie mit einem leeren w
durch h
Gitter und zufällig wählen Sie eine Zelle der Ausgangspunkt zu sein. Wählen Sie dann nach dem Zufallsprinzip eine der vier Richtungen, in die Sie starten möchten, und zeichnen Sie den entsprechenden Rohrendpunkt. Diese Startzelle markiert den ersten Schritt auf Ihrem Weg. Jedes Mal, wenn Sie eine neue Zelle zeichnen oder eine vorhandene Zelle überschreiben, wird dies als weiterer Schritt gewertet.
Wählen Sie nun wiederholt nach dem Zufallsprinzip, ob Sie nach rechts, links oder gerade gehen möchten, und zeichnen Sie die entsprechende Rohrzelle, wenn die gewählte Richtung gültig ist. Zurückverfolgen und erneut auswählen, wenn eine Richtung nicht gültig ist, bis der vollständige s
Schrittpfad gebildet ist. Der Pfad sollte mit einem Pipe-Endpunkt enden, der sich je nach Verlauf des Pfades an einer beliebigen Stelle im Raster befinden kann.
Es ist sehr wichtig zu beachten, dass nur die beiden geraden Rohrzellen überschrieben werden können und nur die gerade Rohrzelle mit der entgegengesetzten Ausrichtung. Das Ergebnis ist eine Schnittzelle. Ansonsten müssen alle Rohre in leere Zellen gelegt werden.
Wenn eine Kreuzung gezeichnet wird, sollte der Teil des Pfades, der weiter von der Startzelle entfernt ist, oben gezeichnet werden.
Es liegt an Ihnen, ob das Gitter periodische Randbedingungen (PBC) aufweist oder nicht , dh ob ein Rohr, das aus einer Seite des Gitters austritt, auf der anderen Seite austritt. Ohne PBC gilt die Gittergrenze als Barriere, auf die Sie wie auf andere Rohre stoßen können.
Spezialfälle
- Wenn
s
0 ist , sollte keine Rohre gezogen werden , und die Ausgabe sollte leer sein5*w
durch5*h
Bildes (dh alle beige). Wann
s
ist 1 ein einzelner Rohrstutzensollte an der zufällig ausgewählten Startzelle gezeichnet werden.
Andere Details
- Sie können davon ausgehen, dass dies
s
höchstens derw*h
Fall ist, damit ein Pfad immer möglich ist. (Obwohl längere Wege aufgrund von Kreuzungen möglich sind.) w
undh
wird immer positiv sein.- Alle zufälligen Entscheidungen müssen einheitlich zufällig sein. Sie sollten zB nicht vermeiden, Schnittpunkte zu erstellen, wenn dies möglich ist, auch wenn dies das Problem erleichtert. Pseudozufallszahlengeneratoren sind zulässig.
- Anstelle von Schwarz, Blau und Beige können drei beliebige visuell unterschiedliche Farben verwendet werden.
- Ihre Ausgabebilder können so vergrößert werden, dass sie wirklich
5*w*k
aus5*h*k
Pixeln bestehen, bei denenk
es sich um eine positive Ganzzahl handelt. (Es wird empfohlen, die von Ihnen veröffentlichten Beispiele zu vergrößern, auch wenn Siek
1 sind.) - Es kann jedes gängige verlustfreie Bilddateiformat verwendet werden, und das Bild kann in einer Datei gespeichert, angezeigt oder als Standarddatei ausgegeben werden.
Der kürzeste Code in Bytes gewinnt.
Beispiele
(Alle um 500% vergrößert.)
Wenn die Eingabe ist, w=2, h=1, s=0
ist die Ausgabe immer:
Wenn es sich bei der Eingabe w=2, h=1, s=1
um eine Eingabe handelt, handelt es sich bei der Ausgabe um eines der folgenden Bilder mit gleicher Wahrscheinlichkeit:
Wenn der Eingang ist, w=2, h=1, s=2
ist der Ausgang
oder möglicherweise
wenn das Netz PBC haben soll.
(Beachten Sie, dass das Starten des Pfades einen zweiten Schritt unmöglich machen würde.)
Hier sind einige mögliche Ausgaben für w=3, h=2, s=6
PBC:
Hier ist eine mögliche Ausgabe w=3, h=3, s=9
unter der Annahme von PBC:
Beachten Sie, dass der Pfad nicht alle Zellen abdecken musste, da der Schnittpunkt als zwei Schritte gezählt wurde. Wir können auch schließen, dass der Eckendpunkt die Startzelle war, da die Kreuzungsüberführung danach gezeichnet worden sein muss. So können wir die Reihenfolge der zufälligen Entscheidungen ableiten, die getroffen wurden:
start at top left, facing east
go straight
go right
go right
go right
go straight
go left
go right
end
Abschließend einige Beispiele für w=4, h=5, s=20
und w=4, h=5, s=16
:
quelle
You will be drawing a non-self-intersecting random walk
... schneidet es sich selbst oder nicht?Antworten:
CJam, 274
Probieren Sie es online aus
Verwendet PBC und gibt im PGM-Format aus. Sie können
:+
das Ende entfernen , um eine bessere visuelle Ausgabe im Browser zu erhalten.Es ist sehr langsam für größere Eingaben, besonders wenn die Schrittzahl in der Nähe des Bereichs liegt.
Beispielergebnis für Eingabe
4 3 10
(skaliert 500%):Kurze Erklärung:
Der allgemeine Ansatz ist:
quelle
QBasic,
517516 Bytesw
,h
unds
von Benutzereingaben, durch Kommas getrennt.Der Ansatz hier ist, bei jedem Schritt eine zufällige Richtung zu wählen und von vorne zu beginnen, wenn dies zu einer ungültigen Bewegung führt. Wir zeichnen die Rohre, während die Anweisungen festgelegt werden, und
POINT
testen anhand der Punkte auf dem Bildschirm unsere Gültigkeitsbedingungen. Ein Zug ist gültig, wenn er nicht über die Grenzen des Gitters hinausgeht und:Wie die CJam-Antwort von aditsu ist dieser Code sehr langsam und kann verblüffend langsam sein, wenn er
s
einen signifikanten Bruchteil von ausmachtw*h
. Bei meinem QB64-Setup wird die Frage5,5,19
ziemlich schnell beantwortet , es dauert jedoch länger, als ich bereit war, darauf zu warten5,5,20
.Wenn Sie größere / dichter gepackte Beispiele ausführen möchten, ist hier mein ursprünglicher Ansatz unter Verwendung einer Tiefensuche . Es ist viel effizienter und kostet satte 300 zusätzliche Bytes.
Beispielausgabe für Eingaben
10, 10, 100
, tatsächliche Größe:Eine noch schickere Version finden Sie in diesem Kern . Abgesehen davon, dass der DFS-Algorithmus unbemerkt und ausführlich kommentiert ist, erhöht er die Ausgabe um einen konstanten Faktor und ermöglicht eine festgelegte Verzögerung zwischen den Schritten, sodass Sie den DFS-Algorithmus bei der Arbeit beobachten können. Hier ist ein Beispiellauf:
quelle