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.
(~×⍳∘⍴)Aeş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. ⍳4olduğunu 1 2 3 4. R4, 4'e 7 matrisinde düzenlenmiş ⍳4 7vektörlerdir (1 1)(1 2)...(4 7).
~Auçlarını çevirir A.
×⍳⍴Aters ç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.
∘.-⍨Aveya A∘.-Aöğeleri Açift olarak çıkarır . Burada öğelerinin Akendilerinin ç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 nbir tamsayı güç operatörüdür. Bu uygular fiçin A nzamanlarda: f f ... f A.
(f⍣g)Anerede gbir 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.
∨.∧⍨Aya A∨.∧Ada Floyd'un algoritmasında bir adımdır. f.gmatris ç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