Dyalog APL, 27 znaków
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
oceniane dane wejściowe. APL rozróżnia macierz od wektora wektorów. Ten program zakłada, że wejście jest macierzą.
(~×⍳∘⍴)A
jest widelcem równoważnym (~A) × ⍳⍴A
. Konieczne jest uniknięcie ⎕
dwukrotnego wspominania lub wprowadzania zmiennej.
⍴A
ma kształt A
. Dla matrycy 4 na 7 kształt jest 4 7
.
⍳
jest generatorem indeksu. ⍳4
jest 1 2 3 4
. ⍳4 7
to wektory (1 1)(1 2)...(4 7)
ułożone w matrycy 4 na 7.
~A
przerzuca kawałki A
.
×
mnożąc ⍳⍴A
przez odwrócone bity, zachowujemy współrzędne wszystkich wolnych komórek i zamieniamy wszystkie ściany w 0 0
.
,
niszczy macierz par współrzędnych, tj. linearyzuje ją do wektora. W takim przypadku wektor będzie składał się z par.
∘.-⍨A
lub A∘.-A
odejmuje elementy A
parami. Zauważ, że tutaj elementy A
same w sobie są parami.
|
całkowita wartość
+/¨
zsumuj każdą parę wartości bezwzględnych. To daje nam odległości siatki między każdą parą komórek w labiryncie, z wyjątkiem ścian.
1≥
interesują nas tylko sąsiedzi w odległości nie większej niż 1, nie obejmuje to również ścian. Teraz mamy macierz sąsiedztwa wykresu.
∨.∧⍨⍣≡
Floyd - algorytm przechwytywania przechwytywania Warshalla
(f⍣n)A
(nieużywany tutaj), gdzie n
liczba całkowita jest operatorem mocy. Ma ona zastosowanie f
do A
n
czasów: f f ... f A
.
(f⍣g)A
gdzie g
jest funkcją, to operator punktu stałego, znany również jako „limit mocy”. Utrzymuje się na obliczaniu serii A
, f A
, f f A
, ... aż ((f⍣i)A) g ((f⍣(i+1))A)
Zwraca true dla niektórych i
. W tym przypadku używamy match ( ≡
) jako g
.
∨.∧⍨A
lub A∨.∧A
jest krokiem w algorytmie Floyda. f.g
jest uogólnieniem mnożenia macierzy ( +.×
), tutaj używamy koniunkcji ( ∧
) i disjunction ( ∨
) zamiast +
i ×
.
⊃⌽
Po ⍣≡
wystarczającym zastosowaniu kroku i osiągnięciu stanu stabilnego musimy spojrzeć w prawy górny róg matrycy, aby uzyskać wynik, więc odwracamy go ( ⌽
) i bierzemy pierwszy, lewy górny element ( ⊃
).
Wizualizacja ⍣≡
kroków