AtCorder環境をatcorder-cli + online-judge-tools + Dashで構築する


何をしたのか

AtCorderのスコアを伸ばすために、サンプルケースのテストを自動化しようとしました。
そうした所、どうやら atcorder-cli というツールで、提出まで自動化してくれるようだったので導入してみました。
テストは online-judge-tools というツールがAtCorderの問題文からスクレイピング+自動実行してくれるようです。
ただこのテスト実行において、Pythonだと oj test -c "python3 main.py" という比較的長めのコマンドを入力する必要があったので、面倒になったのでこの機会にスニペットツールの Dash を入れて簡単にしました。

今の所自分の環境ではこれが一番しっくり来るなと思える環境を整える所まで行ったので、覚書を残します。

atcorder-cli

こちらのブログで紹介されていたツールです。

AtCorderのコンテスト名(ex.ABC142 など)を指定すると、対象コンテストのディレクトリ作成、テストケース取得をやってくれます。また、予め登録しておいたテンプレートファイルを作成することもできます。

online-judge-toolsを普通に使うよりも入力するコマンド量が少ないのが魅力的。
基本的な設定はチュートリアルを読んでいただくとして、以下ではatcorder-cliを利用するなら入れた方が良いであろう設定について書いていきます。

コンテスト問題選択設定

デフォルト設定では、コンテストを選択した後 対象コンテストのどの問題に挑戦するか? という選択肢が出てきます。
私の場合はC問題までしか基本解けませんけども、それでも毎回選ぶのは面倒です。問題のロードに1分掛かるわけじゃなし、全問指定で問題ないでしょう。

acc config default-task-choice all

テンプレート設定

template.jsonファイルに雛形設定を書きます。自分の雛形は以下のようになっています。

{
  "task":{
    "program": ["main.py"],
    "submit": "main.py",
    "testdir": "test"
  }
}

同じ階層に main.py という雛形ファイルを置くことで、問題ごとに複製されるようになっています。また、提出ファイル名も同じにしているので、提出時は acc s だけで提出できます!

testdir は要変更です。テストのサンプルケース格納ディレクトリ名ですが、デフォルトの名前 testsではonline-judge-toolsでテストを実行できなかったため、testdirの設定が必要でした。何か別の手段でも回避できたのかもしれないのですが、一旦はこれで。

また、折角テンプレートを作成しても、acc newコマンドの度に--templateオプションをつけてテンプレートを指定しなければいけないのは手間です。デフォルトにしてしまいましょう。

acc config default-template py

以上により、 acc new abc142 とするだけで作業環境ができるようになりました!

提出設定

コードを書いた後提出する際、もうIDEに書いたソースコードをコピーしてブラウザに貼り付ける必要はありません。これからは acc s と入力するだけで提出できるようにしましょう。

提出はonline-judge-toolsの機能をatcorder-cli経由で呼び出しますが、online-judge-tools単体では oj s https://codeforces.com/contest/1200/problem/F のように、提出先まで毎回指定する必要があります。
atcorder-cli経由で実行することで、 acc s だけで提出できます。これは前項で作った作業ディレクトリの中で実行する事により、提出先がAtCorderで、コンテスト名と問題まで特定できるからです。

提出言語に関してPythonを指定したい場合、テンプレートの main.py 先頭に #!/usr/bin/env python3 と記述しておきます。

提出について問題点

上記設定をした上で acc s を実行すると2つ問題が起き、現時点では解決していません。

問題1 提出時必ずオペミス警告が出る

[!] the problem "https://atcoder.jp/contests/ABC125/tasks/abc125_a" is specified to submit, but no samples were downloaded in this directory. this may be mis-operation という警告が出て、提出時に確認されます。確認はyes/noではなく、Are you sure? Please type "abca" といった形です。
自分はこれが出る事が分かっているので、 acc s を入力した後即座に abca というように確認用のコマンドを打ってEnterを押して回避しています。

問題2 提出後コンソールにエラーメッセージが表示される

提出完了後、 AttributeError: 'MacOSXOSAScript' object has no attribute 'name' が出ます。
提出はできているので無視しました。

Dash

元々競技プログラミングをやる人でなくても、スニペットツールを使われている人は多いとは思いますが、私にとっては今回は契機になりました。

冒頭でも述べましたが、online-judge-toolsではテストでPythonを実行する場合は oj t -c "python3 main.py" と書く必要があります。これをDashで簡単にしました。

Dashのダウンロードはこちらから。

使ってみるとやはり便利そうですので、色々登録してみようと思います。

まとめ

競技プログラミング熟練者勢にとっては当たり前のものだと思いますが、最近本格的にやり始めた身には新鮮なツール群でした。
こういうツールを整えておくのは普段業務でも大事ですよね。良いIDEとか。
赤色コーダーの皆さんの環境とかちょっと見てみたくなりますね。