Діалог 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
є узагальненням матричного множення ( +.×
), тут ми використовуємо сполучник ( ∧
) і диз'юнкцію ( ∨
) замість +
і ×
.
⊃⌽
Після ⍣≡
того, як достатньо разів застосували крок і досягли стабільного стану, ми повинні шукати верхній правий кут матриці, щоб отримати результат, тому перевертаємо його ( ⌽
) і беремо перший, лівий верхній елемент ( ⊃
).
Візуалізація ⍣≡
кроків Росії