AtCoderをCUIで提出する環境を整える

# はじめに

ABC参加2回目の灰色コーダーです。VSCodeとブラウザを行き来するのが面倒くさいので、便利なパッケージを使って環境構築してみよう録です。
pythonもあまりよく知りません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2941544/6af630c2-473f-9af6-0bb4-25fc68a8f19b.png)
これはバイソン

備忘録としてQiitaを作成しました。


:::note
筆者は初学者のため、間違いや冗長な部分があると思われますのでご了承ください。
:::

# 参考にさせていただいた記事様

こちらの記事を参考に環境構築させていただきました。

https://qiita.com/Adaachill/items/3d4ddad56c5c2cc372cd


上の記事で紹介されているのに習います。

* `online-judge-tools`
* `atcoder-cli`

を使います。

## 環境構築

以下のMacOSで環境を構築していきます。

```zsh
% sw_vers
ProductName:            macOS
ProductVersion:         14.5
BuildVersion:           23F79
```
また、`brew`、`npm`及び`Node.js`はインストール済みであるとします。


http://tatamo.81.la/blog/2018/12/07/atcoder-cli-tutorial/


構築方法は上記atcoder-cliのチュートリアルを上からやっていきます。実際に環境構築したい方は、上記のチュートリアルを参考にしてください。

---

早速つまづきます。

`pip3`で`online-judge-tools`をインストールできません。`python3`は`brew`でインストール済みです。


```ruby:pip3 install online-judge-tools
% pip3 install online-judge-tools
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try brew install
    xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a Python library that isn't in Homebrew,
    use a virtual environment:
    
    python3 -m venv path/to/venv
    source path/to/venv/bin/activate
    python3 -m pip install xyz
    
    If you wish to install a Python application that isn't in Homebrew,
    it may be easiest to use 'pipx install xyz', which will manage a
    virtual environment for you. You can install pipx with
    
    brew install pipx
    
    You may restore the old behavior of pip by passing
    the '--break-system-packages' flag to pip, or by adding
    'break-system-packages = true' to your pip.conf file. The latter
    will permanently disable this error.
    
    If you disable this error, we STRONGLY recommend that you additionally
    pass the '--user' flag to pip, or set 'user = true' in your pip.conf
    file. Failure to do this can result in a broken Homebrew installation.
    
    Read more about this behavior here: <https://peps.python.org/pep-0668/>

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

[notice] A new release of pip is available: 24.0 -> 24.1
[notice] To update, run: python3.12 -m pip install --upgrade pip
```


AnacondaさんのTerminalに投げたらインストールできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2941544/57888c71-91f0-9c14-1c45-27d631d274c5.png)

なんか、Dockerとかで環境構築したらいちいちこんな回りくどいことしなくてもいいのかもしれないと思っています。

それでは、`online-judge-tools`が存在するかチェックしてみましょう。
```zsh: 
% acc check-oj
online-judge-tools is not available. 
```

できてませんでした。
`pip`は何故かうまくいきました。


```zsh:zsh
% pip install online-judge-tools
Collecting online-judge-tools
  Using cached online_judge_tools-11.5.1-py3-none-any.whl.metadata (9.1 kB)
Collecting online-judge-api-client<11,>=10.9.0 (from online-judge-tools)
  Using cached online_judge_api_client-10.10.1-py3-none-any.whl.metadata (16 kB)
...
```
もう一度`online-judge-tools`があるか確かめてみましょう。
`anaconda3/...`の中に見つかったとあります。

```zsh:zsh: acc check-oj
% acc check-oj
online-judge-tools is available. found at:
/opt/anaconda3/envs/py_env/bin/oj
```
---

## 実際に動かしてみる

実際に環境を構築できたら、次のonline-judge-toolsの日本語リファレンスを参照しながら`Submit`やテストケースを実行するコマンドを叩いてみます。

https://github.com/online-judge-tools/oj/blob/master/docs/getting-started.ja.md



まず、`acc`と`oj`でログインする必要があります。

