練習メモ: Cryptarithm Solver
虫食い算を解くツールを書いてみた。 制約プログラミングの練習をしたかったのでGoogle OR-Toolsを使った。 Dockerイメージを公開したので簡単に使えるはず。
|
|
こんな感じで解いてくれる。
|
|
制約プログラミングに慣れるのだけが目的だったけどなんだかんだ教育的でいい練習になった。
- 問題の構文解析のためにLL(1)構文解析器を書き下した
- 虫食い算の意味を理解するために、抽象構文木の訪問器を実装した
- OR-Tools::CP-SATで充足可能問題をモデリングした
- FastAPIを使ってOpenAPI対応サーバーを立てた
- Python-Fireを使ってコマンドラインを実装した
- mypyを使って型アノテーションの検査を行うようにした
- pytestを思い出そうとした
- コンテナイメージをマルチステージで行いPipenvが残らないようにしてみた
- 既存リポジトリのサブディレクトリで作業していたのを別のリポジトリにヒストリごと切り出した
- 作業元のリポジトリのmasterが変わってしまったのでreflog使って戻した
それぞれ必要になったときに読むべきリファレンスへのリンクは貼ってる。
ちょっとした感想
FastAPI, Python-Fireはそれぞれドキュメント付きOpenAPIサーバ、コマンドラインツールを簡単に作れる。 メンテナンスもされているし機能が小さい。特別な理由がなければPythonで実装するときはこれを使ってしまうのが早そう。
FastAPIはマイクロフレームワークを目指してる。 けれどTutorial User Guide, Advanced User Guideを眺めるとCORS,OAuth2,WebSockets,GraphQLと必要なことはだいたいできる。 Flaskのように肥大化しないで維持して欲しい。
FastAPIを使ってKafkaに繋いでるひともいた。(ほかにも)
問題文を解析するために ast,token,parser などのモジュールを作ったところPython-Fireがクラッシュした。 どうやら fire が渡したクラスを解析していてその際に使っているモジュールと衝突していそうだった。 そんなバカなって思ったけどログはそんな感じでモジュール名を変えたら避けられた。 小さい再現コードを作ってIssueを切りたい。その前に既知のバグなのか仕様なのかの確認をしないとだ。
mypyはDialyzerより気軽に使える。 PEPを久しぶりに読んだ。特に大事なのは下の3つ。
- PEP 484 – Type Hints
- PEP 544 – Protocols: Structural subtyping (static duck typing)
- PEP 561 – Distributing and Packaging Type Information
そもそもパッケージ化してないので、パッケージ化する際にはPEP 561対応したい。
Courseraに離散最適化のコースがあったのでとりあえず入ってみた。 いま英語と競プロと使えるライブラリ増やす月間とk8sとCoursera機械学習と子育てで死んでるのでどうなるんだろ。。 ざっと下を眺めつつ競プロと離散最適化コースは同じトレーニングとして頑張ろう。(同じ扱いにしてもやってみたいことの量は減らない)