Sé que hay un hilo (antiguo) similar a este ( aquí ), pero me gustaría reiniciarlo con algunas modificaciones.
El objetivo: generar un laberinto de aspecto aleatorio utilizando un algoritmo de su elección, luego generar el laberinto gráficamente (conteos de impresión).
- El ancho y la altura los determina usted.
- Debe haber al menos un camino desde al menos una entrada hasta al menos una salida.
- El formato del laberinto (cómo lo muestra, marca las entradas o salidas) también depende de usted.
- Cuanto más bonita, mejor.
- Los laberintos triviales (por ejemplo, laberintos en blanco, laberintos enrejados, laberintos de tamaño 1x1) no se recomiendan.
- Los ciclos en el laberinto están permitidos y, se recomienda, si el resultado es razonable.
- Se alienta el abuso del lenguaje.
- El laberinto debe verse razonablemente aleatorio (pero un algoritmo completamente determinista (por ejemplo, caótico) que genera esto también está bien).
Editar: el enfoque principal aquí es hacer la implementación más pequeña posible. Sin embargo, quiero permitir un margen de maniobra dentro de esa restricción para alentar el brillo. Deliberadamente he dejado exactamente qué "características" tiene el laberinto abierto, pero como guía aproximada, debes tratar de meter la mayor cantidad de explosión en el menor dinero léxico.
code-golf
popularity-contest
maze
imallett
fuente
fuente
Respuestas:
C:
265253bytes(Requiere terminal de 65 caracteres) Genera un laberinto de 31x31 relativamente aleatorio con un camino garantizado desde la entrada hasta la salida.
Ejemplo de salida (con terminal simulada de 65 caracteres):
fuente
int p,int c
.p,c
es suficiente ...Mathematica,
144132 bytesDesde el inicio, todos conocemos la forma más eficiente de dibujar un laberinto .
Ungolfed y salida de ejemplo:
Por supuesto, las líneas son las paredes. Eres el minotauro que comienza en el centro y necesita salir.
fuente
C: 364 bytes
Nota: en lo anterior, agregué nuevas líneas para que se ajuste a la página. Salida esperada (en terminal de 80 caracteres) (nota de inicio y final en la parte superior izquierda):
fuente
Mathematica,
134130 caracteresDe hecho, podemos usar este algoritmo para generar un laberinto a partir de cualquier gráfico (no dirigido).
Por ejemplo, genere un laberinto a partir del gráfico de recorrido del caballero 8 * 8 (
KnightTourGraph[8,8]
):fuente
Bash, 53 bytes
Idea similar al código C64. Utiliza caracteres Unicode como barras oblicuas porque se ven mucho mejor en un terminal que admite Unicode. Salida de muestra en OS X Terminal (fuente Menlo):
fuente
yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash
. Ver esta publicaciónJavaScript (ES6), 174
Este es el constructor de laberintos que utilicé en este otro desafío , solo golf. Es una función con 2 parámetros: filas y columnas. El laberinto está totalmente conectado sin bucles, por lo que cualquier ubicación puede ser el punto inicial o final.
Ejemplo
Salida
Prueba
fuente
ZX Basic - 54 caracteres
Aquí está el laberinto que muestra una ruta a través de él (espacios entre líneas)
y un pequeño fragmento de cuando hice esto por primera vez (hace varios años), y pasé un poco de tiempo haciendo mejores gráficos.
fuente
BBC BASIC, 18 Bytes
Una mejora en la longitud de la versión de bucle infinito C64 de 23 bytes de @nneonneo. VDU envía un solo carácter al controlador de VDU: 2 + 1 * 45 = ASCII 47
/
o 2 + 2 * 45 = ASCII 92\
BBC BASIC, 35 Bytes /
10795 Bytes35 bytes es solo para la última línea, que da un laberinto de 25 filas en un diseño de 40 columnas. MODE1 asegura que no quede espacio adicional entre líneas. El resto del programa es opcional y mejora el formato. Las instrucciones VDU23 redefinen la fuente para los caracteres 47 y 92 (8 bytes que forman un mapa de bits de 8x8). Incluyo un píxel claro en las cuatro esquinas para evitar que las corridas se pinchen. El efecto secundario de esto es que aparece un punto en los diamantes vacíos. 107 bytes en total, incluidas 2 líneas nuevas.
Editar este programa se puede acortar a 95 bytes codificando algunos de los códigos VDU de 8 bits en valores endian pequeños de 16 bits (indicados con un punto y coma después de ellos en lugar de una coma) y representando la declaración MODE como un par de códigos VDU, de la siguiente manera .
Salida
Usando BBC Basic para Windows desde bbcbasic.co.uk
Última línea solamente, 35 bytes
Programa completo,
10795 bytesComo comenté sobre la respuesta de @ Brian, la barra divide el cuadrado en 2 triángulos oscuros, cada uno de los cuales tiene exactamente 2 entradas / salidas. Esto garantiza un camino (trivial, no ramificado) desde cualquier punto en el borde del laberinto a algún otro punto en el borde del laberinto. Muchos de estos son muy cortos, pero siempre parece haber algunos largos. Por supuesto, en el medio del laberinto también hay algunos bucles.
Como otras respuestas no lo han mencionado, me gustaría echar un vistazo a las áreas claras. Estos están delimitados por áreas oscuras, por lo tanto, como corolario de la declaración anterior, un área clara delimitada externamente por N áreas oscuras toca el borde del campo en N (exactamente tantos) puntos. Por lo tanto, se producen algunas áreas de luz bastante grandes, que forman laberintos interesantes y ramificados.
En el siguiente ejemplo, puede ver la salida sin formato (monocromo) de mi programa. Debajo de eso (usando Windows Paint) he coloreado las dos áreas oscuras más largas en azul. Luego coloreé el área de luz más grande en amarillo, y las dos áreas delimitadas por azul en rojo y verde. Los laberintos amarillo, verde (e incluso el rojo) son bastante interesantes y no triviales.
EDITAR: selección automática de laberintos y selección de comienzos / finales
Para una línea más (59 caracteres), el programa puede seleccionar automáticamente hasta 6 laberintos eligiendo cuadrados al azar e inundando los colores rojo, verde, amarillo, azul, magenta y cian. No siempre encuentra un 6 completo, porque si elige un cuadrado aleatorio que ya ha sido coloreado, no hace nada.
El resto del código a continuación selecciona un comienzo para cada color al escanear cada columna de arriba a abajo y de izquierda a derecha, y elegir el primer cuadrado que encuentra. Elige un final escaneando en la dirección opuesta.
Esto produce un conjunto de laberintos coloridos y entrelazados. A veces están tan entrelazados que parece que los laberintos deben cruzarse en alguna parte. ¡Pero por supuesto que no!
Código adicional y salida 59 + 187 = 246 caracteres adicionales que se agregarán al final del programa original (para una mejora más allá de las especificaciones de la pregunta)
fuente
C: 235 bytes
Nota: en lo anterior, agregué nuevas líneas para que se ajuste a la página. Salida esperada (en terminal de 80 caracteres):
Lamento que este no sea un laberinto muy difícil (de hecho, no es necesario retroceder a los anillos internos (y debería ser capaz de encontrar un camino desde el perímetro al centro trivialmente). Sin embargo, tiene una buena implementación del círculo de Bresenham algoritmo de dibujo en su núcleo.
fuente
i+=2
ai+=3
, podría quedar más claro lo que está sucediendo.Ayudé a mi hijo a hacer esto, a aprender un poco de programación: http://jsfiddle.net/fs2000/4KLUC/34/ ¿cómo te gusta?
fuente
Commodore 64 BASIC - 38 bytes
Este no es mi invento, simplemente estoy repitiendo un programa muy hermoso y corto de días pasados. De hecho, ¡hay un libro completo llamado
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
celebrando este código!Puedes ver la salida en este video de YouTube ; Aquí hay una captura de pantalla:
Aquí en esta pregunta de StackOverflow hay más implementaciones de este programa generador de laberintos. La implementación más corta del programa es el siguiente programa BASIC C64 de 23 bytes publicado por el autor de esa pregunta:
donde las letras minúsculas se ingresan tal cual y las mayúsculas se ingresan con la tecla Mayús (tienen diferentes apariencias en una pantalla C64 real).
fuente
Java: 700
Aquí hay un sumador de pared recursivo. El algoritmo se describe en este sitio :
Básicamente, divide cada rectángulo en dos con una pared (y pasaje), luego divide aquellos en dos, etc. Genera un laberinto "perfecto", uno sin ciclos, que tiene una ruta desde cada punto a cualquier otro punto. Muchos callejones sin salida, por lo que no es "trivial" en ningún sentido para laberintos más grandes.
Entonces, la entrada y la salida se pueden decidir arbitrariamente. Si tengo que elegir uno, solo dirá arriba / izquierda e inferior / derecha.
Está dibujado en ascii de doble ancho, por lo que es una buena idea canalizar la salida a un archivo si está haciendo uno de cualquier tamaño. Aquí hay una consola 20x20:
Y un 100x100 en el bloc de notas ++ (tuve que alejarme para obtener todo, así que es algo ... pequeño ):
Código con saltos de línea:
fuente
ZX Basic - 281 caracteres
Este es más un laberinto "apropiado", menos golfista, pero más mazier. Llamado algoritmo de laberinto binario, cada celda puede tener una salida hacia abajo o hacia la derecha, pero no ambas. (Ahora incluye el inicio marcado "S" y el final "E", para evitar ir directamente a un lado).
El "::" es la forma en que ZXB ingresa los caracteres gráficos de Spectrum en un archivo de texto, equivale a un carácter de bloque vendido.
fuente
C- 244
Así es como se ve:
Nota: esta solución está inspirada en el juego no confiable de nivel 8: en el bosque.
fuente