El objetivo de este desafío es crear el código más corto (en caracteres) que haga con éxito lo siguiente:
Especificaciones :
- Debe crear un
5x5x5 labyrinth
con exactamente1 possible solution
(ni más ni menos) El laberinto debe ser creadoDebe poder generar todas las soluciones existentes si se deja funcionando durante añosrandomly
- El
start
yfinish
debe colocarse en*opposite corners
- El mapa
output
debe tener uno de los siguientes formatos:
Opción de salida formato 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
Opción formato de salida 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 salida:
Usar
0
paraempty
y1
parasquares
Las líneas de corte NO son necesarias
Tú decides qué
index
es qué, pero solo asegúrate de explicarlo bien
* Aquí hay un ejemplo de lo que quiero decir con esquinas opuestas:
Aclaraciones :
- NO puede mudarse
diagonal
- NO puede pasar dos veces en el mismo camino
- Tener
inaccessible areas
está permitido - Puedes
go up/down
más de un nivel en una fila
Consejos:
- No los vea como paredes, en cambio, véalos como una
5x5x5
pila de cuadrados que faltan algunos de ellos y puede pasar por los que faltan
code-golf
maze
generation
ajax333221
fuente
fuente
Respuestas:
C ++C,alrededor de 1000670643395297248 caracteresSalida de muestra:
Cómo funciona:
el programa utiliza Brownian Motion para generar soluciones.El punto de inicio está establecido. Luego, se selecciona un punto aleatorioy se mueve repetidamente al azarhasta que toca uno y solo un punto en la rama de inicio. Luego se establece el punto, y si también toca el punto final, el programa sale y se muestra la matriz. Como ningún punto puede unir dos ramas, solo hay un camino a través del laberinto. El programa usa la función randy un argumento entero de línea de comando como la semilla,por lo que con una función rand suficiente debería ser posible generar eventualmente todos los laberintos válidos (sin embargo, este algoritmo no creará áreas no conectadas, por lo que no generará todos posibles laberintos).El movimiento browniano se abandonó porque resultó ser innecesario y su eliminación simplifica significativamente el código. Sin embargo, creo que hizo laberintos más bonitos. Del mismo modo, se eliminó el argumento semilla, ya que requerir un generador de números aleatorios sin estado tiene más sentido para mí que una semilla de 128 bits.
Es posible que el programa se quede atascado en un bucle infinito, ya que es posible en situaciones donde cualquier punto agregado a las ramas crearía múltiples caminos. Esto es reparable, pero creo que es lo suficientemente raro como para no ser una preocupación para el golf de código.
He agregado nuevas líneas y sangría al código que se muestra para facilitar la lectura.
fuente
JavaScript,
874816788686682668637 caracteressalida de muestra:
este funciona comenzando desde el punto [0,0,0] y agregando al azar adjuntando un 0 más al lado de un 0 donde esté permitido (permitido == el nuevo 0 no está al lado de ningún otro 0 excepto el originador) hasta que no haya más posibles adiciones.
Si cualquier nuevo 0 está al lado del punto de salida (x * y * z == 48) entonces abrimos la salida.
golf
original
fuente
Mathematica: Laberinto verdadero (827 caracteres)
Originalmente, produje un camino de {1,1,1} a {5,5,5} pero como no había posibles giros incorrectos, introduje bifurcaciones o "puntos de decisión" (vértices de grado> 2) donde uno tendría que decidir qué camino tomar. El resultado es un verdadero laberinto o laberinto.
Los "callejones sin salida" eran mucho más difíciles de resolver que encontrar un camino simple y directo. Lo más desafiante fue eliminar los ciclos dentro de la ruta mientras se permitían los ciclos fuera de la ruta de la solución.
Las siguientes dos líneas de código solo se usan para representar los gráficos dibujados, por lo que el código no cuenta, ya que no se emplea en la solución.
Código usado:
Salida de muestra
{{"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 "}}
Bajo el capó
La siguiente imagen muestra el laberinto o laberinto que corresponde a la solución que se
({{"ooxoo",...}}
muestra arriba:Aquí está el mismo laberinto insertado en un 5x5x5
GridGraph
. Los vértices numerados son nodos en el camino más corto fuera del laberinto. Tenga en cuenta las bifurcaciones o los puntos de decisión en 34, 64 y 114. Incluiré el código utilizado para representar el gráfico aunque no sea parte de la solución:Y este gráfico muestra solo la solución al laberinto:
Finalmente, algunas definiciones que pueden ayudar a leer el código:
Solución original (432 caracteres, produjo un camino pero no un verdadero laberinto o laberinto)
Imagine un cubo sólido grande de 5x5x5 formado por cubos de unidades distintas. Lo siguiente comienza sin cubos unitarios en {1,1,1} y {5,5,5}, ya que sabemos que deben ser parte de la solución. Luego, elimina los cubos aleatorios hasta que haya una ruta sin obstáculos de {1,1,1} a {5,5,5}.
El "laberinto" es el camino más corto (si es posible más de uno) dados los cubos unitarios que se han eliminado.
Ejemplo:
Técnicamente, esto aún no es un verdadero laberinto, ya que no hay giros incorrectos que uno pueda hacer. Pero, para empezar, me pareció interesante, ya que se basa en la teoría de grafos.
La rutina en realidad hace un laberinto, pero conecté todas las ubicaciones vacías que podrían dar lugar a ciclos. Si encuentro una manera de eliminar ciclos, incluiré ese código aquí.
fuente
FindShortestPath
.