くろたんく雑記帳

日常とか、わんちゃんとか、機械学習とか、競プロとか、

MENU

Pythonで競プロをはじめるにあたって(テスト環境構築編)

はじめに

競プロをAtCoderやAizu Online Judgeから始める際に筆者はPythonでやりたいので、過去問を解くときに、問題に用意されているサンプルのテストや自分自身で考えたサンプルををいい感じにやるローカル環境が作りたかったのでそれらの備忘録。

モチベーションとしては、コードテストもオンラインジャッジ上にあるが、コードテストでサンプル一つ一つやるのは少し面倒出し時間がかかるし、問題文読む以外はテキストエディタで完結したかった。


やりたいこと

  • 問題に付随しているサンプルをダウンロードして、自身のコードで読み込んで、ローカルで結果を評価したい。
    • コードテストで一つ一つやるのは少し面倒。
    • online-judge-toolsという超便利ツールを使うことで解決。いろんなオンラインジャッジに対応している。
  • ターミナル分割とVimでやってたけど、VSCodeをこれまで使ってなかったので使ってみた。

扱わないこと

  • AtCoderやAizu Online Judgeの詳細
  • pyenvの構築の仕方など
  • PATHやLinuxコマンドの説明など

対象

  • Pythonで競プロ始めたい人。
  • サンプルをローカルで手軽にACになるか確認する環境を作りたい人。
  • サンプルを試すのにテキストエディタとターミナルを行き来するのが面倒な人。

競技プロ用のサンプル実行環境構築

基本的な環境
  • macOS Sierra 10.12.6

  • pyenv環境で適宜用意(現状3.4.3なので合わせる)

    • pyenv環境についての詳細は公式に任せる。自分の好きなPythonのバージョンで実行できるようにしたいなら使う。

    • pyenv-virtualenvも使うとより便利になるが詳細は公式で。

サンプル実行環境構築に必要なこと
  • Visual Studio Codeをインストール
    • extensionからPythonをinstallする。
      • デフォルトの状態よりもデバッグ機能やハイライト等機能が充実する
    • Shift+Command+Pを押して、「コマンドパレット」にselect interpreterと入力してクリックする。
    • 現状インストールされていてVS Codeが認識しているPythonを選ぶことができるので適切なものを選ぶ。
      • pyenvで環境準備したらその環境。そうでない場合はもともとインストールされているものなど。
    • VSCode上でターミナルからターミナルを開いて、適当にAtCoder用などのディレクトリを用意する。
    • AtCoder用などのディレクトリにpyenv環境を設定する

実際のコマンド例として、

# ディレクトリ作成
mkdir -p  ~/local/project/oj/atcoder/
# 作業ディレクトリとする
cd ~/local/project/oj/atcoder/
# python3.4.3の環境をatcoder_3.4.3として作ったとして
pyenv local atcoder_3.4.3
  • online-judge-toolsをインストール。(詳細のインストール方法はドキュメント参照)
pip3 install --user online-judge-tools

python3.4.3だとpip3をつかえないが、以下でもインストールできる

pip install --user online-judge-tools

インストールが無事におわって

oj

としてもojなんてないよとか言われたら、ojが謎の場所にインストールされていることがある(Pythonのバージョンをあげて、pip3でインストールすればうまくいくのかもしれない)

which oj

とすればojの場所がわかるので

~/.local/bin/oj

bashrcなりzshrcなりに

export PATH=$HOME/.local/bin:$PATH

と書いて、ターミナルを一度消して、もう一度開き直す。


online-judge-toolsの使い方

上記のように環境を順調に環境を構築してくれば、作業ディレクトリでojと打てば以下のようになるはず。

% oj
usage: oj [-h] [-v] [-c COOKIE] [--version]
          {download,d,dl,login,l,submit,s,test,t,generate-output,g/o,generate-input,g/i,test-reactive,t/r}
          ...

ドキュメントによると、ログインや提出までできるが、ここではサンプルのダウンロードとサンプルを読み込んで自身のコードをテストする方法を簡易にまとめる。

サンプルのダウンロード
# oj d [オンラインジャッジの問題があるurl] -d [保存しておきたいディレクトリのPATH]
# 保存しておきたいディレクトリのPATHが存在しなくても作られる
oj d https://atcoder.jp/contests/abc135/tasks/abc135_b -d test/abc135_b
oj d https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/2/DSL_2_A -d test/DSL/DSL_2_A
サンプルを使ってコードのテストをする
# oj t -c "python3 自分が書いた問題の解答pythonコードのPATH" -d [該当する問題のディレクトリのPATH(ダウンロードのしたPATH)]
oj t -c "python3 Problems/abc135_b.py" -d test/abc135_b
oj t -c  "python3 Problems/DSL/DSL_2_A.py" -d test/DSL/DSL_2_A
テスト結果の例

例えば、正解はintで返さないといけないのに、23.0のように小数点を含む形で出力するとWAになる。

f:id:black_tank_top:20200614184837p:plain
不正解を含む例
そこを直して実行すると、
f:id:black_tank_top:20200614185840p:plain
正解のみになった例

おわりに

VSCodeで行うと、ターミナルを同じ画面で開きながらできるので、以下がスムーズに行えた。

  • コードを書きつつ、ojコマンドを使ってサンプルのダウンロード・テストが行えた。
    • コードの途中にprint()をつかっておけばテスト時にその結果も見えるのでデバッグしながらコードを書くことができた。
  • 右上の実行ボタンを押すと、自分自身でサンプルを考えて標準入力として入力するテストができた。
    • サンプルにはない、条件の範囲だが厳しい内容(例外っぽいもの)などの返り値を確認できた。

ちょっと手間な部分は

  • サンプルのディレクトリ管理は自分で適切にやらないといけない。
  • 問題のURLのコピペは必要なので、完璧にテキストエディタで完結っていうわけではない。
    • ここら辺を解決したAtCoderむけのatcoder-cliというツールもあるらしいので、そのうち試したい

参考記事

Visual Studio Code - Code Editing. Redefined

Introduction to online-judge-tools (Japanese) — online-judge-tools documentation

コマンドラインツールatcoder-cliを公開しました | わたしろぐ