Contribution:
Un labyrinthe contenant les personnages:
--
(mur horizontal);|
(mur vertical);+
(connexion);(espace de marche);
I
(entrée);U
(sortie).
C'est-à-dire qu'une entrée pourrait ressembler à ceci:
+--+--+--+--+--+--+--+--+--+--+
I | | |
+ +--+--+--+ + + + +--+ +
| | | | | |
+--+--+--+ +--+--+ + + +--+
| | | | |
+ +--+--+ + +--+--+ +--+ +
| | | | | |
+--+ + +--+--+ +--+--+ + +
| | | | | |
+ +--+--+--+ +--+--+ + + +
| | | | | |
+--+ + +--+--+ +--+--+--+--+
| | | | |
+ + +--+--+--+ +--+ + + +
| | | | | | | |
+--+--+ + +--+ + + +--+ +
| | | | | |
+ +--+--+--+ + + + + +--+
| | | | U
+--+--+--+--+--+--+--+--+--+--+
Sortie:
Le plus efficace chemin que vous devez marcher pour aller de l'entrée à la sortie du labyrinthe ( à travers le labyrinthe), indiqué par les caractères indiquant la gauche, à droite, de haut en bas (c. -à- >
; <
; ^
; v
).
Règles du défi:
- Vous pouvez prendre l'entrée dans n'importe quel format raisonnable. Tableau de chaînes, chaîne unique avec des nouvelles lignes, tableau de caractères 2D, etc. sont tous les formats d'entrée possibles.
- La sortie peut être composée de quatre caractères distincts. C'est à dire
><^v
;→←↑↓
;⇒⇐⇑⇓
;RLUD
;0123
;ABCD
; etc.). - Vous êtes autorisé à ajouter des espaces ou une nouvelle ligne à la sortie si vous préférez; c'est facultatif.
- Les pas sont comptés par carré (voir quatre
+
symboles pour les carrés) et non par caractère. - Le labyrinthe peut être de taille 5x5 à 15x15 et sera toujours un carré (il n'y aura donc pas de cas de test pour les labyrinthes 5x10).
- Vous pouvez supposer que chaque labyrinthe a un ou plusieurs chemins valides du début à la fin, et vous obtenez toujours le plus court (voir les cas de test 4 et 5).
- S'il existe plusieurs chemins de même longueur, vous pouvez choisir celui à générer (voir le cas de test 6).
- Vous ne pouvez pas «marcher» hors des frontières du labyrinthe (voir les cas de test 7 et 8).
Règles générales:
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. - Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés, des programmes complets. Ton appel.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code.
- Veuillez également ajouter une explication si nécessaire.
Cas de test:
1. Input:
+--+--+--+--+--+--+--+--+--+--+
I | | |
+ +--+--+--+ + + + +--+ +
| | | | | |
+--+--+--+ +--+--+ + + +--+
| | | | |
+ +--+--+ + +--+--+ +--+ +
| | | | | |
+--+ + +--+--+ +--+--+ + +
| | | | | |
+ +--+--+--+ +--+--+ + + +
| | | | | |
+--+ + +--+--+ +--+--+--+--+
| | | | |
+ + +--+--+--+ +--+ + + +
| | | | | | | |
+--+--+ + +--+ + + +--+ +
| | | | | |
+ +--+--+--+ + + + + +--+
| | | | U
+--+--+--+--+--+--+--+--+--+--+
1. Output:
>v>>>vv<v>>v>v>>vvv>>>
2. Input:
+--+--+--+--+--+
I | | |
+ +--+--+ + +
| | | |
+ +--+ + + +
| | | | |
+ + +--+ + +
| | |
+--+ + +--+--+
| | U
+--+--+--+--+--+
2. Output:
>vvv>>v>>>
3. Input:
+--+--+--+--+--+
U | |
+ + +--+--+ +
| | | |
+--+--+ + +--+
| | |
+ +--+--+--+ +
| | | |
+ + + + +--+
| | I
+--+--+--+--+--+
3. Output:
<<<^<v<^^>>^<^<<
4. Input (test case with two valid paths):
+--+--+--+--+--+
U | |
+ + +--+--+ +
| | |
+--+--+ + +--+
| | |
+ +--+--+--+ +
| | | |
+ + + + +--+
| | I
+--+--+--+--+--+
4. Output:
<<^>^<^<<^<< (<<<^<v<^^>>^<^<< is less efficient, and therefore not a valid output)
5. Input (test case with two valid paths):
I
+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+
| | | | |
+ + + +--+--+--+ + +--+--+ +--+--+ + +
| | | | | | | |
+--+--+--+ +--+ + +--+--+--+--+ +--+--+--+
| | | | | | | | |
+ + + + + +--+ + + + +--+--+ +--+ +
| | | | | | | |
+ +--+--+--+ +--+--+ + +--+ +--+--+ +--+
| | | | | | | | |
+ +--+ + +--+ +--+--+ +--+--+ + +--+ +
| | | | | | |
+ + +--+--+--+--+ + +--+--+--+ +--+ +--+
| | | | | | | |
+--+--+--+ + +--+--+ +--+ + +--+ +--+ +
| | | | | | | |
+ +--+--+--+--+ + + +--+--+--+ + + + +
| | | | | | | | | |
+--+ + + + + + +--+--+ + + +--+ + +
| | | | | | | | | |
+--+ +--+--+ + + + +--+--+--+ + + + +
| | | | | | | | | |
+ +--+ +--+--+ + +--+--+ + +--+ + + +
| | | | | | | | | |
+--+--+--+ + + +--+ + +--+--+ +--+ + +
| | | | | | | |
+ + +--+--+--+--+ +--+--+ +--+--+ +--+ +
| | | | | |
+ + + +--+--+--+--+--+--+--+--+ +--+ +--+
| | | |
+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
U
5. Output:
v<<<v<vv<<v<v>>^>>^^>vvv>>>v>vv<vv<<v<v<^<^^^^<vvvvv<^<v<<v>v>>>>>>>v (v<<<v<vv<<v<v>>^>>^^>vvv>>>v>vv<vv<<v<v<^<^^^^<vvvvv>v>>>^>>^>^^>vvv<v<v<<v is less efficient, and therefore not a valid output)
6. Input:
+--+--+--+--+--+
I |
+ + + + + +
| |
+ + + + + +
| |
+ + + + + +
| |
+ + + + + +
| U
+--+--+--+--+--+
6. Output:
>>v>v>v>v> or >v>v>v>v>> or >>>>>vvvv> or etc. (all are equally efficient, so all 10-length outputs are valid)
7. Input:
I U
+ + +--+--+--+
| | | |
+ +--+--+ + +
| | | |
+--+ + +--+ +
| | | |
+ +--+ + + +
| | |
+--+ +--+--+ +
| | |
+--+--+--+--+--+
7. Output:
vv>v>^>^<<^
8. Input:
+--+--+--+--+--+
| | |
+ +--+ +--+ +
I | | | |
+ + +--+ + +
U | | | |
+--+--+ + + +
| | | |
+ +--+--+--+ +
|
+--+--+--+--+--+
8. Output:
>v<
Labyrinthes générés à l'aide de cet outil (et dans certains cas légèrement modifiés).
code-golf
path-finding
maze
Kevin Cruijssen
la source
la source
v<<<<<<^^^^^
(pensez toujours en dehors des sentiers battus)>v>>>vv<v>>v>v>>vvv>>>
.Réponses:
Rétine ,
338281275273261 octetsEssayez-le en ligne!
Remarques
0x20
) sont remplacés par interpunct (·
) à la fois dans cette réponse et dans le lien TIO. Le programme fonctionne bien si les espaces sont restaurés.AvKr
pour haut, bas, gauche et droite. Ceux-ci peuvent être remplacés par toutes les lettres saufI
.Prend environ 40s sur TIO pour le cas de test 15 × 15. Sois patient.Retravaillé la partie pour trouver le chemin le plus court une fois que le chemin a atteint la sortie. Il s'avère que cela prenait beaucoup de temps.Explication
Le programme comprend 3 phases:
Format
Étant donné que le format original du labyrinthe est assez lourd, la première partie du programme le convertit en un format différent.
Cellules
Dans le format d'origine, chaque cellule est représentée comme une région 2 × 3:
Étant donné que la colonne de droite ne contient aucune information, le programme identifie les cellules comme n'importe quelle région 2 × 2 avec un
+
en haut à gauche.Cela nous laisse avec 3 types de cellules:
U
dans le cas de test 1 se trouve dans une R-Cell.Dans le nouveau format, les cellules sont représentées sous la forme d'une chaîne de longueur variable:
Les murs gauche et supérieur sont copiés à partir du format d'origine. Le numéro de colonne est basé sur la position horizontale de la cellule et est utilisé pour l'alignement (identification des cellules directement les unes sur les autres). Le chemin est une chaîne alphabétique utilisée pendant la phase de remplissage pour enregistrer le chemin le plus court pour atteindre cette cellule. Le chemin et le marqueur de sortie seront expliqués plus en détail.
Demi-cellules
Bien que la plupart du labyrinthe soient des cellules, il existe des régions du labyrinthe qui ne sont pas des cellules:
+
s le long du mur de droite ne forment pas de cellules car ils sont sur la dernière colonne.+
à gauche. Par exemple, l'entréeI
dans le cas de test 1 est dans une demi-cellule L.Techniquement, il existe des demi-cellules T au- dessus du labyrinthe (lorsqu'il y a un rembourrage supérieur) et des demi-cellules B (le long de la paroi inférieure lorsqu'il n'y a pas de rembourrage inférieur) mais elles ne sont pas représentées dans le nouveau format.
La ligne supérieure d'une demi-cellule serait supprimée dans le cadre de la construction de cellules complètes dans la même ligne, de sorte que les demi-cellules sont représentées dans le nouveau format comme
Un R demi-cellules est juste
|
. Une demi-cellule L a justeI
comme chemin, juste le marqueur de sortie et un chemin vide, ou juste un mur vide.Entrées et sorties
Si l'entrée se trouve à gauche, à droite ou en bas du labyrinthe, le marqueur d'entrée
I
serait naturellement inclus dans la (demi-) cellule en tant que chemin, qui peut être supprimé lors du retour du chemin final.Si l'entrée est au-dessus du labyrinthe, la première étape (vers le bas) est effectuée pendant la phase de construction puisque les demi-cellules T sont supprimées pendant la construction. Cela conserve un chemin exploitable dans une cellule pleine. Le mur supérieur est ensuite fermé.
Si la sortie se trouve à gauche, à droite ou en bas du labyrinthe, elle
U
serait naturellement incluse dans la (demi-) cellule. Pour éviter d'être confondu avec un chemin, le marqueur de sortie non alphanum&
est utilisé à la place deU
. Le marqueur de sortie est intégré dans une cellule ou une demi-cellule (comme spécifié ci-dessus).Si la sortie est au-dessus du labyrinthe, ce serait le seul trou qui puisse aller au-dessus de la rangée supérieure de cellules (car celui de l'entrée, s'il était présent, serait déjà fermé). Tout chemin atteignant ce trou peut sortir du labyrinthe en faisant un pas vers le haut.
Enfin, toute cellule B contenant l'entrée ou la sortie doit fermer son mur gauche pour éviter de "résoudre" le labyrinthe en marchant le long des cellules B. Les entrées et les sorties dans les cellules R ou les demi-cellules L ne nécessitent aucun traitement supplémentaire, car l'algorithme de remplissage d'inondation ne permet pas les mouvements verticaux vers / depuis eux.
Exemple
A titre d'exemple, le premier cas de test
est
dans le nouveau format. Vous pouvez convertir d'autres labyrinthes ici .
Phase de construction
La phase de construction constitue les 13 premières lignes du programme.
Convertit la sortie en demi-cellule L en marqueur de sortie
Ajoute des murs à gauche de l'entrée et de la sortie dans les cellules B
Fait le premier pas si l'entrée est au-dessus du labyrinthe
Effectue la conversion réelle
Ferme le trou d'entrée supérieur
Conserve uniquement les lignes avec un
1
. Étant donné que les labyrinthes ont au moins 5 cellules de large et que les numéros de colonne se produisent par incréments de 3, une ligne avec des cellules de nouveau format doit contenir un numéro de colonne compris entre 10 et 19.Convertit la sortie en cellule R ou en cellule B pour quitter le marqueur
Phase de remplissage
La phase de remplissage constitue les 8 prochaines lignes du programme. Il utilise un algorithme de remplissage d'inondation pour remplir toutes les cellules avec le chemin le plus court pour y accéder depuis l'entrée.
Met toute la phase de remplissage sur une boucle pour remplir tout le labyrinthe.
Chaque cellule capable de se déplacer vers la gauche le fait. Une cellule peut se déplacer vers la gauche si
Ensuite, chaque cellule capable de se déplacer vers la droite le fait. Une cellule peut se déplacer vers la droite si
Ensuite, chaque cellule capable de se déplacer vers le bas le fait. Une cellule peut descendre si
Notez que les demi-cellules L ne peuvent pas descendre car elles n'ont pas de numéro de colonne.
Ensuite, chaque cellule capable de se déplacer le fait. Une cellule peut remonter si
Phase de retour
La phase de retour constitue les 5 dernières lignes du programme. Cette phase recherche et renvoie le chemin d'accès rempli dans la cellule de sortie.
Le motif du chemin à la sortie dépend de l'endroit où se trouve la sortie:
& <path>
<left wall> <column number> & <path>
<left wall> <column number> · <path>
et sur la ligne supérieure.Recherche une cellule sur la ligne supérieure avec un mur supérieur vide et un chemin non vide. Cela prend en charge le dernier cas en ajoutant la dernière étape et le marqueur de sortie.
Correspond et renvoie un chemin non vide après un marqueur de sortie.
Supprime le marqueur de sortie et le
I
préfixe du chemin.la source
AvKr
? Ont-ils un sens / sont-ils des abréviations pour haut, bas, gauche et droite dans votre langue maternelle, ou y a-t-il une autre raison pour laquelle vous avez choisi ces caractères spécifiques?AvKr
le plus proche des flèches en alphanum.Perl 6 ,
259295 octetsComment ça marche
Cela serre le labyrinthe afin que l'intérieur de chaque cellule soit 1x1 au lieu de 2x1 espaces:
Il s'agit de la fonction de recherche de chemin récursive. Il prend trois paramètres: la coordonnée actuelle
c=(y,x)
, la liste des coordonnées déjà visitéesv
et le chemin parcourup
jusqu'à présent (sous forme de liste de flèches).Si le caractère à la coordonnée actuelle est un espace, il revient à ses quatre voisins.
Si le caractère à la coordonnée actuelle est un
I
, il revient aux deux voisins qui ne sont pas "le long du bord", pour forcer les solutions à traverser le labyrinthe et non autour.Si le caractère à la coordonnée actuelle est un
U
, il fait appeltake
à la chaîne de chemin accumulée.La fonction récursive est initialement appelée avec la coordonnée de la lettre
I
, qui se trouve à l'aide d'une expression régulière.Le
gather
mot-clé collecte toutes les valeurs sur lesquelles atake
été appelé à l'intérieur de la fonction, c'est-à-dire tous les chemins non cycliques valides à travers le labyrinthe.Le chemin le plus court est choisi, chaque seconde flèche est supprimée pour tenir compte du fait que deux mouvements identiques sont nécessaires pour passer d'une cellule à la suivante, et les flèches restantes sont concaténées pour former la chaîne renvoyée par le lambda.
la source
Python 2: 302 octets
Prend l'entrée comme un tableau de chaînes de même longueur. Imprime
0
pour droite,1
pour bas,2
pour gauche et3
pour haut.Explication
J'ai adopté une approche différente de celle des autres réponses. Idée générale: rechercher récursivement en trouvant le chemin le plus court entre aller droit devant et faire pivoter la planche de 90 degrés.
Essayez-le en ligne!
la source
I
pour empêcher le chemin de sortir du labyrinthe. Profitez de votre séjour, et +1 de moi. :)JavaScript (ES6), 356 octets
Prend l'entrée comme un tableau 2D de caractères. Chaque ligne doit être complétée à gauche par un espace et ne pas avoir d'espace de fin, peu importe où se trouvent les points de début / fin.
Utilise l'idée de smls d'écraser le labyrinthe pour rendre chaque cellule 1x1 et de supprimer les flèches répétées de la sortie.
Non golfé et expliqué
Extrait de test
Afficher l'extrait de code
la source
Rétine , 416 octets
Essayez-le en ligne! Si j'avais vu cette question lorsqu'elle a été publiée à l'origine, c'est probablement la réponse que j'aurais donnée, donc je la poste quand même, même s'il existe une bien meilleure réponse dans Retina. Explication:
Remplissez la bordure. Cela évite de se promener à l'extérieur du labyrinthe (par exemple pour le cas de test 7).
Placez un marqueur non alphabétique à l'entrée.
Remplissage d'inondation de la sortie à l'entrée. À chaque étape, utilisez une lettre pour indiquer la meilleure direction à prendre (wasd - cela pourrait être familier aux joueurs; j'avais également envisagé hjkl mais je l'ai trouvé trop déroutant). De plus, préférez répéter la même direction; cela évite d'aller à gauche / droite entre deux cellules verticalement adjacentes.
Supposons que la première étape soit terminée.
Mais s'il y a une lettre au-dessus, à gauche ou à droite de l'entrée, changez-la à la première étape.
Déplacez le marqueur dans la direction du dernier mouvement, en lisant la direction du mouvement suivant à partir du carré vers lequel le marqueur se déplace, et ajoutez-le à la liste des directions. Cela se répète jusqu'à ce que le
U
soit atteint.Supprimez tout après les instructions car il n'est plus nécessaire.
La grille d'origine est sur une disposition 3 × 2. Tout en se déplaçant verticalement si nous zigzagons horizontalement, le remplissage inondé optimisera le mouvement et ne déplacera que 3n-1 caractères horizontalement, donc lors de la division par trois, nous devons arrondir. Verticalement, nous divisons simplement par 2.
J'ai également étudié une véritable solution de grille carrée, c'est-à-dire où la matrice de caractères est elle-même carrée plutôt que d'être une mise en page 3 × 2 avec une bordure facultative. Bien que probablement non conforme à la question, la possibilité de transposer a réduit le nombre d'octets à 350: essayez-le en ligne!
la source
-
autour des caractères d'entrée et de sortie. Étant donné que le défi consiste principalement à traverser le labyrinthe, je suppose que c'est bien, mais je suis curieux: quels étaient les problèmes lorsque vous n'aviez pas placé ces murs au-dessus / en dessous duI
etU
? Aussi, pourriez-vous vérifier que cela fonctionne pour le cas de test 7 avec leI
etU
en haut au lieu des côtés? TIO dépasse la limite de 60 secondes, je ne peux donc pas le tester moi-même. Bien que vous ayez lu votre explication sur la première tentative de descendre par défaut, je suppose que cela devrait fonctionner correctement.