Le but de ce défi est de créer le code le plus court (en caractères) qui réussisse à faire ce qui suit:
Spécifications :
- Doit créer un
5x5x5 labyrinth
avec exactement1 possible solution
(ni plus, ni moins) Le labyrinthe doit être crééIl doit être capable de générer toutes les solutions existantes s'il reste en service pendant des annéesrandomly
- Le
start
etfinish
doit être placé dans*opposite corners
- La carte
output
doit être dans l'un des formats suivants:
Format de sortie de l'option 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
Format de sortie de l'option 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]]
Notes de sortie:
Utiliser
0
pourempty
et1
poursquares
Les lignes de rupture ne sont PAS nécessaires
Vous décidez ce qui
index
est quoi, mais assurez - vous d' expliquer bien
* Voici un exemple de ce que j'entends par coins opposés:
Clarifications :
- Peut pas se déplacer dans
diagonal
- Ne peut PAS passer deux fois sur le même chemin
- Avoir
inaccessible areas
est autorisé - Vous pouvez avoir
go up/down
plusieurs niveaux d'affilée
Conseils:
- Ne les voyez pas comme des murs, au lieu de cela, voyez-les comme une
5x5x5
pile de carrés dont certains manquent et vous pouvez parcourir ceux qui manquent
code-golf
maze
generation
ajax333221
la source
la source
Réponses:
C ++C,environ 1000670643395297248 car.Exemple de sortie:
Comment ça marche:
Le programme utilise Brownian Motion pour générer des solutions.Le point de départ est défini. Ensuite, un point aléatoire est sélectionnéet déplacé de manière répétée de manière aléatoirejusqu'à ce qu'il touche un et un seul point sur la branche de départ. Le point est alors défini, et s'il touche également le point final, le programme se ferme et la matrice s'affiche. Puisqu'aucun point ne peut joindre deux branches, il n'y a qu'un seul chemin à travers le labyrinthe. Le programme utilise la fonction randet un argument entier de ligne de commande comme valeur de départ,donc avec une fonction rand suffisante, il devrait être possible de générer éventuellement tous les labyrinthes valides (cet algorithme ne créera cependant pas de zones non connectées, donc il ne générera pas tous labyrinthes possibles ).Le mouvement brownien a été abandonné car il s'est avéré inutile et sa suppression simplifie considérablement le code. Je pense cependant que cela a rendu les labyrinthes plus agréables. De même, l'argument de départ a été abandonné, car nécessiter un générateur de nombres aléatoires sans état est plus logique pour moi qu'un départ de 128 bits.
Il est possible que le programme reste bloqué dans une boucle infinie, car il est possible dans des situations où tout point ajouté aux branches créerait plusieurs chemins. C'est réparable, mais je pense que c'est assez rare pour ne pas être un problème pour le golf de code.
J'ai ajouté des nouvelles lignes et une indentation au code affiché pour plus de lisibilité.
la source
JavaScript,
874816788686682668637 caractèresexemple de sortie:
celui-ci fonctionne en commençant à partir du point [0,0,0] et en ajoutant au hasard en attachant un 0 de plus à côté d'un 0 partout où cela est autorisé (autorisé == le nouveau 0 n'est pas à côté de tout autre 0 à l'exception de l'origine) jusqu'à ce qu'il n'y en ait plus ajouts possibles.
si un nouveau 0 est à côté du point de sortie (x * y * z == 48), nous ouvrons la sortie.
golfé
original
la source
Mathematica: True Labyrinth (827 caractères)
A l'origine, je produisais un chemin de {1,1,1} à {5,5,5} mais comme il n'y avait pas de mauvais virages possibles à faire, j'ai introduit des fourches ou "points de décision" (sommets de degré> 2) où il faudrait décider de la voie à suivre. Le résultat est un véritable labyrinthe ou labyrinthe.
Les «ruelles aveugles» étaient beaucoup plus difficiles à résoudre que de trouver un chemin simple et direct. La chose la plus difficile était d'éliminer les cycles dans le chemin tout en autorisant les cycles hors du chemin de la solution.
Les deux lignes de code suivantes sont uniquement utilisées pour le rendu des graphiques dessinés, donc le code ne compte pas, car il n'est pas utilisé dans la solution.
Code utilisé:
Exemple de sortie
{{"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 "}}
Sous la capuche
L'image ci-dessous montre le labyrinthe ou le labyrinthe qui correspond à la solution
({{"ooxoo",...}}
affichée ci-dessus:Voici le même labyrinthe inséré dans un 5x5x5
GridGraph
. Les sommets numérotés sont des nœuds sur le chemin le plus court hors du labyrinthe. Notez les fourchettes ou points de décision à 34, 64 et 114. Je vais inclure le code utilisé pour le rendu du graphique même s'il ne fait pas partie de la solution:Et ce graphique ne montre que la solution au labyrinthe:
Enfin, quelques définitions qui peuvent aider à lire le code:
Solution originale (432 caractères, produit un chemin mais pas un vrai labyrinthe ou un vrai labyrinthe)
Imaginez un grand cube solide de 5x5x5 composé de cubes unitaires distincts. Ce qui suit commence sans cubes unitaires à {1,1,1} et {5,5,5}, car nous savons qu'ils doivent faire partie de la solution. Ensuite, il supprime des cubes aléatoires jusqu'à ce qu'il y ait un chemin libre de {1,1,1} à {5,5,5}.
Le "labyrinthe" est le chemin le plus court (si plus d'un est possible) étant donné les cubes unitaires qui ont été retirés.
Exemple:
Techniquement, ce n'est pas encore un vrai labyrinthe, car il n'y a pas de mauvais virages que l'on puisse faire. Mais je l'ai trouvé intéressant pour commencer car il repose sur la théorie des graphes.
La routine fait en fait un labyrinthe mais j'ai bouché tous les emplacements vides qui pourraient donner lieu à des cycles. Si je trouve un moyen de supprimer les cycles, j'inclurai ce code ici.
la source
FindShortestPath
.