🐢

Docker + Pytest でアルゴ式のローカル実行環境をしっかり目に作ってみた

2022/06/14に公開

アルゴ式はアルゴリズムの勉強にめちゃくちゃ良いですよね。

自分も最近アルゴ式を始めたのですが、サイト上のエディターでのコーディングや、テストの実行が少しストレスでした。それを改善するために、手軽にローカルで実行できる環境を作ってみたので紹介です。

作ったもの

以下 Tweet の動画のようにコマンド 1 つで、問題文とテストケースの取得、テストの実行ができる環境を Docker で作ってみました。

https://twitter.com/KawamataRyo/status/1536007164334055424

コードは GitHub Template として公開しています。

https://github.com/kawamataryo/algo-method-local-template

使い方

GitHub Template からのリポジトリ作成

こちらのリンクにアクセスして、Template からリポジトリを作成します。

あとは、作成したリポジトリをローカルに Clone します。

問題文の取得

アルゴ式 の解きたい問題にアクセスして、URL から問題の ID を取得します。

https://algo-method.com/tasks/303

上記の問題の場合は URL https://algo-method.com/tasks/303 の末尾の 303 が ID になります。

あとは、以下コマンドを実行するだけです。

make get_question No=303

すると、questions/303 配下に main.pycase.json が生成されます。

questions/303/main.py
"""
https://algo-method.com/tasks/303

### 問題文
カメのアルルは $N$ 個のマスを使って遊んでいます。それぞれのマスには数字が $1$ つずつ書かれており、マス $i$ には $A_i$ が書かれています。$(0 \leq i \leq N-1)$
アルルはマス $0$ からスタートし、以下のルールに従いながらマス $N-1$ を目指します。
...
"""

print("Hello Algor-Method!")
questions/303/case.json
[
  [
    "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 ページをスクレイピングし、その結果から正規表現で抽出しています。

https://github.com/kawamataryo/algo-method-local-template/blob/main/scripts/get_question/get_question.py#L1-L66

標準入出力のテスト

標準入出力のテストは main.py の内容をそのままテストするために少し工夫しています。
まず、run_test のコマンド実行時に、引数で指定された問題 ID の case.json と main.py の内容をロードしています。
そして、そのロード結果を Pytest の実行時の引数に渡しています。

https://github.com/kawamataryo/algo-method-local-template/blob/main/scripts/run_test/run_test.py#L1-L22

渡した引数は、Pytest の addoption で fixture 経由で参照できるようにしています。

https://github.com/kawamataryo/algo-method-local-template/blob/main/scripts/run_test/conftest.py#L1-L17

あとは、その値を元に標準入出力のテストを実行します。
main.py の内容を eval で実行し、case.json の内容で検証しています。

https://github.com/kawamataryo/algo-method-local-template/blob/main/scripts/run_test/test_main.py#L1-L11

標準入出力のテストについては以下記事でもまとめています。

https://zenn.dev/ryo_kawamata/articles/41873296559da1

おわりに

これで環境が整ったので、あとは問題をときまくってアルゴリズム力を鍛えるのみ!頑張りますね。
また、使ってみてなにか不具合あれば、気軽に IssueTwitter で教えてください。

Discussion