025 折りたたみ駅
駅を重ねて乗り換えたら、線路のために紙を開く。

Python 3.10+ / Pyxel 2.9.9。短い3面の紙の路線パズル。音は使いません。
日本語表示には同梱のビットマップ字形を使用。追加フォントのインストール不要。
Windows: Pythonをインストールし、setup.batを一度実行。その後play.bat。
macOS/Linux: bash setup.sh → bash play.sh。
バッチはASCII、パス引用、起動失敗時pause付き。任意の作業ディレクトリから起動可能。
launch.shは検証環境専用。配布先ではplay.bat / play.shを使用してください。

操作
タイトルで左右: 面を選ぶ、SPACE: 開始
X: V(縦の折れ目)を折る/開く。C: H(横)を折る/開く。A面はVのみ。
矢印: 行先欄から駅を選ぶ。SPACE: 選択した行先へ移動/乗換。
Z: 直前の確定行動を戻す。R: 同じ面を最初から。P: 説明/停止。
成功後N: 次の面。M: 面選択。ESC: 終了。F12: 実画面をmediaへ保存。
押下1回につき1行動。長押しは繰り返さない。複数の操作キーは同時受付しない。
開始・再開・次面・リセット・折り・移動の後は、操作キーを全部離して次の入力へ。
折り/移動/undoで行先の選択を解除。SPACEだけで意図しない駅へは乗りません。

ルール
4×4の紙。Vは右半分を左へ、Hは下半分を上へ重ねます。
元の駅IDを切符に表示し、黄色い番号札と赤い印で乗客の駅を示します。
重なった駅の番号札は全て表示。行先欄で明示的に乗換します。
印刷線路は駅と駅を結ぶ固定路線。途中の交差や線の重なりでは乗換しません。
元の紙上で折れ目をまたぐ線路は、その折れ目を閉じている間、全線が運休。
赤い点線と×、行先欄の「運休(V/H)」で表示。右には常に開いた元の図を表示。
X/C後の小さい点線図は重なりと運休の予告。予告の黄色い輪は重なる駅です。
G駅へ実際に乗り換え、紙を全部開くと成功。同じ見かけの位置だけでは成功しません。
V/Hの幾何変換自体は可換。紙の厚み、裏表、積層遮蔽は扱わない模型です。
時間制限、手数制限、残機はありません。短い合法別解を禁止しません。

3面
A 向こう岸を重ねる: 紙を開いても、移った駅のIDは保たれる。
B 折れ目は運休: Q-Rの線路を使うにはVを開く。
C この折り目は残す: A-BはHにまたがるがVにはまたがらない。
Vを残してA→B→Cと進める。一方、毎回開く遠回りも合法。

技術
model.pyはPyxel非依存の不変データと原子的transition。
元座標、投影座標、路線ID、運休の判定を分け、描画に接続判定を任せません。
Stateは駅ID、V/H、参考カウンター。探索キーから参考カウンターのみを除外。
solver.pyは全到達状態を探索し、成功入力と状態ハッシュをsolver_results.jsonへ保存。
比較はBの同配置で「折れ目を跨いでも運休しない」だけを変更した実験用基準。
EXPERIMENT.txtに意味と限界を記載。基準も本版も最短7操作で、手数増加の主張はしません。

検証の実行
python -m unittest -v test_model test_ui
python solver.py
python tools/test_portability.py
python app.py --demo --headless
python tools/export_video.py
検証用ツールにはPillowとffmpeg/ffprobeが別途必要。通常プレイはrequirements.txtだけ。
日本語字形はNoto Sans CJK由来。SIL OFLはassets/NOTO-LICENSE.txt。
英数字はDejaVu Sans Mono由来。ライセンスはassets/DEJAVU-LICENSE.txt。
ソース・オリジナル絵はLICENSE.txt。字体生成ツールはtools/build_font.py。

映像
media/folding_station_automatic_silent.mp4は実Pyxel描画、自動入力、無音。
元GIFの全フレームを1度ずつ30fpsへ割り当てたMP4。GIFの丸められた待ち時間は使いません。
人の試遊動画ではありません。画面の自動入力字幕にも明記。
native Linux入力確認、正確なフレーム数、未検証点はQA.txtを参照。
公開投稿は行っていません。NOTE.txtとX_POSTS.txtは投稿用原稿です。
