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)A
where g
は関数で、固定小数点演算子、別名「電力制限」です。それは、一連の計算に保ちA
、f A
、f f A
、...まで((f⍣i)A) g ((f⍣(i+1))A)
いくつかのために真を返しますi
。この場合、match(≡
)を使用しg
ます。
∨.∧⍨A
またはA∨.∧A
、フロイドのアルゴリズムのステップです。 f.g
は行列乗算の一般化(+.×
)です。ここではandの代わりに接続詞(∧
)と選言(∨
)を使用します。+
×
⊃⌽
⍣≡
ステップを十分に適用して安定状態に達した 後、マトリックスの右上隅を検索して結果を取得する必要があるため、それを反転(⌽
)し、最初の左上の項目(⊃
)を取得します。
⍣≡
のステップの可視化