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).
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):
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.
Respostas:
Pitão, 74 bytes
Uma tradução ainda mais otimizada da resposta de Uri Zarfaty.
fonte
"\
- é claro, não há aleatoriedade, mas é sempre uma caminhada válida!Python 2,
300285257246236 bytesAlgo para começar. Deve ser possível diminuir ainda mais isso. Obrigado @ Maltysen por cortar 10 bytes.
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).
fonte
"".join
oj in f(1)
loop e imprimir diretamente.PHP 5.5 - 209 bytes
Ungolfed:
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
$X
e$Y
matrizes para determinar min / max no loop de saída.Uso:
fonte
Pitão - 89
Esta é basicamente uma tradução da resposta de Uri Zarfaty, embora eu tenha feito algumas otimizações.
Explicação em breve.
Experimente aqui .
fonte