Desenhe uma caminhada aleatória com barras

14

Escreva um programa ou função que receba um número inteiro positivo N (via stdin / linha de comando / função arg) e imprima ou retorne uma representação de seqüência de caracteres de uma caminhada aleatória bidimensional com N passos de comprimento, desenhada a partir de barras: / \(mais espaços e novas linhas de espaçamento).

Uma caminhada aleatória 2D começa na origem de uma rede infinita de números inteiros . Então N vezes repetidamente, uma direção cardinal (para cima, para baixo, esquerda, direita) é escolhida uniformemente aleatoriamente e o caminhante move uma unidade nessa direção. O caminho resultante é a caminhada aleatória.

Aqui está um passeio aleatório para N = 6. Observe que ele volta para si quando atinge (-1, 3).

N = 6 exemplo de passeio aleatório

Para desenhar isso com barras, precisamos essencialmente girar a coisa toda 45 ° no sentido horário. Os eixos e os pontos inicial e final não são desenhados na versão barra.

/
\
 \
 /\

Uma caminhada mais complexa como esta (N = 20, embora não haja como saber):

N = 20 exemplo de passeio aleatório

Se tornaria este:

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

Seu programa precisa gerar esse tipo de versões de barra de passeios aleatórios. Você deve escolher aleatoriamente cada nova direção que a caminhada tomar, para que cada execução do programa para um determinado N produza quase definitivamente uma caminhada diferente. (Pseudo-aleatório é bom.)

Nunca deve haver linhas vazias acima ou abaixo das barras mais baixas e mais altas (exceto uma nova linha opcional à direita) e nunca deve haver colunas vazias de espaços antes ou depois das barras mais à esquerda e mais à direita.

Portanto, para N = 1, a saída é sempre /ou \, mas nunca algo como:

   
 / 

Os espaços à direita são permitidos desde que não passem pela coluna da barra mais à direita.

O envio com o menor número de bytes vence. Aqui está um prático contador de bytes.

Passatempos de Calvin
fonte
então é possível (embora raro) que a saída possa ser uma única barra, mesmo quando N = 20?
DaveAlger
2
@DaveAlger Sure. Embora se seu programa faz muito isso, eu esperaria que algo estivesse muito errado.
Calvin's Hobbies

Respostas:

3

Pitão, 74 bytes

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

Uma tradução ainda mais otimizada da resposta de Uri Zarfaty.

orlp
fonte
1
Eu tenho uma solução Pyth melhor: "\ - é claro, não há aleatoriedade, mas é sempre uma caminhada válida!
theonlygusti
@theonlygusti Então eu tenho uma solução cada vez melhor: \\.
Orlp
Não entendi ...
theonlygusti
@theonlygusti A barra invertida em Pyth inicia uma constante de 1 caractere. Oh espera, deixa pra lá, não é mais curto xD
orlp
5

Python 2, 300 285 257 246 236 bytes

Algo para começar. Deve ser possível diminuir ainda mais isso. Obrigado @ Maltysen por cortar 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))

Gera a saída de caminhada em um dicionário G de tuplas visitadas (x, y), atualizando nossa localização à medida que avançamos. Cada passo aleatório n é u / d (u) e l / r (l).

Uri Granta
fonte
3
Arrumado. N = 100000, o tamanho da fonte 1.
de Calvin passatempos
1
Você pode economizar muito com "".joino j in f(1)loop e imprimir diretamente.
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;

Comecei a trabalhar em uma resposta PHP a partir do zero, mas o código final lembrava muito o trabalho de @Uri Zarfaty, então eu realmente não tive coragem de publicá-lo. Acabamos portando a resposta com algumas modificações. Insere valores x / y em $Xe $Ymatrizes para determinar min / max no loop de saída.

Uso:

php golf.php 200
mhall
fonte
1

Pitão - 89

Esta é basicamente uma tradução da resposta de Uri Zarfaty, embora eu tenha feito algumas otimizações.

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

Explicação em breve.

Experimente aqui .

Maltysen
fonte