Shiopon Labo

しおぽん(@shiopon01)の個人ブログです

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

atcoder.jp

作成されたディレクトリを見ると、問題ごとにテストケースの入力/出力がダウンロードされていることが確認できます。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

提出するコードはこの ab ディレクトリの直下に作成します。ここでは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 に問題が解けそうなコードを書いて、もう一度テストを実行してみます。例えばこんなやつを。

gist.github.com

テストの実行↓

% 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の提出ページが勝手にブラウザで立ち上がります。

f:id:shiopon01:20200116171742p:plain

その他

atcoder-cliにはこの他にもテンプレート機能やタスク機能などあるので、用途に合わせて拡張してもらえれば。設定ファイルの場所は acc config-dir で確認できます。

www.npmjs.com