Narysuj losowy spacer z ukośnikami

14

Napisz program lub funkcję, która przyjmuje dodatnią liczbę całkowitą N (za pomocą stdin / wiersza poleceń / funkcji arg) i wypisuje lub zwraca ciąg reprezentujący dwuwymiarowe losowe przejście o długości N kroków, narysowane ukośnikami: / \(plus spacje i nowe linie dla odstępów).

Spacer losowy 2D rozpoczyna się u źródła nieskończonej sieci całkowitej . Następnie kilkakrotnie N razy kierunek główny (w górę, w dół, w lewo, w prawo) jest losowo wybierany równomiernie, a piechur porusza się o jedną jednostkę w tym kierunku. Otrzymana ścieżka jest losowym spacerem.

Oto losowy spacer dla N = 6. Zwróć uwagę, że wraca on z powrotem po osiągnięciu (-1, 3).

N = 6 losowy przykład przejścia

Aby narysować to ukośnikami, musimy zasadniczo obrócić całość o 45 ° zgodnie z ruchem wskazówek zegara. Osie oraz punkty początkowy i końcowy nie są rysowane w wersji ukośnej.

/
\
 \
 /\

Bardziej złożony spacer taki jak ten (N = 20, choć nie ma sposobu, aby powiedzieć):

N = 20 losowy przykład przejścia

Byłby to:

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

Twój program musi wygenerować tego typu ukośne wersje losowych spacerów. Ci muszą losowo wybrać każdy nowy kierunek Spacer trwa, więc każda prowadzenie programu dla pewnego N będzie prawie na pewno produkować inny spacer. (Pseudolosowość jest w porządku.)

Nigdy nie powinny być żadnych pustych linii powyżej lub poniżej najniższych i najwyższych ukośników (z wyjątkiem jednej opcjonalnej nowej linii końcowej), i nigdy nie powinny być puste kolumny odstępów przed lub po skrajnych lewych i skrajnych prawych ukośnikach.

Tak więc dla N = 1 wynik zawsze /lub \, ale nigdy coś takiego:

   
 / 

Końcowe spacje są dozwolone, o ile nie przechodzą obok kolumny skrajnego prawego ukośnika.

Zgłoszenie z najmniejszą liczbą bajtów wygrywa. Oto przydatny licznik bajtów.

Hobby Calvina
źródło
więc jest możliwe (choć rzadkie), że wyjście może być pojedynczym cięciem, nawet gdy N = 20?
DaveAlger
2
@DaveAlger Sure. Chociaż jeśli twój program tak często to robi, spodziewam się, że coś jest nie tak.
Calvin's Hobbies

Odpowiedzi:

3

Pyth, 74 bajty

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

Jeszcze bardziej zoptymalizowane tłumaczenie odpowiedzi Uri Zarfaty'ego.

orlp
źródło
1
Mam lepsze rozwiązanie Pyth: "\ - oczywiście nie ma przypadkowości, ale za każdym razem jest to prawidłowy spacer!
theonlygusti
@ thehelylygusti Mam więc coraz lepsze rozwiązanie: \\.
orlp
Nie rozumiem ...
theonlygusti
@theonlygusti Backslash w Pyth rozpoczyna stałą 1 znak. Och, czekaj, nieważne, nie jest krótszy xD
lub
5

Python 2, 300 285 257 246 236 bajtów

Coś na początek. Powinno być możliwe dalsze zmniejszenie tego. Dzięki @Maltysen za golenie 10 bajtów.

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))

Generuje wyjście marszu do słownika G odwiedzonych krotek (x, y), aktualizując naszą lokalizację w miarę upływu czasu. Każdy losowy krok n jest zarówno u / d (u), jak i l / r (l).

Uri Granta
źródło
3
Schludny. N = 100000, rozmiar czcionki 1.
Hobby Calvina
1
Można zaoszczędzić sporo ze "".joinw j in f(1)pętli i drukowanie bezpośrednio.
Maltysen
1

PHP 5.5 - 209 bajtów

<?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;

Nie golfowany:

<?
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;

Rozpoczęłam pracę nad odpowiedzią PHP od zera, ale ostateczny kod zbyt bardzo przypominał pracę @Uri Zarfaty, więc naprawdę nie miałem odwagi go opublikować. Zamiast tego przeniesiono odpowiedź z kilkoma modyfikacjami. Wpycha wartości x / y do tablic $Xi $Yokreśla min / maks w pętli wyjściowej.

Stosowanie:

php golf.php 200
mhall
źródło
1

Pyth - 89

Jest to w zasadzie tłumaczenie odpowiedzi Uri Zarfaty'ego, chociaż dokonałem pewnych optymalizacji.

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

Wyjaśnienie już wkrótce.

Wypróbuj tutaj .

Maltysen
źródło