Zeichnen Sie einen zufälligen Spaziergang mit Schrägstrichen

14

Schreiben Sie ein Programm oder eine Funktion, die eine positive Ganzzahl N (über stdin / command line / function arg) einliest und eine Zeichenfolgendarstellung eines zweidimensionalen zufälligen Wegs ausgibt oder zurückgibt , der N Schritte lang ist und aus Schrägstrichen besteht: / \(plus Leerzeichen und Zeilenumbrüche für Abstände).

Ein 2D-Zufallsrundgang beginnt am Ursprung eines unendlichen Ganzzahlgitters . Dann wird N-mal wiederholt eine Kardinalrichtung (oben, unten, links, rechts) gleichmäßig nach dem Zufallsprinzip gewählt und der Läufer bewegt sich eine Einheit in diese Richtung. Der daraus resultierende Weg ist der zufällige Weg.

Hier ist ein zufälliger Weg für N = 6. Beachten Sie, dass es auf sich selbst zurückgeht, wenn es (-1, 3) erreicht.

N = 6 Beispiel für eine zufällige Wanderung

Um dies mit Schrägstrichen zu zeichnen, müssen wir das ganze Ding im Uhrzeigersinn um 45 ° drehen. Die Achsen sowie Start- und Endpunkte werden in der Schrägstrichversion nicht gezeichnet.

/
\
 \
 /\

Eine komplexere Wanderung wie diese (N = 20, obwohl es keine Möglichkeit gibt zu sagen):

N = 20 Beispiel für eine zufällige Wanderung

Würde das werden:

     /
/\/ /\
\/\/
/\/
\/

Ihr Programm muss diese Art von Schrägstrichen für zufällige Spaziergänge generieren. Sie müssen nach dem Zufallsprinzip jede neue Richtung für die Wanderung auswählen, sodass jedes Programm für ein bestimmtes N mit ziemlicher Sicherheit eine andere Wanderung ergibt. (Pseudozufälligkeit ist in Ordnung.)

Es sollten keine Leerzeilen über oder unter dem niedrigsten und höchsten Schrägstrich (mit Ausnahme eines optionalen abschließenden Zeilenumbruchs) und keine Leerzeilenspalten vor oder nach dem ganz linken und ganz rechten Schrägstrich vorhanden sein.

Für N = 1 ist die Ausgabe also immer /oder \, aber niemals so etwas wie:

   
 / 

Nachgestellte Leerzeichen sind zulässig, solange sie nicht über die Spalte mit dem Schrägstrich ganz rechts hinausgehen.

Die Einsendung mit den wenigsten Bytes gewinnt. Hier ist ein praktischer Bytezähler.

Calvins Hobbys
quelle
es ist also möglich (obwohl selten), dass die Ausgabe ein einzelner Schrägstrich ist, auch wenn N = 20?
DaveAlger
2
@ DaveAlger Sicher. Wenn Ihr Programm so viel macht, würde ich allerdings erwarten, dass etwas sehr falsch ist.
Calvins Hobbys

Antworten:

3

Pyth, 74 Bytes

K0VQJO2=GO2 XH,-ZJ-KG@"\/"xJG-=ZtyJ-=KtyG;=YmrhSdheSdCHjbclhYsmh@XkH\ k.xY

Eine noch optimierte Übersetzung der Antwort von Uri Zarfaty.

orlp
quelle
1
Ich habe eine bessere Pyth-Lösung: "\ - Natürlich gibt es keine Zufälligkeit, aber es ist jedes Mal ein gültiger Spaziergang!
Theonlygusti
@theonlygusti Dann habe ich eine immer bessere Lösung: \\.
Orlp
Versteh
@theonlygusti Backslash in Pyth startet eine 1-Zeichen-Konstante. Oh warte, egal, ist nicht kürzer xD
orlp
5

Python 2, 300 285 257 246 236 Bytes

Etwas, um die Dinge anzukurbeln. Es sollte möglich sein, dies weiter zu verkleinern. Vielen Dank an @Maltysen für das Rasieren von 10 Bytes.

from random import*
N=input()
x=y=0;G={}
exec'n=randrange(4);l=n<2;u=n&1;G[(x-l,y-u)]="\\/"[l^u];x-=2*l-1;y-=2*u-1;'*N
f=lambda i:range(min(x[i]for x in G),max(x[i]for x in G)+1)
for i in f(0):print"".join(G.get((i,j)," ")for j in f(1))

Erzeugt die Laufausgabe in ein Wörterbuch G der besuchten (x, y) Tupel und aktualisiert dabei unseren Standort. Jeder Zufallsschritt n ist entweder u / d (u) oder l / r (l).

Uri Granta
quelle
3
Ordentlich. N = 100000, Schriftgröße 1.
Calvins Hobbys
1
Sie können mit "".joinan der j in f(1)Schleife viel sparen und direkt drucken.
Maltysen
1

PHP 5.5 - 209 Bytes

<?for(;$X[]=$x+=1-2*$l,$Y[]=$y+=1-2*$u,$i++<$argv[1];){$m[$y-$u=$n&1][$x-$l=($n=rand(0,3))<2]='\\/'[$u^$l];}for($y=min($Y);$y<max($Y);$y++){for($x=min($X);$x<max($X);$x++)$s.=$m[$y][$x]?:' ';$s.="\n";}echo$s;

Ungolfed:

<?
for (; $X[] = $x += 1 - 2 * $l, $Y[] = $y += 1 - 2 * $u, $i++ < $argv[1];) {
    $m[$y - $u = $n & 1][$x - $l = ($n = rand(0, 3)) < 2] = '\\/'[$u ^ $l];
}
for ($y = min($Y); $y < max($Y); $y++) {
    for ($x = min($X); $x < max($X); $x++) {
        $s .= $m[$y][$x] ? : ' ';
    }
    $s .= "\n";
}
echo $s;

Begann von Grund auf mit der Arbeit an einer PHP-Antwort, aber der endgültige Code ähnelte zu sehr der Arbeit von @Uri Zarfaty, so dass ich wirklich nicht den Mut hatte, ihn zu posten. Die Antwort wurde mit ein paar Modifikationen portiert. Schiebt x / y-Werte in$X und $YArrays, um min / max in der Ausgabeschleife zu bestimmen.

Verwendung:

php golf.php 200
mhall
quelle
1

Pyth - 89

Dies ist im Grunde eine Übersetzung der Antwort von Uri Zarfaty, obwohl ich einige Optimierungen vorgenommen habe.

KZVQJO4=G<J2=b.&J1 XH,-KG-Zb@"\\/".|Gb-=KtyG-=Ztyb)LrhSm@dbHheSm@kbHFNy0jkm?@H,Nb},NbHdy1

Erklärung folgt in Kürze.

Probieren Sie es hier aus .

Maltysen
quelle