AtCoder のディレクトリ作成・サンプルケースのテスト・提出を自動化する。atcoder-cli と online-judge-tools

AtCoder を快適に解くための2つの CLI ツールを紹介します。
このエントリーで利用している環境は Windows 10, Python 3 です。もちろん他の OS 、言語にも対応しています。

# できること
## コンテスト用ディレクトリを作成する
[![Image from Gyazo](https://i.gyazo.com/3674fc7b35182295400b012f986f7cf0.gif)](https://gyazo.com/3674fc7b35182295400b012f986f7cf0)

* `acc new {コンテストID}`
* コンテスト用ディレクトリが作成される。
    * コンテスト用ディレクトリ配下には問題ごとにディレクトリが切られる。問題ディレクトリ配下には、解答を書く main.py ファイルと、サンプルケースの入力・出力を記述したテスト用ファイルが作成される。
* ディレクトリ構成は以下の通り。

> Contest ID/
　├ a/
　│　└ main.py
　│　└ test/
　│　　　└ sample-1.in
　│　　　└ sample-1.out
　│　　　└ sample-2.in
　│　　　└ ...
　├ b/
　│　└ main.py
　│　└ test/
　│　　　└ ...
　└ ...


## サンプルケースのテストを実行する
[![Image from Gyazo](https://i.gyazo.com/30702a74ab74122110f721f22f51c990.gif)](https://gyazo.com/30702a74ab74122110f721f22f51c990)

* テストしたい問題のディレクトリで `oj t -c "python main.py"`
* サンプルケースのテストを実行し、結果を返す。全ケースでACと出れば成功。

## 提出する
[![Image from Gyazo](https://i.gyazo.com/cc3876324567387243e60a58ffa85303.gif)](https://gyazo.com/cc3876324567387243e60a58ffa85303)


* 提出したい問題のディレクトリで `acc s`
* 完成したコードを AtCoder に提出する。ブラウザの新しいタブで提出画面が開き、結果が表示される。

# 導入方法
## 前提条件
* node.js がインストール済である
* Python >3.5がインストール済である

atcoder-cli は node.js で、 online-judge-tools は Python で動くため、これらのインストールが必要です。
インストールがまだの方は、 Chocolatey でのインストールをおすすめします (Windows の場合、Mac なら Homebrew )。
今後のアップデートが非常に楽になります。

> [Chocolateyを使った環境構築の時のメモ \- Qiita](https://qiita.com/konta220/items/95b40b4647a737cb51aa)

Chocolatey をインストールの上、下記のコマンドを実行すればOKです。

```install.ps1
cinst nodejs.install -y
cinst python -y
```

## atcoder-cli と online-judge-tools の導入
以下のチュートリアルを参考に、


* インストール
* AtCoder へのログイン

を完了します。

> [atcoder\-cli チュートリアル \| わたしろぐ](http://tatamo.81.la/blog/2018/12/07/atcoder-cli-tutorial/)

atcoder-cli と online-judge-tools の両方で AtCoder にログインする必要があります。

## 設定
atcoder-cli を使いやすいように設定を変更しましょう。
なお、 online-judge-tools には設定がありません。
> [Introduction to online\-judge\-tools \(Japanese\) # 存在しない機能 — online\-judge\-tools documentation](https://online-judge-tools.readthedocs.io/en/master/introduction.ja.html#id7)

### テンプレート設定
テンプレートを設定しておくと、以下が可能になります。

* `acc s` での解答の提出
    * テンプレートがない場合はファイル名を指定する必要があります。
* `acc new {contestId}` 実行時に作成される解答用ファイルの雛形の設定
    * コンソール入力の読み取り、Shebang (シバン)など、毎回使うコードを雛形として利用できます。

テンプレートファイルの設定はチュートリアルの「テンプレート設定」に従って行います。

> [atcoder\-cli チュートリアル \| わたしろぐ](http://tatamo.81.la/blog/2018/12/07/atcoder-cli-tutorial/)

私は以下のように設定しています。

* atcoder-cli の Config ディレクトリ

>　├ Config/
　│　└ python/
　│　　　└ main.py
　│　　　└ template.json
　│　└ config.json
　│　└ session.json



``` template.json
{
    "task": {
        "program": [
            "main.py"
        ],
        "submit": "main.py"
    }
}
```

``` main.py
#!/usr/bin/env python3

def main():
    N = map(int, open(0).read().split())


main()


```

`#!/usr/bin/env python3` は Shebang です。

AtCoder では Python の実行環境として Python2 と Python3 が選択できます。Shebang を利用して明示的に Python3 を利用することを指定しています。
これを忘れると、提出時に実行環境が1つに絞れないというエラーが出ます。

`open(0).read().split()` はコンソール入力の読み取りです。

### Config の変更
`acc config` で現在のグローバル設定を確認できます。デフォルトでは以下の通りです。

``` config.sh
$ acc config
oj-path: C:/Python38/Scripts/oj.exe
default-contest-dirname-format: {ContestID}
default-task-dirname-format: {tasklabel}
default-test-dirname-format: tests
default-task-choice: inquire
default-template: 
```

これを変更していきます。

``` .sh
$ acc config default-test-dirname-format test
```
テストディレクトリ名を、online-judge-tools に合わせて変更します。これによって online-judge-tools がテストディレクトリを認識し、サンプルケースの自動テストが可能になります。

``` .sh
$ acc config default-task-choice all
```

`acc new {Contest Id}` を実行時、ディレクトリを作成する問題の選択方式を設定します。
デフォルトの `inquire` では、毎回問題を手動で選択することになります。
私は一度に全てのディレクトリを作成したいので、 `all` にしています。

``` .shell
$ acc config default-template python
```
デフォルトで利用したいテンプレートを指定します。
私は python にしていますが、「テンプレート設定」で作成した、最もよく使うテンプレートを各自指定しましょう。

# おわりに
以上で atcoder-cli と online-judge-tools の導入が完了し、冒頭の動画のように使用することが可能になります。
快適に AtCoder を楽しみましょう！