CodinGameでKakuro Solverという新しく申請されている問題、
カックロというパズルを解くためのデータ設計をしてみます。
問題の初期に送られてくるデータ形式
マスは (1)[縦の数字\横の数字](どちらか入っていないことが多い) (2)空白 (3)X:塗られている
マスの区切りは列が | で区切られています。わかりやすくスペースで揃えているようです。
データ設計でないものも含まれていますが初期構想をテキスト化したもの
1) データを展開、縦マップ、横マップ、数値用マップ 3枚か
2) 別に数値、マスのパターンデータ作成
3) 1) 2)を何らかの方法でうまいことマージ(まったく浮かんでいない)
4) クロスで置ける数値が1つを配置していって解答まで作成
5) 最後仮置きして解けるか推理の展開のようなルーチンで力技
実装開始
6) 位置ごとに縦横で置ける数値を入れるマップに 2)を入れる(未だに浮かんでいない)
7) 縦マップは回転させて横にするといいかも(策に溺れかねないので微妙)
※ここでいうマップは言語のマップではなく画面のデータ
プログラムの説明
d_print file=sys.stderrを一回ですますため
write_board 何度も似た形式で呼ばれるので作成
left_turn_board 左90度回転
semi_split (命名ミス)コロンで区切られているデータの時だけ0左1右を入れる
num_pattarn 今回未使用 することは決まっているが、プログラム方法がまだ固まっていない
34行目 まずラインの端の|を取る、次にスペースを取る、
バックスラッシュは文字列の中で特殊な処理をしたりするので:に置き換える、最後に|で分ける
(一番最初の画面のデータを配列に加工してます)
データが見づらいので成型してみます。
デバッグ時など少しでも見やすいほうが助けになります。
space リストの各文字列が指定sizeになるまでスペースを付加したリストを返す。
write_board 拡張sizeが指定されて時はサイズ調整を呼ぶ。
こんな感じで終わりです。
左90度回転を真ん中に表示させたのは少し失敗。下のほうがわかりやすいです。