Skip to content

Conversation

@takeaship
Copy link

#151 について、私が欲しかった機能なので、get-problemsだけサポートしたものを作りました。
よろしくおねがいします。

@takeaship takeaship force-pushed the add-atlgo-method-service branch from 1fe2c31 to d3e3c0e Compare April 17, 2022 13:23
@takeaship takeaship changed the title add algo-method support (get-problem only) add algo-method support (get-problems only) Apr 17, 2022
kawamataryo added a commit to kawamataryo/zenn-articles that referenced this pull request Jun 14, 2022
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 koba-e964 self-requested a review August 10, 2022 08:07
@takeaship
Copy link
Author

@koba-e964
こちらのリポジトリ、現在も生きていますでしょうか?
生きているなら、再度現在の状態で動作確認・必要があれば修正いたしますのでよろしくお願いします。

@koba-e964
Copy link
Member

今生き返りました、がちょっとレビューに時間がかかりそうです

@takeaship
Copy link
Author

生きているなら幸いです。ではゆっくりやろうと思います。

@takeaship takeaship marked this pull request as draft February 10, 2024 21:55
@takeaship
Copy link
Author

takeaship commented Feb 10, 2024

動作確認のためdraft化
upstreamにrebase

@takeaship takeaship force-pushed the add-atlgo-method-service branch 2 times, most recently from 58eb488 to 8511f29 Compare February 11, 2024 03:13
@takeaship
Copy link
Author

@koba-e964
コードの変更なしで、現在もテストが通り、ojに組み込んで正常に取得できることが確認できましたので、レビューお願いします。
ただcodeforcesのテストが落ちているようです。(サイトの変更起因?)
なのでこちらは別でIssue立てておきます。

@takeaship takeaship marked this pull request as ready for review February 11, 2024 03:18
@kzrnm
Copy link
Contributor

kzrnm commented Feb 11, 2024

ただcodeforcesのテストが落ちているようです。(サイトの変更起因?) なのでこちらは別でIssue立てておきます。

もうあります。

#168

@takeaship
Copy link
Author

ありがとうございます。ではそちらにお任せします。

@kzrnm
Copy link
Contributor

kzrnm commented Feb 17, 2024

@takeaship CI 更新されました

@takeaship takeaship force-pushed the add-atlgo-method-service branch from 8511f29 to a7b63cc Compare February 17, 2024 22:20
@takeaship
Copy link
Author

@kzrnm ありがとうございます🙏

rebaseしました。

@takeaship takeaship force-pushed the add-atlgo-method-service branch 2 times, most recently from 53113e2 to d28e15d Compare February 17, 2024 23:13
@takeaship takeaship force-pushed the add-atlgo-method-service branch from d28e15d to 267ef2e Compare February 18, 2024 02:05
@kzrnm
Copy link
Contributor

kzrnm commented Mar 10, 2024

@koba-e964 AtCoder アカウントのパスワードが変わってるなどでテストがコケているみたいです

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

3 participants