Dibuja una caminata aleatoria con barras

14

Escriba un programa o función que tome un entero positivo N (a través de stdin / línea de comando / función arg) e imprima o devuelva una representación de cadena de una caminata aleatoria bidimensional que tiene N pasos de largo, extraída de barras: / \(más espacios y nuevas líneas para espaciado).

Una caminata aleatoria en 2D comienza en el origen de una red infinita de enteros . Luego, N veces repetidamente, se elige una dirección cardinal (arriba, abajo, izquierda, derecha) de manera uniforme al azar y el caminante mueve una unidad en esa dirección. La ruta resultante tomada es la caminata aleatoria.

Aquí hay una caminata aleatoria para N = 6. Observe que atraviesa sobre sí misma cuando alcanza (-1, 3).

N = 6 ejemplo de caminata aleatoria

Para dibujar esto con barras, esencialmente necesitamos rotar todo 45 ° en sentido horario. Los ejes y los puntos de inicio y finalización no se dibujan en la versión de barra diagonal.

/
\
 \
 /\

Una caminata más compleja como esta (N = 20, aunque no hay forma de saberlo):

N = 20 ejemplo de caminata aleatoria

Se convertiría en esto:

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

Su programa necesita generar este tipo de versiones de barra de caminatas aleatorias. Usted debe elegir aleatoriamente cada nueva dirección del paseo dura, por lo que cada ejecución del programa durante un cierto N será casi definitivamente producir un paseo diferente. (La pseudoaleatoriedad está bien).

Nunca debe haber líneas vacías encima o debajo de las barras inclinadas más bajas y más altas (excepto una nueva línea final opcional), y nunca debe haber columnas de espacios vacías antes o después de las barras inclinadas más a la izquierda y a la derecha.

Entonces, para N = 1, la salida es siempre /o \, pero nunca algo como:

   
 / 

Los espacios finales están permitidos siempre que no pasen la columna de la barra diagonal derecha.

El envío con la menor cantidad de bytes gana. Aquí hay un práctico contador de bytes.

Pasatiempos de Calvin
fuente
Entonces, ¿es posible (aunque raro) que la salida pueda ser una sola barra incluso cuando N = 20?
DaveAlger
2
@DaveAlger Claro. Aunque si su programa lo hace mucho, esperaría que algo esté muy mal.
Aficiones de Calvin

Respuestas:

3

Pyth, 74 bytes

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

Una traducción aún más optimizada de la respuesta de Uri Zarfaty.

orlp
fuente
1
Tengo una mejor solución Pyth: "\ - por supuesto, no hay aleatoriedad, ¡pero es una caminata válida siempre!
theonlygusti
@theonlygusti Entonces tengo una solución cada vez mejor: \\.
orlp
No conseguirlo ...
theonlygusti
@theonlygusti Backslash en Pyth comienza una constante de 1 carácter. Oh, espera, no importa, no es más corto xD
orlp 05 de
5

Python 2, 300 285 257 246 236 bytes

Algo para patear las cosas. Debería ser posible reducir esto aún más. Gracias @Maltysen por afeitar 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))

Genera la salida de caminata en un diccionario G de tuplas visitadas (x, y), actualizando nuestra ubicación a medida que avanzamos. Cada paso aleatorio n es u / d (u) y l / r (l).

Uri Granta
fuente
3
Ordenado. N = 100000, tamaño de fuente 1.
Calvin's Hobbies
1
Puede ahorrar mucho "".joinen el j in f(1)bucle e imprimir directamente.
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;

Sin golf:

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

Comencé a trabajar en una respuesta PHP desde cero, pero el código final se parecía demasiado al trabajo de @Uri Zarfaty, así que realmente no tuve el descaro de publicarlo. Terminé portando dicha respuesta con algunas modificaciones en su lugar. Empuja x / y valores en $Xy $Ymatrices para determinar min / max en el bucle de salida.

Uso:

php golf.php 200
mhall
fuente
1

Pyth - 89

Esto es básicamente una traducción de la respuesta de Uri Zarfaty, aunque hice algunas optimizaciones.

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

Explicación próximamente.

Pruébalo aquí .

Maltysen
fuente