Dyalog APL, 27 Zeichen
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
ausgewertete Eingabe. APL unterscheidet zwischen einer Matrix und einem Vektor von Vektoren. Dieses Programm geht davon aus, dass die Eingabe eine Matrix ist.
(~×⍳∘⍴)A
ist eine Gabel äquivalent zu (~A) × ⍳⍴A
. Es muss vermieden werden, ⎕
zweimal zu erwähnen oder eine Variable einzuführen.
⍴A
ist die Form von A
. Für eine 4-mal-7-Matrix lautet die Form 4 7
.
⍳
ist der Indexgenerator. ⍳4
ist 1 2 3 4
. ⍳4 7
sind die Vektoren, (1 1)(1 2)...(4 7)
die in einer 4 × 7-Matrix angeordnet sind.
~A
dreht die Bits von A
.
×
Durch Multiplikation ⍳⍴A
mit den umgedrehten Bits behalten wir die Koordinaten aller freien Zellen bei und verwandeln alle Wände in 0 0
.
,
reist die Matrix der Koordinatenpaare, dh linearisiert sie in einen Vektor. In diesem Fall besteht der Vektor aus Paaren.
∘.-⍨A
oder A∘.-A
subtrahiert Elemente A
paarweise. Beachten Sie, dass die Elemente von A
hier selbst Paare sind.
|
Absolutwert
+/¨
Summiere jedes Paar absoluter Werte. Dies gibt uns die Gitterabstände zwischen jedem Zellenpaar im Labyrinth, abgesehen von Wänden.
1≥
Wir sind nur an Nachbarn interessiert, die nicht weiter als 1 entfernt sind. Dies schließt auch Mauern aus. Jetzt haben wir die Adjazenzmatrix eines Graphen.
∨.∧⍨⍣≡
Floyd - Warshalls Transitiver Schließungsalgorithmus
(f⍣n)A
(hier nicht verwendet) wobei n
eine ganze Zahl der Energieoperator ist. Es gilt f
zu A
n
Zeiten: f f ... f A
.
(f⍣g)A
Wo g
ist eine Funktion, ist der Festpunktoperator, auch bekannt als "Leistungsgrenze". Es hält auf die Serie der Berechnung A
, f A
, f f A
, ... bis ((f⍣i)A) g ((f⍣(i+1))A)
kehrt gilt für einige i
. In diesem Fall verwenden wir match ( ≡
) als g
.
∨.∧⍨A
oder A∨.∧A
ist ein Schritt in Floyds Algorithmus. f.g
ist eine Verallgemeinerung der Matrixmultiplikation ( +.×
), hier verwenden wir Konjunktion ( ∧
) und Disjunktion ( ∨
) anstelle von +
und ×
.
⊃⌽
Nachdem ⍣≡
wir den Schritt genügend oft angewendet haben und einen stabilen Zustand erreicht haben, müssen wir die obere rechte Ecke der Matrix nachschlagen, um das Ergebnis zu erhalten. Wir drehen es ( ⌽
) und nehmen das erste Objekt oben links ( ⊃
).
Visualisierung der ⍣≡
Schritte