AtCoderことはじめ(ローカルの動作環境構築から問題を提出するまで)
この記事の目標は、ローカルで問題のテストをして、簡単にAtCoderに提出できる環境を構築することです。(言語は問いません、おそらく…。)
ローカルの動作環境を構築する
次のコマンドラインツールをインストールし、設定します。
npm install -g atcoder-cli pip3 install --user online-judge-tools
atcoder-cli(以下acc)とonline-judge-tools(以下oj)を連携しておきます。連携することで、URLを指定せずにコードの提出などが可能になるようです。
acc check-oj
両方のツールでAtCoderにログインしておきます。
$ acc login ? username: shiopon01 ? password: [hidden] OK
$ oj login https://atcoder.jp/ [x] service recognized: AtCoderService.from_url('https://atcoder.jp/'): https://beta.atcoder.jp/ ... Username: shiopon01 Password: [x] POST: https://atcoder.jp/login [x] redirected: https://atcoder.jp/home [x] 200 OK ... [x] save cookie to: /home/user/.local/share/online-judge-tools/cookie.jar
accが作成するサンプルケースのディレクトリ名を test
に変更します。(デフォルトは tests
となっていて、このままではojのテストが実行できないので test
に変更しています。)
$ acc config default-test-dirname-format test
設定はこれで終わりです。
コンテスト用のディレクトリを作成する
ディレクトリの作成にはAtCoderのコンテストの識別子(abc081
など)が使用されます。今回は、ABC 081用のディレクトリを作成してみます。(次の実行結果のように、newした際にダウンロードする問題の選択が必要ですが、acc config default-task-choice all
を設定しておくことで全問題を勝手にダウンロードすることもできます。)
$ acc new abc081 abc081/contest.acc.json created. create project of AtCoder Beginner Contest 081 ? select tasks ❯◉ A Placing Marbles ◯ B Shift only ◯ C Not so Diverse ◯ D Non-decreasing
作成されたディレクトリを見ると、問題ごとにテストケースの入力/出力がダウンロードされていることが確認できます。contest.acc.json
にはコンテストのURLなどが保存されています。
$ tree abc081 abc081 ├── contest.acc.json ├── a │ └── test │ ├── sample-1.in │ ├── sample-1.out │ ├── sample-2.in │ └── sample-2.out ├── b │ └── test │ ├── sample-1.in │ ... │ └── sample-3.out ├── c │ └── test │ ├── sample-1.in │ ... │ └── sample-3.out └── d └── test ├── sample-1.in ... └── sample-3.out 8 directories, 23 files
提出するコードはこの a
や b
ディレクトリの直下に作成します。ここではbの直下にmain.goを作成しています。
$ cd abc081/b $ touch main.go
練習問題を解いてテストし、提出する
ABC 081 Bを例に、先に作成したファイルでテストを実行してみます。テストにはojを使い、 -c
オプションで実行するコマンドを指定しています。(オプションが無いと ./a.out
に対してテストが実行されるようです。)
$ oj t -c "go run main.go" [*] 3 cases found [*] sample-1 package main: main.go:1:1: expected 'package', found 'EOF' [x] time: 0.004811 sec [-] RE: return code 1 [-] WA output: expected: 2 ... [x] slowest: 0.005508 sec (for sample-2) [x] max memory: 9.936000 MB (for sample-2) [-] test failed: 0 AC / 3 cases
空だった main.go
に問題が解けそうなコードを書いて、もう一度テストを実行してみます。例えばこんなやつを。
テストの実行↓
% oj t -c "go run main.go" [*] 3 cases found [*] sample-1 [x] time: 0.274811 sec [!] WA if no rstrip [+] AC ... [x] slowest: 0.333075 sec (for sample-2) [x] max memory: 46.388000 MB (for sample-3) [+] test success: 3 cases
ローカルでのテストが通ったので、問題のディレクトリでそのまま acc submit
を打ってAtCoderに提出します。提出先の問題は勝手に判断してくれるようです。
$ acc submit main.go submit to: https://atcoder.jp/contests/abc081/tasks/abc081_b [x] problem recognized: AtCoderProblem.from_url('https://atcoder.jp/contests/abc081/tasks/abc081_b'): https://atcoder.jp/contests/abc081/tasks/abc081_b [*] code (362 byte): ... [x] POST: https://atcoder.jp/contests/abc081/submit [x] redirected: https://atcoder.jp/contests/abc081/submissions/me [x] 200 OK [+] success: result: https://atcoder.jp/contests/abc081/submissions/9533340 ...
success
と出たら提出成功で、AtCoderの提出ページが勝手にブラウザで立ち上がります。
その他
atcoder-cliにはこの他にもテンプレート機能やタスク機能などあるので、用途に合わせて拡張してもらえれば。設定ファイルの場所は acc config-dir
で確認できます。