メインコンテンツまでスキップ

koyu doors

空間グラフ上で、ある空間から別の空間へ最少の扉数で辿る経路を出す。避難と動線の問いである。

引数

koyu doors <entry.muro> <パスA> <パスB>

entry のパスの後に、出発と到着の空間パスを両方渡す。両方必須である。

無い。

出力

扉の枚数と、経由した空間の列が一行で出る。

npx tsx src/cli.ts doors examples/two-rooms.muro /L1/a /out
2 doors — /L1/a → /L1/b → /out

経路は空間の列であって扉の列ではない。扉を数えない境界 (open や階段) も経路の途中に現れる。

npx tsx src/cli.ts doors examples/house/main.muro /home/bed1 /out/road
3 doors — /home/bed1 → /home/hall2 → /home/hall1 → /site/east → /site/garden → /out/road

五つの境界を跨いでいるのに扉は 3 枚である。/home/hall2 → /home/hall1 は階段、/site/east → /site/gardenopen なので数えられない。

到達できなければその旨が出る。

npx tsx src/cli.ts doors examples/house/main.muro /home/bed9 /site/garden
Cannot reach /site/garden from /home/bed9

何が通れるか

境界通れるか
扉のある壁通れる (扉の枚数を数える)
扉の無い壁通れない
open通れる (扉を数えない)
air:1 の壁 (手すり・柵・塀)通れないair は遮蔽の話であって通行の話ではない
stair通れる (扉を数えない)
shaft (EV 等)通れない
void (吹抜け)通れない

書かれていない境界も経路に使われる。接する空間の既定は壁で、扉の無い壁は通れないので、書かなかった接触は経路を塞ぐ側に働く。

存在しないパスの扱い

綴りを間違えたパスを渡しても「到達できません」と出る。綴り違いと本当の未到達は、同じメッセージ・同じ終了コード 1 になる。上の例の /home/bed9 は存在しない空間である。

到達できないと出たら、まず koyu graph でパスの綴りを確かめる。外部は一つとは限らない — examples/house の外部は /out/road /out/n /out/e /out/w に割れていて、/out という空間は存在しない。

終了コード

終了コード意味
0到達できる
1到達できない (存在しないパスを含む)、または構文・合成エラーで読めなかった
2パスが二つ揃っていない / ファイルパスを渡していない
npx tsx src/cli.ts doors examples/house/main.muro /home/bed1
Usage: koyu doors <file> /pathA /pathB

一組ずつしか答えない

doors が答えるのは渡した一組についてだけである。「どこか一つでも外へ出られない室があるか」を建物全体について問うなら koyu validate を使うaccess.unreachable が、領域を持つ室のすべてについて外部への到達可能性を確かめる。

関連