Escreva um programa ou função que consiga três números inteiros, largura w
, altura h
e contagem de passos s
. Você desenhará etapas de caminhada aleatória, sem interseção, s
em uma imagem 5*w
por 5*h
pixel, onde cada célula de 5 por 5 pixels está vazia (bege puro) ou um desses doze "tubos" simples:
A imagem acima é ampliada para mostrar detalhes. Aqui estão os tubos no tamanho real:
(As linhas cinza são apenas para separar os tipos de tubos.)
A caminhada aleatória será um único caminho de tubo contínuo que começa em um ponto final do tubo (um dos quatro tipos inferiores de tubos) e termina em outro ponto final do tubo.
Comece com um vazio w
pela h
grade e escolha aleatoriamente uma célula para ser o ponto de partida. Em seguida, escolha aleatoriamente uma das quatro direções para iniciar e desenhe o ponto final do tubo correspondente. Essa célula inicial marca o primeiro passo em sua caminhada e toda vez que você desenha uma nova célula ou sobrescreve uma existente, conta como outra etapa executada.
Agora, repetidamente, escolha aleatoriamente ir para a direita, esquerda ou reta, desenhando a célula de tubo apropriada se a direção escolhida for válida. Volte e escolha novamente se uma direção não for válida até que o s
caminho completo da etapa seja formado. O caminho deve terminar com um ponto final de canal, que pode estar em qualquer lugar da grade, dependendo do curso que o caminho percorreu.
É muito importante observar que apenas as duas células de tubo reto podem ser substituídas e somente pela célula de tubo reto de orientação oposta, o resultado sendo uma célula de interseção. Caso contrário, todos os tubos devem ser colocados em células vazias.
Quando uma interseção é desenhada, a parte do caminho mais distante da célula inicial deve ser desenhada na parte superior.
Cabe a você decidir se a grade possui ou não condições periódicas de contorno (PBC), ou seja, se um tubo saindo de um lado da grade sairá do outro lado. Sem o PBC, o limite da grade conta como uma barreira na qual você pode se deparar como outros tubos.
Casos especiais
- Quando
s
é 0, nenhum tubo deve ser desenhado e a saída deve ficar em branco5*w
por5*h
imagem (ou seja, toda bege). Quando
s
é 1 um esboço de tubo únicodeve ser desenhado na célula inicial escolhida aleatoriamente.
Outros detalhes
- Você pode supor que isso
s
é, no máximow*h
, um caminho sempre será possível. (Embora caminhos mais longos sejam possíveis devido a interseções.) w
eh
sempre será positivo.- Todas as escolhas aleatórias devem ser uniformemente aleatórias. por exemplo, você não deve evitar interseções quando possível, mesmo que isso facilite o problema. Geradores de números pseudo-aleatórios são permitidos.
- Quaisquer três cores visualmente distintas podem ser usadas no lugar do preto, azul e bege.
- Suas imagens de saída podem ser ampliadas para que sejam realmente
5*w*k
em5*h*k
pixels, ondek
é um número inteiro positivo. (É recomendável ampliar qualquer exemplo que você publicar, mesmo que o seuk
seja 1.) - Qualquer formato de arquivo de imagem sem perda comum pode ser usado e a imagem pode ser salva em um arquivo, exibida ou vomitada no modo stdout.
O código mais curto em bytes vence.
Exemplos
(Tudo ampliado em 500%.)
Se a entrada for w=2, h=1, s=0
, a saída será sempre:
Se a entrada for w=2, h=1, s=1
, a saída será uma dessas imagens com a mesma chance:
Se a entrada for w=2, h=1, s=2
, a saída será
ou possivelmente
se a grade tiver PBC.
(Observe que iniciar o caminho tornaria impossível um segundo passo.)
Aqui estão algumas saídas possíveis para w=3, h=2, s=6
, assumindo o PBC:
Aqui está uma saída possível para w=3, h=3, s=9
, assumindo o PBC:
Observe que o caminho não precisava cobrir todas as células devido à interseção contando como duas etapas. Além disso, podemos deduzir que o ponto final do canto era a célula inicial, pois a passagem superior da interseção deve ter sido desenhada posteriormente. Assim, podemos inferir a sequência de escolhas aleatórias que foram feitas:
start at top left, facing east
go straight
go right
go right
go right
go straight
go left
go right
end
Finalmente, aqui estão exemplos de w=4, h=5, s=20
e w=4, h=5, s=16
:
fonte
You will be drawing a non-self-intersecting random walk
... é auto-interseção ou não?Respostas:
CJam, 274
Experimente online
Usa PBC, saídas no formato PGM. Você pode remover o
:+
próximo ao final para obter uma saída visual melhor no navegador.É muito lento para entradas maiores, especialmente se a contagem de etapas estiver próxima à área.
Exemplo de resultado para entrada
4 3 10
(com escala de 500%):Breve explicação:
A abordagem geral é:
fonte
QBasic,
517516 bytesw
,h
es
da entrada do usuário, separados por vírgula.A abordagem aqui é tentar uma direção aleatória em cada etapa e começar do zero se resultar em uma movimentação inválida. Desenhamos os tubos conforme as instruções são decididas e usamos
POINT
para testar pontos na tela para verificar nossas condições de validade. Uma movimentação é válida se não ultrapassar os limites da grade e:Como a resposta CJam do aditsu , esse código é muito lento e pode ser incrivelmente lento se
s
for uma fração significativa dew*h
. Na minha configuração do QB64, ele vem com uma resposta com5,5,19
bastante rapidez, mas leva mais tempo do que eu estava disposto a esperar5,5,20
.Se você deseja executar exemplos maiores / mais compactados, aqui está minha abordagem original usando uma pesquisa profunda . É muito mais eficiente, ao custo de 300 bytes extras.
Exemplo de saída para entradas
10, 10, 100
, tamanho real:Uma versão ainda mais sofisticada pode ser encontrada nesta essência . Além de ser totalmente destruído e completamente comentado, ele aumenta a saída por um fator constante e permite um atraso definido entre as etapas, permitindo que você assista o algoritmo DFS no trabalho. Aqui está um exemplo de execução:
fonte