Docker + Pytest でアルゴ式のローカル実行環境をしっかり目に作ってみた
アルゴ式はアルゴリズムの勉強にめちゃくちゃ良いですよね。
自分も最近アルゴ式を始めたのですが、サイト上のエディターでのコーディングや、テストの実行が少しストレスでした。それを改善するために、手軽にローカルで実行できる環境を作ってみたので紹介です。
作ったもの
以下 Tweet の動画のようにコマンド 1 つで、問題文とテストケースの取得、テストの実行ができる環境を Docker で作ってみました。
コードは GitHub Template として公開しています。
使い方
GitHub Template からのリポジトリ作成
こちらのリンクにアクセスして、Template からリポジトリを作成します。
あとは、作成したリポジトリをローカルに Clone します。
問題文の取得
アルゴ式 の解きたい問題にアクセスして、URL から問題の ID を取得します。
上記の問題の場合は URL https://algo-method.com/tasks/303
の末尾の 303
が ID になります。
あとは、以下コマンドを実行するだけです。
make get_question No=303
すると、questions/303
配下に main.py
と case.json
が生成されます。
"""
https://algo-method.com/tasks/303
### 問題文
カメのアルルは $N$ 個のマスを使って遊んでいます。それぞれのマスには数字が $1$ つずつ書かれており、マス $i$ には $A_i$ が書かれています。$(0 \leq i \leq N-1)$
アルルはマス $0$ からスタートし、以下のルールに従いながらマス $N-1$ を目指します。
...
"""
print("Hello Algor-Method!")
[
[
"3\n2 4 7\n",
"11\n"
],
[
"8\n3 1 4 1 5 9 2 6\n",
"18\n"
]
]
main.py
が解答の記載場所になります。そのまま実装コードを記載してください。
テストの実行
実装ができたら、テストを実行してみましょう。
以下コマンドで Pytest が実行されます。
make run_test No=330
コンソールに結果が出るので、無事通ったらあとは main.py
の実装をアルゴ式の Web エディターに貼り付けて解答すれば OK です。
実装のポイント
問題文、テストケースのスクレイピング
問題文とテストケースの取得は Beautiful Soup で問題文の Web ページをスクレイピングし、その結果から正規表現で抽出しています。
標準入出力のテスト
標準入出力のテストは main.py の内容をそのままテストするために少し工夫しています。
まず、run_test のコマンド実行時に、引数で指定された問題 ID の case.json と main.py の内容をロードしています。
そして、そのロード結果を Pytest の実行時の引数に渡しています。
渡した引数は、Pytest の addoption で fixture 経由で参照できるようにしています。
あとは、その値を元に標準入出力のテストを実行します。
main.py の内容を eval で実行し、case.json の内容で検証しています。
標準入出力のテストについては以下記事でもまとめています。
おわりに
これで環境が整ったので、あとは問題をときまくってアルゴリズム力を鍛えるのみ!頑張りますね。
また、使ってみてなにか不具合あれば、気軽に Issue や Twitter で教えてください。
Discussion