-
Notifications
You must be signed in to change notification settings - Fork 22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add algo-method support (get-problems only) #152
base: master
Are you sure you want to change the base?
add algo-method support (get-problems only) #152
Conversation
1fe2c31
to
d3e3c0e
Compare
diff --git a/articles/92b3a92536fb17.md b/articles/92b3a92536fb17.md new file mode 100644 index 0000000..3c798b1 --- /dev/null +++ b/articles/92b3a92536fb17.md @@ -0,0 +1,132 @@ +--- +title: "Docker + Pytest でアルゴ式のローカル実行環境をしっかり目に作ってみた" +emoji: "🐢" +type: "tech" # tech: 技術記事 / idea: アイデア +topics: ["python", "アルゴ式", "Docker"] +published: false +--- + +[アルゴ式](https://algo-method.com/after_login)はアルゴリズムの勉強にめちゃくちゃ良いですよね。 + +自分も最近アルゴ式を始めたのですが、サイト上のエディターでのコーディングや、テストの実行が少しストレスでした。それを改善するために、手軽にローカルで実行できる環境を作ってみたので紹介です。 + +# 作ったもの + +以下 Tweet の動画のようにコマンド 1 つで、問題文とテストケースの取得、テストの実行ができる環境を Docker で作ってみました。 + +https://twitter.com/KawamataRyo/status/1536007164334055424 + +コードは GitHub Template として公開しています。 + +https://github.com/kawamataryo/algo-method-local-template + +# 使い方 + +## GitHub Template からのリポジトリ作成 + +[こちらのリンク](https://github.com/kawamataryo/algo-method-local-template/generate)にアクセスして、Template からリポジトリを作成します。 + +![](https://i.gyazo.com/0fc42d6a6bf5bb120bffdfe22c25ff0a.png) + +あとは、作成したリポジトリをローカルに Clone します。 + +## 問題文の取得 + +[アルゴ式](https://algo-method.com/after_login) の解きたい問題にアクセスして、URL から問題の ID を取得します。 + +https://algo-method.com/tasks/303 + +上記の問題の場合は URL `https://algo-method.com/tasks/303` の末尾の `303` が ID になります。 + +あとは、以下コマンドを実行するだけです。 + +```bash +make get_question No=303 +``` + +すると、`questions/303` 配下に `main.py` と `case.json` が生成されます。 + +```py: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!") +``` + +```json: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](https://docs.pytest.org/en/7.1.x) が実行されます。 + +```bash +make run_test No=330 +``` + +![](https://i.gyazo.com/e6489ed012126c9d96d08e1621844b57.png) + +コンソールに結果が出るので、無事通ったらあとは `main.py` の実装をアルゴ式の Web エディターに貼り付けて解答すれば OK です。 + +:::message +解答部分も自動化できたら良いなーと思っていますが、まだできていません 🙈 +::: + +# 実装のポイント + +## 問題文、テストケースのスクレイピング + +問題文とテストケースの取得は [Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) で問題文の Web ページをスクレイピングし、その結果から正規表現で抽出しています。 + +https://github.com/kawamataryo/algo-method-local-template/blob/main/scripts/get_question/get_question.py#L1-L66 + +:::message +変更に弱いので、アルゴ式が API を公開してくれたらそちらに移したいです.. +また、こちらの実装 [@TakeshiP](https://twitter.com/takeaship) さんのこちらの PR を参考にさせて頂きました。感謝🙏 +online-judge-tools/api-client#152 +::: + +## 標準入出力のテスト + +標準入出力のテストは 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 + +# おわりに + +これで環境が整ったので、あとは問題をときまくってアルゴリズム力を鍛えるのみ!頑張りますね。 +また、使ってみてなにか不具合あれば、気軽に [Issue](https://github.com/kawamataryo/algo-method-local-template/issues) や [Twitter](https://twitter.com/KawamataRyo) で教えてください。
@koba-e964 |
今生き返りました、がちょっとレビューに時間がかかりそうです |
生きているなら幸いです。ではゆっくりやろうと思います。 |
動作確認のためdraft化 |
58eb488
to
8511f29
Compare
@koba-e964 |
もうあります。 |
ありがとうございます。ではそちらにお任せします。 |
@takeaship CI 更新されました |
8511f29
to
a7b63cc
Compare
@kzrnm ありがとうございます🙏 rebaseしました。 |
53113e2
to
d28e15d
Compare
d28e15d
to
267ef2e
Compare
@koba-e964 AtCoder アカウントのパスワードが変わってるなどでテストがコケているみたいです |
#151 について、私が欲しかった機能なので、get-problemsだけサポートしたものを作りました。
よろしくおねがいします。