Діалог APL, 27 символів
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕оцінений вхід. APL розрізняє матрицю і вектор векторів. Ця програма передбачає, що вхід є матрицею.
(~×⍳∘⍴)Aє виделкою, еквівалентною (~A) × ⍳⍴A. Потрібно уникати згадування ⎕двічі або введення змінної.
⍴Aце форма A. Для матриці 4 на 7 форма є 4 7.
⍳є генератором індексів. ⍳4є 1 2 3 4. ⍳4 7- це вектори, (1 1)(1 2)...(4 7)розташовані в матриці 4 на 7.
~Aгортає шматочки A.
×помноживши ⍳⍴Aна перевернуті біти, ми зберігаємо координати всіх вільних комірок і перетворюємо всі стінки на 0 0.
,розгортає матрицю пар координат, тобто лінеаризує її у вектор. У цьому випадку вектор буде складатися з пар.
∘.-⍨Aабо A∘.-Aвіднімати елементи Aпопарно. Зауважимо, що тут елементи Aсамих пар.
| абсолютне значення
+/¨підсумовуйте кожну пару абсолютних значень. Це дає нам відстані сітки між кожною парою комірок у лабіринті, окрім стін.
1≥нас цікавлять лише сусіди на відстані не більше 1, це також виключає стіни. Тепер у нас є матриця суміжності графіка.
∨.∧⍨⍣≡ Флойд - алгоритм транзитивного закриття Варшалла
(f⍣n)A(не використовується тут), де nціле число - це оператор електроенергії. Це відноситься fдо A nчасу: f f ... f A.
(f⍣g)Aде gфункція - це оператор нерухомої точки, він же "обмеження потужності". Він продовжує обчислення серії A, f A, f f A, ... до ((f⍣i)A) g ((f⍣(i+1))A)повернення вірно для деяких i. У цьому випадку ми використовуємо match ( ≡) як g.
∨.∧⍨Aабо A∨.∧Aє кроком в алгоритмі Флойда. f.gє узагальненням матричного множення ( +.×), тут ми використовуємо сполучник ( ∧) і диз'юнкцію ( ∨) замість +і ×.
⊃⌽ Після ⍣≡того, як достатньо разів застосували крок і досягли стабільного стану, ми повинні шукати верхній правий кут матриці, щоб отримати результат, тому перевертаємо його ( ⌽) і беремо перший, лівий верхній елемент ( ⊃).
Візуалізація ⍣≡кроків Росії