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