﻿# 進捗レポート（日本語） - NihonJijo_Procon

作成日: 2026-02-12

## 1) リポジトリの現状（スナップショット）

- `procon_tool.py`: パズル生成（スクランブル含む）/HTTP配信/コンソール表示のユーティリティ。
- `visualizer/`: 操作列を前後に再生し、隣接ペアをハイライトする Tkinter GUI。
- `solver/v1/`: C 言語のソルバ（ビームサーチのベースライン）＋最小限の JSON ローダ。
- `puzzles/` と `Puzzle_*.json`: 入力例（コンテストの JSON 形式）。
- `Solution_*.json`, `solution_*.json`: 出力例/過去のソルバ出力。
- `36matsue_bosyuyokou.pdf`: 参考資料（本レポートでは内容未解析）。

注意: `solver/v2/` は存在しますが、依頼により本レポートでは対象外です。

## 2) 入力形式とルール（実装が前提としている内容）

- 入力（コンテスト形式）: `startsAt`, `problem.field.size`, `problem.field.entities`。
- `size` は偶数かつ 4..24 を想定（ソルバ側でチェック）。
- ソルバの評価指標: 同じ値が上下左右に隣接している箇所の数（右・下のみを数えて重複カウントを避ける）。
- 操作: `n x n` の部分正方形を 90 度「時計回り」に回転。

## 3) ローカルツール（Python）

### `procon_tool.py`

実装済みサブコマンド:

- `generate`
  - 初期状態は「各行で横に同値が並ぶ」完成形。
  - そこから合法回転を繰り返してスクランブルし、パズル JSON を `--output` に保存。
  - `--ops-out` には `{ "direction": "cw|ccw", "ops": [...] }` 形式で操作列も保存。

- `serve`
  - 保存済みパズル JSON を `/` で配信。
  - `--ops-input` を指定した場合 `/ops` で操作列も配信。

- `view`
  - `size` とグリッドをコンソール出力。

注意点:
- `generate --scramble-dir ccw` を使うと「反時計回り(CCW)」の操作列が記録されます。
  競技上の操作は時計回り(CW)であり、さらに `visualizer/main.py` と `serve` は `direction` を見ないため、CCW の ops をそのまま再生すると一致しません（変換または対応が必要）。

## 4) ビジュアライザ（Python + Tkinter）

ファイル: `visualizer/main.py`

- パズル JSON と ops JSON を読み込み。
- 「進む」は各 op を時計回り回転として適用。
- 「戻る」は逆操作として（時計回り3回）を適用。
- 隣接ペアに含まれるセルをハイライト。

制約:
- ops は時計回り前提（`direction` フィールド非対応）。

## 5) Solver v1（C）- 現状の動作

構成ファイル:
- `solver/v1/main.c`: CLI、入出力、`{ "ops": [...] }` を出力。
- `solver/v1/json.c`: `size` と `entities` を読むための簡易 JSON パーサ（厳密ではない）。
- `solver/v1/board.c`: 盤面コピー、時計回り回転、ペア数の全再計算。
- `solver/v1/search.c`: ビームサーチ。

### CLI

`solver/v1/main.c` より:

- `--input <puzzle.json>`（必須）
- `--output <ops.json>`（任意、未指定は stdout）
- `--width N` ビーム幅（デフォルト 200）
- `--depth N` 最大深さ（デフォルト 25）
- `--nlimit N` 考慮する回転サイズの上限（デフォルト 4）

### ビームサーチ概要

- 手 `(x, y, n)` を `n = 2..min(size, nlimit)` で全列挙。
- 各ノードで全手を評価するが、次展開候補は「直後の `pair_count` が高いもの」上位 `MAX_CHILDREN_PER_NODE` (= 32) のみに絞る。
- 次フロンティアの順位付けは `score = pair_count * 1000 - path_len`。
- グローバルに最良解を保持し、理論最大 `size^2 / 2` に到達したら早期終了。

### 現状の制約/弱点

- 各手ごとにペア数を全再計算（差分更新なし）。
- 候補評価で回転を二重適用しており、無駄がある。
- 重複状態の排除（トランスポジション等）なし。
- JSON パースが文字列探索＋整数の拾い読みなので、入力の揺れに弱い。
- 時間制限オプションなし（主に `width/depth/nlimit` で実行量を調整）。

## 6) 付属データ/成果物

- ルートの `Puzzle_4By4.json`, `Puzzle_8By8.json`, `Puzzle_16By16.json`（入力例）と `Solution_*.json`（出力例）。
- `puzzles/` に追加のパズルと ops（`"direction": "ccw"` を含むものあり）。
- `solver/v1/build/` に CMake のビルド成果物（exe 等）が既に存在。

## 7) 次にやると効きそうなこと（v1範囲内）

1) ops の方向を統一: ツール側で常に CW の ops を出力するか、`visualizer/main.py` と `procon_tool.py serve` が `direction` を解釈する。
2) 速度改善: 二重適用をやめる／ペア数の差分更新を入れる。
3) `--time-ms` 等の時間予算を追加して、最良解を返して終了できるようにする。
4) 入力の堅牢化（ちゃんとした JSON パーサ、または `entities` の検証強化）。
