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.
(~×⍳∘⍴)A
est un fork équivalent à (~A) × ⍳⍴A
. Il faut éviter de mentionner ⎕
deux fois ou d'introduire une variable.
⍴A
est la forme de A
. Pour une matrice 4 x 7, la forme est 4 7
.
⍳
est le générateur d'index. ⍳4
est 1 2 3 4
. ⍳4 7
est les vecteurs (1 1)(1 2)...(4 7)
disposés dans une matrice 4 x 7.
~A
retourne les morceaux de A
.
×
en multipliant ⍳⍴A
par 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.
∘.-⍨A
ou A∘.-A
soustrait des éléments de A
paire. Notez qu'ici les éléments de A
sont 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ù n
est un entier est l'opérateur de puissance. Il applique f
à A
n
temps: f f ... f A
.
(f⍣g)A
où g
est 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
.
∨.∧⍨A
ou A∨.∧A
est une étape dans l'algorithme de Floyd. f.g
est 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