059 雪道の救助隊

主な迷い: 今すぐ着くか、帰りと次の往復に使う道を先に固めるか。
AとBへ期限内に連絡し、担架でHへ一人ずつ運びます。連絡は到着時、搬送は別の判断です。遭難者の地点で「救助開始」を選びZ。乗せるのは1刻。Hで自動的に救助完了。

起動
Windows: Python 3を入れ、setup.batを一度実行。以後play.bat。日本語と空白のあるフォルダを想定した引用符付きASCIIバッチです。
macOS/Linux: bash setup.sh、bash play.sh。
実行時の依存はPyxelのみとPython標準ライブラリ。assets/glyphs.jsonも同梱してください。開発時のフォント生成・動画変換にはPillow/ffmpegを使っていますがプレイには不要。
Linuxクラウドで機能確認。Windowsネイティブ操作、実音、人による楽しさは未確認です。

操作
矢印: 右の行動を選ぶ。Space: 歩行/整備。Z: 決定。
X: 移動または救助一判断を戻す。R: 同じ雪道を最初から。
P: 説明/停止。1/2/3: 検証済みA/B/Cへ。S: 現在seed・盤面・入力をrecordsへ保存。切替前にも保存できます。M: 表紙。B: 一規則比較と同時に最初から。ESC: 終了。
結果画面からもX/Rを使えます。新しい画面では一度キーを離してください。

計算
辺は距離dと雪s。未整備の空身はd×s、担架はd×(s+2)。空身で整備しながら進むとd×(s+1)。終点到着で整備完成。その後は双方向・次の往復でも空身/担架ともdです。担架中は整備不可。整備済みを再整備する操作も拒否され、時間は進みません。
連絡期限ちょうどは有効。移動中に別の人の期限が過ぎるとその人は期限超過。連絡済みの人は期限後も乗せられますが勤務終了までの搬送が必要。勤務終了ちょうどのH到着は有効です。
二人で成功。一人や零人でHから「切り上げる」を選ぶ安全帰還も記録します。救助数以外に時刻と整備本数を比較できます。
地図は模式図。線の長さではなく各辺の距離/雪を読んでください。予告は選んだ行動の必要刻数と到着時刻です。

有限bankと再現
A-01-v1/B-01-v1/C-01-v1だけを公開。任意整数seedや無限生成ではありません。候補図の数値は変更せず、全族の二人救助と異なる整備計画を開発時に確認しました。
model.pyはPyxel非依存のLevel/State/step。app.pyが表示/キー解放/記録を担当。実行時に探索はしません。
recordsのJSONは確定辺・期限・生成器版・規則版・比較規則・正規化UTF-8 JSON SHA-256・意味入力/論理tick・終了hash・環境版を含みます。
python tools/replay_record.py 記録.json で別プロセス再生。Pythonパッチ版/Pyxel版/model環境も厳密一致を要求し、違いがあれば環境不一致を説明して拒否します。表示や停止の回数はモデルに影響しません。

比較の実測
A最短35刻/整備2本、整備1本なら36刻。
B最短23刻/整備2本、整備なしでも32刻。
C最短26刻/整備3本、整備なしでも38刻。
これは開発時の有限探索による到達結果。人の楽しさの証明ではありません。
Cの「整備済みの担架費用だけ元の雪費用へ戻す」比較は、A一人の救助帰還も二人救助も両版で成立。二人最短は通常26刻/比較38刻。空身の整備効果、地形、期限は同じです。

ファイル
test_model.py / test_ui.py: モデル境界、undo、再生、入力解放、描画純粋性。GUI証拠のwriterをstub化し保存先も分離。
experiments.py: 開発用有限探索と明示的な単純方策。solver_results.json / policy_results.json / comparison_results.json / solution_logs.jsonに完全な手順。
media/*automatic_silent.mp4: 実Pyxel描画を自動操作した機能確認映像。無音。全749原フレームを一度ずつ30fpsに配置、24.966667秒。人の試遊ではありません。
media/source_capture_v1: 初回自動撮影時の原ソース。後の再生検証は元観測を変更せず別ファイルへ。
LICENSE.txt: 自作部分MIT。フォント派生glyphはassets/NOTO-LICENSE.txtのSIL OFL 1.1。
