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