Défi
Écrivez un programme / une fonction qui accepte une "image" et génère un labyrinthe d'images formé à partir de cette image.
Contribution
Votre programme doit accepter deux arguments:
- Moi, l'image pour former le labyrinthe
- S, un booléen précisant s'il faut afficher ou non la solution du labyrinthe
I est donné sous la forme suivante:
.......
.#####.
.#####.
#######
.#####.
.#####.
.......
où #
sont les cellules à inclure dans le chemin de la solution et .
les cellules à exclure. Vous pouvez échanger les .
«, #
» et les nouvelles lignes avec n'importe quel caractère de votre choix tant qu'ils diffèrent les uns des autres. Alternativement, vous pouvez accepter un bitmap réel de l'image d'entrée.
Production
Votre labyrinthe résultant devrait être sous la forme suivante:
###############
# #
# ### ####### #
# #.........# #
# #.#######.# #
# #.#.......# #
###.#.#########
....#.#........
#####.#.#######
# ...#..... #
# #.#######.# #
# #.........# #
# ####### ### #
# # # #
###############
où #
représente les murs, .
désigne les portions du chemin faisant partie de la solution et les espaces sont des chemins exclus de la solution. Les .
'peuvent être remplacés par des espaces si S est faux. Encore une fois, les caractères peuvent être échangés avec d'autres caractères de votre choix ou vous pouvez générer une image bitmap réelle du labyrinthe avec la solution mise en évidence.
Détails supplémentaires
- Les chemins doivent être d'une seule cellule (ne peut pas avoir un pool géant d'espace vide comme chemin)
- Le labyrinthe ne doit contenir aucune boucle
- Le labyrinthe doit être entièrement connecté (toutes les cellules doivent être accessibles depuis l'entrée / la sortie)
- Le labyrinthe doit être entouré de murs (sauf s'il s'agit d'une entrée / sortie)
- Le chemin de la solution ne doit pas inclure d'impasses
- Il doit y avoir exactement 1 entrée et 1 sortie pour le labyrinthe
- L'entrée et la sortie doivent être alignées sur le bord de la grille et adjacentes à une cellule incluse dans le chemin de la solution
- Vous pouvez choisir l'emplacement de l'entrée et de la sortie
- Vous pouvez supposer qu'un chemin valide peut être formé à partir de l'image d'entrée donnée
(Ajouté pour clarification) Le diagramme ci-dessous montre comment le chemin de la solution est corrélé à l'image d'entrée:
Input (I): | Output: | Corresponding Cells:
| | (@'s denote #'s from I)
| |
....... | ############### | ###############
.#####. | # # | # #
.#####. | # ### ####### # | # ### ####### #
####### | # #.........# # | # #@.@.@.@.@# #
.#####. | # #.#######.# # | # #.#######.# #
.#####. | # #.#.......# # | # #@#@.@.@.@# #
....... | ###.#.######### | ###.#.#########
| ....#.#........ | .@.@#@#@.@.@.@.
| #####.#.####### | #####.#.#######
| # ...#..... # | # @.@#@.@.@ #
| # #.#######.# # | # #.#######.# #
| # #.........# # | # #@.@.@.@.@# #
| # ####### ### # | # ####### ### #
| # # # # | # # # #
| ############### | ###############
| |
Cas de test
L'arrosage peut par exemple de Wikipedia :
Contribution:
..................
..................
.......####.......
......##..##......
.....##....##....#
.....#......#...##
.#############.##.
##..############..
#...###########...
#...##########....
#...##########....
#...##########....
#...##########....
....##########....
....##########....
....##########....
..................
..................
Sortie (S = faux):
#####################################
# # # # # # #
# ### ### ### # # ##### ### ### ### #
# # # # # # # # # # #
# ### # ##### # ########### # ### # #
# # # # # # # # #
# # # ### ##### # ### ### # ### ### #
# # # # # # # # # # # # #
# ### # ##### ##### ### ##### # # ###
# # # # # # # # #
### ####### ### ### # ### ##### ### #
# # # # # # # # # # #
# ### ##### # ### ####### # # # # # #
# # # # # # # #
# # ##### ############# ### ### ### #
# # # # # # # # # #
# ### # ####### # ### ### # # ### # #
# # # # # # # # # #
# # # ### ######### # # ##### # #####
# # # # # # # # # # # #
# ##### # # ##### # ##### # # ### # #
# # # # # # # # # # #
# ### ### ### # ### # ##### ####### #
# # # # # # # # # #
# # # # ####### # ### # ##### # ### #
# # # # # # # # # # #
### # # # # # ############# # ### # #
# # # # # # # # # # #
##### # # ##### ####### # ### ##### #
# # # # # # # # #
##### # # # # ####### # ### #########
# # # # # #
# ### ######### ############# # #####
# # # # # # # # #
# # ######### # ####### ####### ### #
# # # #
#####################################
Sortie (S = vrai):
#####################################
# # # # # # #
# ### ### ### # # ##### ### ### ### #
# # # # # # # # # # #
# ### # ##### # ########### # ### # #
# # # #....... # # # # #
# # # ### #####.# ###.### # ### ### #
# # # # #...# # #...# # # # #
# ### # #####.##### ###.##### # # ###
# # # ...# # #... # # #..
### #######.### ### # ###.##### ###.#
# # #.# # # #.# # #...#
# ### #####.# ### #######.# # # #.# #
# #.......#.............#...# #...# #
# #.#####.#############.###.###.### #
#...# #.......#.....#...#.#...# # #
#.### # #######.#.###.###.#.#.### # #
#.# # # .......#...#.#...#...# #
#.# # ###.#########.#.#.##### # #####
#.# # #.#.......#.#...#...# # # #
#.##### #.#.#####.#.#####.#.# ### # #
#. #.#...#...#.#.....#.# # # #
#.### ###.###.#.###.#.#####.####### #
#. # # #.....#.#...#.#..... # #
#.# # # #######.#.###.#.##### # ### #
..# # # #...#...#.....#.....# # # #
### # # #.#.#.#############.# ### # #
# # # #.#...#.........#...# # # #
##### # #.#####.#######.#.### ##### #
# # #.#...#.......#.#...# #
##### # #.#.#.#######.#.###.#########
# # ...#.........#..... # #
# ### ######### ############# # #####
# # # # # # # # #
# # ######### # ####### ####### ### #
# # # #
#####################################
Exemple de bitmap (même labyrinthe que ci-dessus):
la source
Réponses:
Python 3, 1599 octets
J'ai trouvé que c'était un projet amusant et très intéressant (et quelque peu long). Quand j'ai vu cela, je me suis souvenu de l'été que j'ai passé exclusivement à écrire et à améliorer un algorithme de génération de labyrinthe et à me mettre immédiatement au travail.
Après un certain temps, j'ai eu un brouillon initial d'environ 6000 octets et j'ai passé les deux heures suivantes à le condenser dans le programme suivant:
Ce qui est à peu près aussi insensé à regarder qu'un labyrinthe d'art ascii est ...
Il convient de noter que, puisque la fonction aléatoire n'est utilisée qu'après avoir trouvé le chemin correct, quel que soit le nombre de fois où la même entrée est donnée, l'itinéraire du début à la fin sera le même et, bien que ce programme le fasse travailler pour les exemples ci-dessus, parfois il ne sera pas en mesure de trouver une solution s'il "se conduit dans un mur" pour ainsi dire.
Lors de l'exécution des exemples ci-dessus, cela donne ceci:
cette:
et ça:
Si vous souhaitez essayer d'exécuter ce programme vous-même, utilisez la commande
M(Image, Show solution)
. Je recommanderais d'utiliser les guillemets triples pour saisir l'image car sinon, il y aura beaucoup de barres obliques inversées ou de caractères de nouvelle ligne impliqués.la source
0
place depass
,l.append(a);l.append(b)
->l+=a,b
,l.append(a)
->l+=[a]
, cela peut valoir la peine d'être attribué'#'
à une variable, etdef 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)
et (je pense que je ne l'ai pas testé)G=[s]
->*G=s
.except:0
,l+=a,b
ets=[0]*(1+L(I[0])*2)
vraiment aidé. Malheureusement, pour une raison quelconque, l'attribution de c dans l'appel de fonction ne le réinitialise pas sur plusieurs appels, ce qui signifie qu'il a cessé de fonctionner, G [r] [c] peut être une chaîne, donc je ne peux pas utiliser <ou> dessus et le * G = s m'a donné une erreur de syntaxe. Encore de bons conseils.G[r][c]
peut être une chaîne, celaG[r][c]in[1,2]
devrait fonctionner.