Dyalog APL, 27 caractères
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕entrée évaluée. APL fait la distinction entre une matrice et un vecteur de vecteurs. Ce programme suppose que l'entrée est une matrice.
(~×⍳∘⍴)Aest un fork équivalent à (~A) × ⍳⍴A. Il faut éviter de mentionner ⎕deux fois ou d'introduire une variable.
⍴Aest la forme de A. Pour une matrice 4 x 7, la forme est 4 7.
⍳est le générateur d'index. ⍳4est 1 2 3 4. ⍳4 7est les vecteurs (1 1)(1 2)...(4 7)disposés dans une matrice 4 x 7.
~Aretourne les morceaux de A.
×en multipliant ⍳⍴Apar les bits inversés, nous préservons les coordonnées de toutes les cellules libres et transformons tous les murs en 0 0.
,défile la matrice de paires de coordonnées, c'est-à-dire la linéarise en un vecteur. Dans ce cas, le vecteur sera composé de paires.
∘.-⍨Aou A∘.-Asoustrait des éléments de Apaire. Notez qu'ici les éléments de Asont eux-mêmes des paires.
| valeur absolue
+/¨additionner chaque paire de valeurs absolues. Cela nous donne les distances de grille entre chaque paire de cellules dans le labyrinthe, à l'exception des murs.
1≥nous ne sommes intéressés que par des voisins à une distance ne dépassant pas 1, cela exclut également les murs. Nous avons maintenant une matrice d'adjacence de graphe.
∨.∧⍨⍣≡ Floyd - L'algorithme de fermeture transitive de Warshall
(f⍣n)A(non utilisé ici) où nest un entier est l'opérateur de puissance. Il applique fà A ntemps: f f ... f A.
(f⍣g)Aoù gest une fonction, est l'opérateur à virgule fixe, alias "limite de puissance". Il continue à calculer la série A, f A, f f A, ... jusqu'à ce que le ((f⍣i)A) g ((f⍣(i+1))A)rendement vrai pour certains i. Dans ce cas, nous utilisons match ( ≡) as g.
∨.∧⍨Aou A∨.∧Aest une étape dans l'algorithme de Floyd. f.gest une généralisation de la multiplication matricielle ( +.×), nous utilisons ici la conjonction ( ∧) et la disjonction ( ∨) à la place de +et ×.
⊃⌽ Après ⍣≡avoir appliqué l'étape suffisamment de fois et atteint un état stable, nous devons rechercher le coin supérieur droit de la matrice pour obtenir le résultat.Nous le retournons donc ( ⌽) et prenons le premier élément supérieur gauche ( ⊃).
Visualisation des ⍣≡étapes de