Disegna una passeggiata casuale con barre


14

Scrivi un programma o una funzione che accetta un numero intero positivo N (tramite stdin / riga di comando / arg funzione) e stampa o restituisce una rappresentazione di stringa di una camminata casuale bidimensionale che è lunga N passi, disegnata da barre: / \(più spazi e newline per la spaziatura).

Una camminata casuale 2D inizia all'origine di un reticolo intero infinito . Quindi N volte ripetutamente, una direzione cardinale (su, giù, sinistra, destra) viene scelta in modo uniforme a caso e il deambulatore muove un'unità in quella direzione. Il percorso risultante è la camminata casuale.

Ecco una camminata casuale per N = 6. Nota che torna indietro su se stessa quando raggiunge (-1, 3).

N = 6 esempio di camminata casuale

Per disegnare questo con le barre dobbiamo essenzialmente ruotare l'intera cosa di 45 ° in senso orario. Gli assi e i punti iniziale e finale non vengono disegnati nella versione barra.

/
\
 \
 /\

Una passeggiata più complessa come questa (N = 20, anche se non c'è modo di dirlo):

N = 20 esempio di camminata casuale

Diventerebbe questo:

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

Il tuo programma deve generare questo tipo di versioni slash di passeggiate casuali. È necessario scegliere a caso ogni nuova direzione la passeggiata dura, così ogni esecuzione del programma per un certo N sarà quasi sicuramente produrrà una passeggiata diversa. (Pseudorandomness va bene.)

Non dovrebbero mai esserci linee vuote sopra o sotto le barre più basse e più alte (tranne una nuova riga finale facoltativa) e non dovrebbero mai esserci colonne vuote di spazi prima o dopo le barre più a sinistra e più a destra.

Quindi per N = 1, l'output è sempre /o \, ma mai qualcosa del genere:

   
 / 

Gli spazi finali sono consentiti purché non superino la colonna della barra più a destra.

Vince l'invio con il minor numero di byte. Ecco un utile contatore di byte.


quindi è possibile (anche se raro) che l'output possa essere una singola barra anche quando N = 20?
DaveAlger,

2
@DaveAlger Certo. Tuttavia, se il tuo programma lo fa molto, mi aspetto che qualcosa sia molto sbagliato.
Calvin's Hobbies

Risposte:


3

Pyth, 74 byte

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

Una traduzione ancora più ottimizzata della risposta di Uri Zarfaty.


1
Ho una soluzione Pyth migliore: "\ - certo, non c'è casualità, ma è sempre una camminata valida!
theonlygusti,

@theonlygusti Allora ho una soluzione sempre migliore: \\.
orlp,

Non
capirlo

@theonlygusti Backslash in Pyth inizia una costante di 1 carattere. Oh aspetta, non
importa

5

Python 2, 300 285 257 246 236 byte

Qualcosa per dare il via alle cose. Dovrebbe essere possibile ridurlo ulteriormente. Grazie @Maltysen per la rasatura di 10 byte.

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

Genera l'output della camminata in un dizionario G di tuple visitate (x, y), aggiornando la nostra posizione mentre procediamo. Ogni passaggio casuale n è sia u / d (u) che l / r (l).



1
Puoi risparmiare molto con "".joinal j in f(1)loop e stampare direttamente.
Maltysen,

1

PHP 5,5 - 209 byte

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

Ho iniziato a lavorare su una risposta PHP da zero, ma il codice finale somigliava troppo al lavoro di @Uri Zarfaty, quindi non avevo davvero il coraggio di pubblicarlo. Finì il porting di detta risposta con alcune modifiche invece. Inserisce i valori x / y $Xe gli $Yarray per determinare min / max nel loop di uscita.

Uso:

php golf.php 200

1

Pyth - 89

Questa è fondamentalmente una traduzione sulla risposta di Uri Zarfaty, anche se ho fatto alcune ottimizzazioni.

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

Spiegazione in arrivo.

Provalo qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.