atcoder-kit 0.1.5

A command-line tool for AtCoder like acc and oj.
Documentation
# AtCoder-Kit の使い方

AtCoder-Kit を使用するための基本的な手順を説明します。

## コマンド一覧


| コマンド             | 説明                              |
|------------------|---------------------------------|
| `ackit login`    | [ログイン]#1-ログイン                 |
| `ackit template` | [テンプレートの設定]#2-テンプレートの設定       |
| `ackit download` | [コンテストのダウンロード]#3-コンテストのダウンロード |
| `ackit test`     | [サンプルテスト]#4-サンプルテスト           |
| `ackit submit`   | [提出]#5-提出                     |
| `ackit logout`   | [ログアウト]#6-ログアウト               |

## 1. ログイン

ほとんどの機能がログインを必要とします(例: 進行中のコンテストのダウンロード、コードの提出など)。
最初に、以下のコマンドで AtCoder-Kit にログインしてください。
```shell
ackit login
```
このコマンドを実行すると、REVEL_SESSION の入力を求められます。

REVEL_SESSION の取得方法については、[こちら](./Ex01-REVEL_SESSIONの取得.md) を参照してください。

## 2. テンプレートの設定

AtCoder-Kit では、サンプルテストや提出の際にテンプレートを利用しています。
テンプレートの作成は、`ackit template new` コマンドで行えます。
```shell
ackit template new <テンプレート名> <提出ファイル> <実行コマンド> [--compile-command <コンパイルコマンド>] [--pre-submit <提出前コマンド>] [--default]
```
- `<テンプレート名>`: テンプレートの名前を指定します。
- `<提出ファイル>`: コード提出時に使用するファイル名を指定します。
- `<実行コマンド>`: サンプルテスト時に使用するコマンドを指定します。
- `--compile-command <コンパイルコマンド>`: サンプルテスト前にコードをコンパイルする場合、そのコマンドを指定します。
- `--pre-submit <提出前コマンド>`: 提出前にソースコードを生成・変換するコマンドがある場合、そのコマンドを指定します。
- `--default`: このテンプレートをデフォルトのテンプレートとして設定します。

各コマンドはシェルスクリプトとしてではなく、実行ファイル名と引数へ分割して直接起動されます。パイプ、リダイレクト、環境変数代入、`exit`などのシェル組み込みコマンドは利用できません。必要な処理はスクリプトファイルに記述し、そのスクリプトを実行コマンドとして指定してください。

テンプレート名には単一のディレクトリ名を、提出ファイルにはテンプレートディレクトリ内の相対パスを指定してください。絶対パスや`..`を含むパスは安全のため拒否されます。

### 例 (C++・デフォルト設定):

```shell
ackit template new my-cpp-template main.cpp ./a.out --compile-command "g++ main.cpp -o a.out" --default
```
C++ はコンパイル言語であるため、`--compile-command` オプションでコンパイルコマンドを指定します。

### 例 (Python・デフォルト設定):

```shell
ackit template new my-python-template main.py "python main.py" --default
```
Python はインタプリタ言語であるため、`--compile-command` オプションは不要です。

### 例 (Rust・デフォルト設定)

```shell
ackit template new my-rust-template src/main.rs "cargo run" --default
# または:

ackit template new my-rust-template src/main.rs target/release/my-rust-template --compile-command "cargo build --release" --default
```
Rust はコンパイル言語ですが、`cargo run` コマンドを実行コマンドとして指定することで、コンパイルと実行を同時に行うことができます。

このコマンドを実行すると、テンプレートが作成され、テンプレートが保存されているディレクトリが表示されます。

そこにアクセスし、自由にテンプレートを作成できます。

### コピーしないファイルの設定


新しく作成したテンプレートには、空の `.ackitignore` が含まれます。このファイルにパターンを記述すると、コンテストのダウンロード時に一致したファイルやディレクトリを問題ディレクトリへコピーしません。

```gitignore
# Rustのビルド成果物

target/

# 一時ファイル

*.tmp
*.log

# 除外したテキストファイルのうち、README.txtだけはコピーする

*.txt
!README.txt
```

パターンはテンプレートディレクトリを基準に、gitignoreと同じ形式で評価されます。空行、`#`から始まるコメント、`*`、`?`、`**`、ディレクトリ末尾の`/`、テンプレートルートを表す先頭の`/`、除外を取り消す先頭の`!`を使用できます。大文字・小文字は区別されます。

ディレクトリ自体を除外すると、その配下は走査されません。配下の一部を`!`で再びコピー対象にする場合は、たとえば`generated/*`で中身を除外してから`!generated/keep.txt`を指定してください。

`.ackitignore`自体はコピーされません。`template.json`はサンプルテストと提出に必要なため、パターンに一致しても常にコピーされます。既存テンプレートに`.ackitignore`がない場合は、従来どおりテンプレート内のすべてのファイルがコピーされます。

## 3. コンテストのダウンロード

コンテストをダウンロードするには、以下のコマンドを実行します。
```shell
ackit download <コンテストID> [<テンプレート名>] [--no-template]
```
- `<コンテストID>`: ダウンロードしたいコンテストの ID を指定します(例: `abc123`, `arc123`, `awc1234`)。
- `<テンプレート名>`: サンプルテストや提出の際に使用するテンプレートの名前を指定します。省略した場合、デフォルトのテンプレートが使用されます。
- `--no-template`: ダウンロード時にテンプレートを適用しない場合に指定します。

現在、ABC・ARC・AGC などの主要なコンテストに加え、一部の常設コンテスト (例: `practice`) や、ベータ版である AtCoder Weekday Contest(例: `awc1234`)に対応しています。

このコマンドを実行すると、カレントディレクトリに以下の形式でファイルが作成されます。
```text
<コンテストID>/
├── a/
│   ├── (テンプレートファイル)
│   └── template.json
├── b/
│   ├── (テンプレートファイル)
│   └── template.json
├── ・・・(問題数に応じて作成されます)
├── contest.json
```
以降、a や b 等のディレクトリを「問題ディレクトリ」と呼びます。

## 4. サンプルテスト

サンプルケースを利用してテストを行うには、以下のコマンドを実行します。

なお、問題ディレクトリで実行し、かつ `template.json` が存在する必要があります。
```shell
ackit test
```

サンプル実行は問題の実行時間制限に 2 秒を加えた時間で打ち切られます。コンパイルと提出前コマンドの制限時間は 120 秒です。各コマンドの標準出力と標準エラー出力は、過大なメモリ消費を防ぐためそれぞれ 16 MiB まで保存されます。

## 5. 提出

コードを提出するには、以下のコマンドを実行します。
```shell
ackit submit [--no-test]
```
- `--no-test`: 提出前のサンプルテストをスキップする場合に指定します。

(`--no-test` を指定しない場合)提出前にサンプルテストが行われ、すべてのサンプルケースを通過した場合に提出が行われます。
提出前コマンドが設定されている場合は、先にそのコマンドを実行し、生成・変換後の状態でサンプルテストを行います。`--no-test` を指定しても提出前コマンドは実行されます。

> [!IMPORTANT]
> AtCoder と Cloudflare Turnstile の仕様により、CAPTCHA 認証が要求されるコンテストでは提出できません。
> 
> 現在は、主に進行中のコンテストでのみ提出に対応しています。

提出が成功した場合、提出 URL が表示されます。

## 6. ログアウト

AtCoder-Kit からログアウトするには、以下のコマンドを実行します。
```shell
ackit logout
```
このコマンドを実行すると、AtCoder-Kit に保存されているログインセッションが削除され、ログアウト状態になります。