Desafío
Escriba un programa / función que acepte una "imagen" y genere un laberinto de imágenes formado a partir de esa imagen.
Entrada
Su programa debe aceptar dos argumentos:
- Yo, la imagen para formar el laberinto
- S, un booleano que especifica si se muestra o no la solución al laberinto
Me dan de la siguiente forma:
.......
.#####.
.#####.
#######
.#####.
.#####.
.......
donde #
's son células que se incluirán en la ruta de la solución y .
' s son células que se excluirán. Puede intercambiar las .
's #
' y las nuevas líneas con cualquier carácter de su elección siempre que difieran entre sí. Alternativamente, puede aceptar un mapa de bits real de la imagen de entrada.
Salida
Su laberinto resultante debe estar en la siguiente forma:
###############
# #
# ### ####### #
# #.........# #
# #.#######.# #
# #.#.......# #
###.#.#########
....#.#........
#####.#.#######
# ...#..... #
# #.#######.# #
# #.........# #
# ####### ### #
# # # #
###############
donde #
denotan paredes, .
denotan porciones del camino que forman parte de la solución y los espacios son caminos excluidos de la solución. El .
's puede ser reemplazado por espacios si S es falso. Nuevamente, los caracteres pueden intercambiarse con otros caracteres de su elección o puede generar un mapa de bits real del laberinto con la solución resaltada.
Detalles adicionales
- Las rutas deben tener una celda de ancho (no puede tener un grupo gigante de espacio vacío como ruta)
- El laberinto no debe contener ningún bucle.
- El laberinto debe estar completamente conectado (todas las celdas deben ser accesibles desde la entrada / salida)
- El laberinto debe estar rodeado de paredes (a menos que sea una entrada / salida)
- La ruta de la solución no debe incluir callejones sin salida
- Debe haber exactamente 1 entrada y 1 salida para el laberinto
- La entrada y la salida deben estar alineadas con el borde de la cuadrícula y adyacentes a una celda incluida en la ruta de la solución.
- Puedes elegir dónde se colocan la entrada y la salida
- Puede suponer que se puede formar una ruta válida a partir de la imagen de entrada dada
(Añadido para aclaración) El siguiente diagrama muestra cómo se correlaciona la ruta de la solución con la imagen de entrada:
Input (I): | Output: | Corresponding Cells:
| | (@'s denote #'s from I)
| |
....... | ############### | ###############
.#####. | # # | # #
.#####. | # ### ####### # | # ### ####### #
####### | # #.........# # | # #@.@.@.@.@# #
.#####. | # #.#######.# # | # #.#######.# #
.#####. | # #.#.......# # | # #@#@.@.@.@# #
....... | ###.#.######### | ###.#.#########
| ....#.#........ | .@.@#@#@.@.@.@.
| #####.#.####### | #####.#.#######
| # ...#..... # | # @.@#@.@.@ #
| # #.#######.# # | # #.#######.# #
| # #.........# # | # #@.@.@.@.@# #
| # ####### ### # | # ####### ### #
| # # # # | # # # #
| ############### | ###############
| |
Casos de prueba
Ejemplo de regadera de Wikipedia :
Entrada:
..................
..................
.......####.......
......##..##......
.....##....##....#
.....#......#...##
.#############.##.
##..############..
#...###########...
#...##########....
#...##########....
#...##########....
#...##########....
....##########....
....##########....
....##########....
..................
..................
Salida (S = falso):
#####################################
# # # # # # #
# ### ### ### # # ##### ### ### ### #
# # # # # # # # # # #
# ### # ##### # ########### # ### # #
# # # # # # # # #
# # # ### ##### # ### ### # ### ### #
# # # # # # # # # # # # #
# ### # ##### ##### ### ##### # # ###
# # # # # # # # #
### ####### ### ### # ### ##### ### #
# # # # # # # # # # #
# ### ##### # ### ####### # # # # # #
# # # # # # # #
# # ##### ############# ### ### ### #
# # # # # # # # # #
# ### # ####### # ### ### # # ### # #
# # # # # # # # # #
# # # ### ######### # # ##### # #####
# # # # # # # # # # # #
# ##### # # ##### # ##### # # ### # #
# # # # # # # # # # #
# ### ### ### # ### # ##### ####### #
# # # # # # # # # #
# # # # ####### # ### # ##### # ### #
# # # # # # # # # # #
### # # # # # ############# # ### # #
# # # # # # # # # # #
##### # # ##### ####### # ### ##### #
# # # # # # # # #
##### # # # # ####### # ### #########
# # # # # #
# ### ######### ############# # #####
# # # # # # # # #
# # ######### # ####### ####### ### #
# # # #
#####################################
Salida (S = verdadero):
#####################################
# # # # # # #
# ### ### ### # # ##### ### ### ### #
# # # # # # # # # # #
# ### # ##### # ########### # ### # #
# # # #....... # # # # #
# # # ### #####.# ###.### # ### ### #
# # # # #...# # #...# # # # #
# ### # #####.##### ###.##### # # ###
# # # ...# # #... # # #..
### #######.### ### # ###.##### ###.#
# # #.# # # #.# # #...#
# ### #####.# ### #######.# # # #.# #
# #.......#.............#...# #...# #
# #.#####.#############.###.###.### #
#...# #.......#.....#...#.#...# # #
#.### # #######.#.###.###.#.#.### # #
#.# # # .......#...#.#...#...# #
#.# # ###.#########.#.#.##### # #####
#.# # #.#.......#.#...#...# # # #
#.##### #.#.#####.#.#####.#.# ### # #
#. #.#...#...#.#.....#.# # # #
#.### ###.###.#.###.#.#####.####### #
#. # # #.....#.#...#.#..... # #
#.# # # #######.#.###.#.##### # ### #
..# # # #...#...#.....#.....# # # #
### # # #.#.#.#############.# ### # #
# # # #.#...#.........#...# # # #
##### # #.#####.#######.#.### ##### #
# # #.#...#.......#.#...# #
##### # #.#.#.#######.#.###.#########
# # ...#.........#..... # #
# ### ######### ############# # #####
# # # # # # # # #
# # ######### # ####### ####### ### #
# # # #
#####################################
Ejemplo de mapa de bits (el mismo laberinto que el anterior):
fuente
Respuestas:
Python 3, 1599 bytes
Me pareció un proyecto divertido y muy interesante (y algo largo). Cuando vi esto, recordé el verano que pasé escribiendo y mejorando exclusivamente un algoritmo de generación de laberintos y de inmediato me puse a trabajar en esto.
Después de un tiempo, tuve un borrador inicial de alrededor de 6000 bytes de longitud y pasé las siguientes dos horas condensándolo en el siguiente programa:
Lo cual es tan poco sensible a la vista como lo es un laberinto ascii-art ...
Vale la pena señalar que, dado que la función aleatoria no se usa hasta que se haya encontrado la ruta correcta, no importa cuántas veces se proporcione la misma entrada, la ruta desde el principio hasta el final será la misma y, mientras este programa lo haga trabaje para los ejemplos anteriores, a veces será incapaz de encontrar una solución si 'se mete en una pared', por así decirlo.
Al ejecutar los ejemplos anteriores, da esto:
esta:
y esto:
Para cualquiera que quiera intentar ejecutar este programa ellos mismos, use el comando
M(Image, Show solution)
. Recomendaría usar comillas triples para ingresar la imagen, ya que de lo contrario habrá muchas barras diagonales o caracteres de nueva línea involucrados.fuente
0
lugar depass
,l.append(a);l.append(b)
->l+=a,b
,l.append(a)
->l+=[a]
, puede valer la pena asignar'#'
a una variable, ydef E(G,y,z):\n c=[]
->def E(G,y,z,c=[]):
if G[r][c]==1 or G[r][c]==2:
->if 0<G[r][c]<3:
,s=[0]\n for x in R(L(I[0])*2):s+=[0]
->s=[0]*(1+L(I[0])*2)
y (creo que no lo he probado)G=[s]
->*G=s
.except:0
,l+=a,b
ys=[0]*(1+L(I[0])*2)
realmente me ayudó. Desafortunadamente, por cualquier razón, la asignación de c en la llamada de función no lo restablece en varias llamadas, lo que significa que dejó de funcionar, G [r] [c] puede ser una cadena, por lo que no puedo usar <o> en él y el * G = s me dio un error de sintaxis. Aún así, un gran consejo.G[r][c]
puede ser una cadena,G[r][c]in[1,2]
debería funcionar.