O objetivo desse desafio é criar o código mais curto (em caracteres) que faça com sucesso o seguinte:
Especificações :
- É necessário criar um
5x5x5 labyrinth
com exatamente1 possible solution
(nem mais, nem menos) O labirinto deve ser criadoEle deve ser capaz de gerar todas as soluções existentes se permanecer em funcionamento por anosrandomly
- O
start
efinish
deve ser colocado em*opposite corners
- O mapa
output
deve em um dos seguintes formatos:
Formato de saída da opção 1 strings, printed or alerted
:
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx
Formato de saída da opção 2 arrays
:
[[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx]]
Notas de saída:
Use
0
paraempty
e1
parasquares
NÃO são necessárias linhas de quebra
Você decide o que
index
é o quê, mas apenas explique bem
* Aqui está um exemplo do que quero dizer com cantos opostos:
Esclarecimentos :
- NÃO pode se mudar
diagonal
- NÃO pode passar duas vezes no mesmo caminho
- Ter
inaccessible areas
é permitido - Você pode
go up/down
mais de um nível em uma linha
Dicas:
- Não os veja como paredes, mas como uma
5x5x5
pilha de quadrados que alguns deles estão faltando e você pode passar pelos que estão faltando
code-golf
maze
generation
ajax333221
fonte
fonte
Respostas:
C ++C,cerca de 1000670643395297248 caracteresSaída de amostra:
Como funciona:
O programa usa o Brownian Motion para gerar soluções.O ponto inicial está definido. Em seguida, um ponto aleatório é selecionadoe movido aleatoriamente repetidamenteaté tocar um e apenas um ponto no ramo inicial. O ponto é então definido e, se também tocar no ponto final, o programa sai e a matriz é exibida. Como nenhum ponto pode unir dois ramos, há apenas um caminho através do labirinto. O programa usa a função rand,e um argumento inteiro da linha de comando como a semente,portanto,com uma função rand suficiente, deve ser possível gerar eventualmente todos os labirintos válidos (esse algoritmo não criará áreas não conectadas, portanto, não gerará tudo labirintos possíveis ).O movimento browniano foi descartado, pois acabou sendo desnecessário e sua remoção simplifica significativamente o código. Eu acho que isso fez labirintos mais agradáveis. Da mesma forma, o argumento de propagação foi descartado, pois exigir um gerador de números aleatórios sem estado faz mais sentido para mim do que uma propagação de 128 bits.
É possível que o programa fique preso em um loop infinito, pois é possível em situações em que qualquer ponto adicionado às ramificações criaria vários caminhos. Isso é corrigível, mas acho que é raro o suficiente para não ser uma preocupação para o código de golfe.
Adicionei novas linhas e recuo ao código exibido para facilitar a leitura.
fonte
JavaScript,
874816788686682668637 caracteressaída de amostra:
este funciona iniciando do ponto [0,0,0] e adicionando aleatoriamente anexando mais um 0 ao lado de um 0 sempre que permitido (permitido == o novo 0 não fica próximo a nenhum outro 0, exceto o originador) até que não haja mais possíveis adições.
se qualquer novo 0 estiver próximo ao ponto de saída (x * y * z == 48), abriremos a saída.
golfed
original
fonte
Mathematica: True Labyrinth (827 caracteres)
Originalmente, produzi um caminho de {1,1,1} a {5,5,5}, mas como não havia possíveis desvios errados, introduzi garfos ou "pontos de decisão" (vértices de grau> 2) onde seria preciso decidir qual caminho seguir. O resultado é um verdadeiro labirinto ou labirinto.
Os "becos sem saída" eram muito mais difíceis de resolver do que encontrar um caminho simples e direto. A coisa mais desafiadora foi eliminar os ciclos no caminho, permitindo ciclos fora do caminho da solução.
As duas linhas de código a seguir são usadas apenas para renderizar os gráficos desenhados, portanto, o código não conta, pois não é empregado na solução.
Código usado:
Saída de amostra
{{"oxooo", "xxooo", "xoxxo", "xoxxo", "xxoox"}, {"ooxoo", "xoooo", "ooxox", "oooxx", "xooxx"}, {"oooxx", "ooxxo", "ooxox", "xoxoo", "xxxoo"}, {"oxxxx", "oooox", "xooox", "xoxxx", "oooxx"}, {"xxxxx", "ooxox", "oooox "," xoxoo "," oooxo "}}
Sob o capô
A imagem abaixo mostra o labirinto ou labirinto que corresponde à solução
({{"ooxoo",...}}
exibida acima:Aqui está o mesmo labirinto inserido em um 5x5x5
GridGraph
. Os vértices numerados são nós no caminho mais curto para fora do labirinto. Observe os garfos ou os pontos de decisão em 34, 64 e 114. Vou incluir o código usado para renderizar o gráfico, mesmo que não faça parte da solução:E este gráfico mostra apenas a solução para o labirinto:
Por fim, algumas definições que podem ajudar na leitura do código:
Solução original (432 caracteres, produziu um caminho, mas não um verdadeiro labirinto ou labirinto)
Imagine um cubo sólido de 5x5x5, composto por cubos de unidades distintas. O seguinte começa sem cubos de unidades em {1,1,1} e {5,5,5}, pois sabemos que eles devem fazer parte da solução. Em seguida, ele remove cubos aleatórios até que haja um caminho desimpedido de {1,1,1} para {5,5,5}.
O "labirinto" é o caminho mais curto (se mais de um for possível), considerando os cubos da unidade que foram removidos.
Exemplo:
Tecnicamente, este ainda não é um verdadeiro labirinto, já que não há giros errados que alguém possa fazer. Mas achei interessante como um começo, uma vez que se baseia na teoria dos grafos.
A rotina realmente faz um labirinto, mas liguei todos os locais vazios que poderiam dar origem a ciclos. Se eu encontrar uma maneira de remover ciclos, incluirei esse código aqui.
fonte
FindShortestPath
.