Dyalog APL、27文字
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕評価された入力。APLは、行列とベクトルのベクトルを区別します。このプログラムは、入力が行列であることを前提としています。
(~×⍳∘⍴)Aはに相当するフォークです(~A) × ⍳⍴A。⎕2回言及したり、変数を導入したりしないようにする必要があります。
⍴Aはの形ですA。4行7列の行列の場合、形状は4 7です。
⍳インデックスジェネレーターです。 ⍳4です1 2 3 4。 4行7列の行列に配置された⍳4 7ベクトル(1 1)(1 2)...(4 7)です。
~Aのビットを反転しますA。
×⍳⍴A反転したビットを乗算することにより、すべての空きセルの座標を保持し、すべての壁をに変え0 0ます。
,座標ペアの行列を解きます。つまり、ベクトルに線形化します。この場合、ベクトルはペアで構成されます。
∘.-⍨AまたはA∘.-A、Aペアワイズの要素を減算します。ここでの要素Aはそれ自体ペアであることに注意してください。
| 絶対値
+/¨絶対値の各ペアを合計します。これにより、壁を除いて、迷路内のセルの各ペア間のグリッド距離が得られます。
1≥私たちは、1以下の距離で隣人に興味を持っているだけです。これは壁も除外します。これで、グラフの隣接行列ができました。
∨.∧⍨⍣≡ フロイド-ウォーシャルの推移閉包アルゴリズム
(f⍣n)A(ここでnは使用しません)where is in integer is is power operatorです。時間に適用さfれA nますf f ... f A。
(f⍣g)Awhere gは関数で、固定小数点演算子、別名「電力制限」です。それは、一連の計算に保ちA、f A、f f A、...まで((f⍣i)A) g ((f⍣(i+1))A)いくつかのために真を返しますi。この場合、match(≡)を使用しgます。
∨.∧⍨AまたはA∨.∧A、フロイドのアルゴリズムのステップです。 f.gは行列乗算の一般化(+.×)です。ここではandの代わりに接続詞(∧)と選言(∨)を使用します。+×
⊃⌽⍣≡ステップを十分に適用して安定状態に達した 後、マトリックスの右上隅を検索して結果を取得する必要があるため、それを反転(⌽)し、最初の左上の項目(⊃)を取得します。
⍣≡のステップの可視化