```ruby:acc loginでログイン
% acc login
? username: 
? password: [hidden]
OK
% acc session
check login status...
OK
```
```ruby:oj login ...atcoder.jp でログイン
% oj login https://beta.atcoder.jp/
[INFO] GET: https://pypi.org/pypi/online-judge-tools/json
[INFO] 200 OK
...
```
[チュートリアル](http://tatamo.81.la/blog/2018/12/07/atcoder-cli-tutorial/)に習って、ABCの101で試してみます。
なんと！テストケースを`./tests/`配下に作成してセーブしています。

```Ruby
% acc new abc101
abc101/contest.acc.json created.
create project of AtCoder Beginner Contest 101
? select tasks A Eating Symbols Easy
[INFO] online-judge-tools 11.5.1 (+ online-judge-api-client 10.10.1)
[INFO] load cookie from: /Users/USER_NAME/Library/Application Support/online-judge-tools/cookie.jar
[NETWORK] GET: https://atcoder.jp/contests/abc101/tasks/abc101_a
[NETWORK] 200 OK
[INFO] save cookie to: /Users/USER_NAME/Library/Application Support/online-judge-tools/cookie.jar

[INFO] sample 0
[INFO] input: sample-1
+-++

[SUCCESS] saved to: tests/sample-1.in
[INFO] output: sample-1
2

[SUCCESS] saved to: tests/sample-1.out

[INFO] sample 1
[INFO] input: sample-2
-+--

[SUCCESS] saved to: tests/sample-2.in
[INFO] output: sample-2
-2

[SUCCESS] saved to: tests/sample-2.out

[INFO] sample 2
[INFO] input: sample-3
----

[SUCCESS] saved to: tests/sample-3.in
[INFO] output: sample-3
-4

[SUCCESS] saved to: tests/sample-3.out
```

また、`abc101`ディレクトリに`a`(ディレクトリ)と`contest.acc.json`が格納されていることがわかります。

```zsh:zsh
% cd abc101 
% ls
a
contest.acc.json
```

`a`はA問題です。早速`a`ディレクトリで提出するファイル`main.c (main.py, main.cppなど)`を作成してみます。

```
% cd a/
% touch main.c
```

話を簡単にするために、提出用ファイルは正しく作成できたものとします。

## テストケースを実行

作成したソースコード(`main.py, huga.cpp, hoge.c`)など実行ファイルとして`a.out`
以下のコマンドでテストケースを実行します。
```zsh:zsh
% oj t -d ./tests/
```
ソースコードが`C,C++`以外の場合は[ドキュメント](https://github.com/online-judge-tools/oj/blob/master/docs/getting-started.ja.md)を参照してください。

実行ファイルとして`a.out`を作成しましょう。
これがないと次のような`[ERROR]`が起こります。

また、`gnu-time`をインストールしてねと言われます。
```ruby
[INFO] online-judge-tools 11.5.1 (+ online-judge-api-client 10.10.1)
[INFO] 3 cases found
[WARNING] GNU time is not available: gtime
[HINT] You can install GNU time with: $ brew install gnu-time

[INFO] sample-1
[ERROR] No such file or directory: ['./a.out']
```
```ruby: gnu-timeのinstall
% brew install gnu-time
=> Downloading...
```

```ruby
% oj t -d ./tests/     
[INFO] online-judge-tools 11.5.1 (+ online-judge-api-client 10.10.1)
[INFO] 3 cases found

[INFO] sample-1
[INFO] time: 0.007112 sec
[SUCCESS] AC

[INFO] sample-2
[INFO] time: 0.006529 sec
[SUCCESS] AC

[INFO] sample-3
[INFO] time: 0.005459 sec
[SUCCESS] AC

[INFO] slowest: 0.007112 sec  (for sample-1)
[INFO] max memory: 0.976000 MB  (for sample-1)
[SUCCESS] test success: 3 cases
```

## Submit

`acc`コマンドでsubmitします。

```ruby
% acc submit main.c 
submit to: https://atcoder.jp/contests/abc101/tasks/abc101_a
```
ブラウザを見てみても
実際に提出されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2941544/70452c97-3c82-eb83-3072-03816a65e966.png)


## まとめ

`online-judge-tools`と`atcoder-cli`の環境構築し、実際にテストケースの実行とソースファイルの提出を行いました。

繰り返しになりますが、筆者は初学者のため、間違いや冗長な部分があると思われますのでご了承ください。


### おさらい

テストケース実行→提出までの過程を簡単に振り返ってみましょう。

1. `acc login`でログイン
2. `oj login https://beta.atcoder.jp/`でもログイン
3. `acc new abcXXX` でディレクトリ作成とテストケースセーブ
4. `cd abcXXX/a`などで、ABCXXXのA問題などのディレクトリに移動
5. 4.にて移動したディレクトリ内で提出用ファイル(`hoge.cpp`)作成
6. 実行ファイル`(a.out)`を作成
7. `oj t -d ./tests/`でテストケース実行
8. `acc submit hoge.cpp`で提出