Dyalog APL, 27 karakter
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
değerlendirilmiş girdi. APL, bir matris ve bir vektör vektörü arasında ayrım yapar. Bu program, girdinin bir matris olduğunu varsayar.
(~×⍳∘⍴)A
eşit bir çatal (~A) × ⍳⍴A
. ⎕
İki kez bahsetmekten veya bir değişken getirmekten kaçınmak gerekir .
⍴A
şeklindedir A
. 4'e 7 matris için şekil 4 7
.
⍳
indeks üretecidir. ⍳4
olduğunu 1 2 3 4
. R4, 4'e 7 matrisinde düzenlenmiş ⍳4 7
vektörlerdir (1 1)(1 2)...(4 7)
.
~A
uçlarını çevirir A
.
×
⍳⍴A
ters çevrilmiş bitlerle çarparak , tüm serbest hücrelerin koordinatlarını koruyoruz ve tüm duvarları dönüştürüyoruz 0 0
.
,
koordinat çiftlerinin matrisini ravel eder, yani onu bir vektöre doğrusallaştırır. Bu durumda, vektör çiftlerden oluşacaktır.
∘.-⍨A
veya A∘.-A
öğeleri A
çift olarak çıkarır . Burada öğelerinin A
kendilerinin çift olduğunu unutmayın.
|
mutlak değer
+/¨
her mutlak değer çiftini toplayın. Bu bize labirentteki her hücre çifti arasındaki ızgara mesafelerini verir, duvarlar için tasarruf sağlar.
1≥
sadece 1'den fazla olmayan bir mesafede komşularımızla ilgileniyoruz, bu da duvarları hariç tutuyor. Şimdi bir grafiğin bitişiklik matrisimiz var.
∨.∧⍨⍣≡
Floyd - Warshall'ın geçişli kapatma algoritması
(f⍣n)A
(burada kullanılmaz) burada n
bir tamsayı güç operatörüdür. Bu uygular f
için A
n
zamanlarda: f f ... f A
.
(f⍣g)A
nerede g
bir fonksiyon, sabit nokta operatörü, yani "güç limiti" dir. Bu dizi işlem devam ediyor A
, f A
, f f A
, ... kadar ((f⍣i)A) g ((f⍣(i+1))A)
bazıları için gerçek getiri i
. Bu durumda match ( ≡
) öğesini kullanırız g
.
∨.∧⍨A
ya A∨.∧A
da Floyd'un algoritmasında bir adımdır. f.g
matris çarpımı (bir genellemedir +.×
), burada birleşim (kullanımı ∧
) ve ayrım ( ∨
yerinde) +
ve ×
.
⊃⌽
⍣≡
Adımı yeterince kez uyguladıktan ve kararlı bir duruma ulaştıktan sonra , sonucu elde etmek için matrisin sağ üst köşesine bakmalıyız, bu yüzden onu çeviririz ( ⌽
) ve ilk, sol üstteki öğeyi ( ⊃
) alırız .
⍣≡
Adımlarının görselleştirilmesi