Python 3.5 以降で動作する AtCoder からサンプル入力をダウンロードしたりする際に便利なツールです。
このツールには次のような機能があります。
対応言語 | Contributor 1 | Contributor 2 |
---|---|---|
C++ | @kyuridenamida (generator, template) | @asi1024 (template) |
Java | @kyuridenamida (generator, template) | |
Rust | @fukatani (generator, template) | @koba-e964 (template, CR) |
Python3 | @kmyk (generator, template) | @penpenpng (generator) |
D | @penpenpng (generator, template) | |
Nim | @chaemon (generator, template) | |
C# | @chaemon (generator, template) |
<img src=”https://user-images.githubusercontent.com/233559/52807100-f6e2d300-30cd-11e9-8906-82b9f9b2dff7.gif” width=70%>
pip3 install atcoder-tools
ただのpip
だとPython 2系を使ってインストールされる可能性があるためうまくいかないかもしれません。
Tampermonkey(各種ブラウザで動作)でインストールすることが可能なUserscriptです。公開されている過去問を対象として、atcoder-toolsで自動生成されたコードをそのままAtCoderのスニペット上で利用できます。
https://kyuridenamida.github.io/atcoder-tools/
各問題ごとの解析結果などが載っています。
重要: かつてパスワード入力なしでログインを実現するためにAccountInformation.py
にログイン情報を書き込むことを要求していましたが、セキュリティリスクが高すぎるため、セッション情報のみを保持する方針に切り替えました。
今後はできるだけ保持されているセッション情報を利用してAtCoderにアクセスし、必要に応じて再入力を要求します。
過去のユーザーの皆様にはAccountInformation.py
を削除して頂くようお願い申し上げます。
atcoder-tools gen {contest_id}
コンテスト環境を用意します。atcoder-tools codegen {problem_url}
指定されたURLが示す問題に対するソースコードを生成し、標準出力に出力します。atcoder-tools test
カレント・ディレクトリ上に実行ファイルと入出力(in_*.txt, out_*.txt)がある状態で実行するとローカルテストを行います。atcoder-tools submit
カレント・ディレクトリ上で実行すると対応する問題がサンプルに通る場合ソースコードを提出します。既にAtCoder上にその問題に対する提出がある場合、-u
を指定しないと提出できないようになっています。atcoder-tools version
現在の atcoder-tools のバージョンを出力します。atcoder-tools compile
カレント・ディレクトリ上で実行するとコードをコンパイルします。atcoder-tools set
現在のジャッジタイプを変更します。使用方法を確認するためにはatcoder-tools (コマンド名) --help
を用います。
例えばatcoder-tools gen --help
でatcoder-tools gen
の引数の詳細について確認することができます。
例:
atcoder-tools gen agc001
cd ~/atcoder-workspace/agc001/A
g++ main.cpp
atcoder-tools test
--without-login
引数を指定するとログインなしでデータをダウンロードできます(一般公開されているコンテストのみ)。
$ atcoder-tools gen [contest_id] --without-login
usage: atcoder-tools gen
[-h] [--without-login] [--workspace WORKSPACE] [--lang LANG]
[--template TEMPLATE] [--parallel] [--save-no-session-cache]
[--config CONFIG]
contest_id
positional arguments:
contest_id Contest ID (e.g. arc001)
optional arguments:
-h, --help show this help message and exit
--without-login Download data without login
--workspace WORKSPACE
Path to workspace's root directory. This script will create files in {WORKSPACE}/{contest_name}/{alphabet}/ e.g. ./your-workspace/arc001/A/
[Default] /home/kyuridenamida/atcoder-workspace
--lang LANG Programming language of your template code, cpp or java or rust or python or nim or d or cs.
[Default] cpp
--template TEMPLATE File path to your template code
[Default (C++)] /atcodertools/tools/templates/default_template.cpp
[Default (Java)] /atcodertools/tools/templates/default_template.java
[Default (Rust)] /atcodertools/tools/templates/default_template.rs
[Default (Python3)] /atcodertools/tools/templates/default_template.py
[Default (NIM)] /atcodertools/tools/templates/default_template.nim
[Default (D)] /atcodertools/tools/templates/default_template.d
[Default (C#)] /atcodertools/tools/templates/default_template.cs
--parallel Prepare problem directories asynchronously using multi processors.
--save-no-session-cache
Save no session cache to avoid security risk
--config CONFIG File path to your config file
[Default (Primary)] /home/kyuridenamida/.atcodertools.toml
[Default (Secondary)] /atcoder-tools/atcodertools/tools/atcodertools-default.toml
usage: ./atcoder-tools test [-h] [--exec EXEC]
[--num NUM] [--dir DIR]
[--timeout TIMEOUT]
[--knock-out]
[--skip-almost-ac-feedback]
[--judge-type JUDGE_TYPE]
[--error-value ERROR_VALUE]
[--compile-before-testing COMPILE_BEFORE_TESTING]
[--compile-only-when-diff-detected COMPILE_ONLY_WHEN_DIFF_DETECTED]
[--config CONFIG]
optional arguments:
-h, --help show this help message and exit
--exec EXEC, -e EXEC File path to the execution target. [Default] Automatically detected exec file
--num NUM, -n NUM The case number to test (1-origin). All cases are tested if not specified.
--dir DIR, -d DIR Target directory to test. [Default] Current directory
--timeout TIMEOUT, -t TIMEOUT
Timeout for each test cases (sec) [Default] 1
--knock-out, -k Stop execution immediately after any example's failure [Default] False
--skip-almost-ac-feedback, -s
Hide inputs and expected/actual outputs if result is correct and there are error outputs [Default] False,
--judge-type JUDGE_TYPE, -j JUDGE_TYPE
error type must be one of [normal, absolute, relative, absolute_or_relative, multisolution, interactive]
--error-value ERROR_VALUE, -v ERROR_VALUE
error value for decimal number judge: [Default] 1e-09
--compile-before-testing COMPILE_BEFORE_TESTING, -c COMPILE_BEFORE_TESTING
compile source before testing [true, false]: [Default]: false
--compile-only-when-diff-detected COMPILE_ONLY_WHEN_DIFF_DETECTED
compile only when diff detected [true, false] [Default]: true
--config CONFIG File path to your config file
[Default (Primary)] ~/.atcodertools.toml
[Default (Secondary)] atcodertools-default.toml
usage: atcoder-tools submit [-h] [--exec EXEC] [--dir DIR]
[--timeout TIMEOUT] [--code CODE]
[--force] [--save-no-session-cache]
[--unlock-safety]
[--judge-type JUDGE_TYPE]
[--error-value ERROR_VALUE]
optional arguments:
-h, --help show this help message and exit
--exec EXEC, -e EXEC File path to the execution target. [Default] Automatically detected exec file
--dir DIR, -d DIR Target directory to test. [Default] Current directory
--timeout TIMEOUT, -t TIMEOUT
Timeout for each test cases (sec) [Default] 1
--code CODE, -c CODE Path to the source code to submit [Default] Code path written in metadata.json
--force, -f Submit the code regardless of the local test result [Default] False
--save-no-session-cache
Save no session cache to avoid security risk
--unlock-safety, -u By default, this script only submits the first code per problem. However, you can remove the safety by this option in order to submit codes twice or more.
--judge-type JUDGE_TYPE, -j JUDGE_TYPE
error type must be one of [normal, absolute, relative, absolute_or_relative]
--error-value ERROR_VALUE, -v ERROR_VALUE
error value for decimal number judge: [Default] 1e-09
usage: ./atcoder-tools codegen [-h] [--without-login] [--lang LANG]
[--template TEMPLATE] [--save-no-session-cache]
[--config CONFIG]
url
positional arguments:
url URL (e.g. https://atcoder.jp/contests/abc012/tasks/abc012_3)
optional arguments:
-h, --help show this help message and exit
--without-login Download data without login
--lang LANG Programming language of your template code, cpp or java or rust.
[Default] cpp
--template TEMPLATE File path to your template code
[Default (C++)] /home/user/GitHub/atcoder-tools/atcodertools/tools/templates/default_template.cpp
[Default (Java)] /home/user/GitHub/atcoder-tools/atcodertools/tools/templates/default_template.java
[Default (Rust)] /home/user/GitHub/atcoder-tools/atcodertools/tools/templates/default_template.rs
--save-no-session-cache
Save no session cache to avoid security risk
--config CONFIG File path to your config file
[Default (Primary)] /home/user/.atcodertools.toml
[Default (Secondary)] /home/user/GitHub/atcoder-tools/atcodertools/tools/atcodertools-default.toml
usage: ./atcoder-tools set [-h]
[--judge-type JUDGE_TYPE]
[--error-value ERROR_VALUE]
[--lang LANG] [--dir DIR]
optional arguments:
-h, --help show this help message and exit
--judge-type JUDGE_TYPE, -j JUDGE_TYPE
error type must be one of [normal, absolute, relative, absolute_or_relative, multisolution, interactive]
--error-value ERROR_VALUE, -v ERROR_VALUE
error value for decimal number judge: [Default] 1e-09
--lang LANG Programming language of your template code, cpp or java or rust or python or nim or d or cs.
--dir DIR, -d DIR Target directory to test. [Default] Current directory
usage: Compile your program in the current directory (no argument)
optional arguments:
-h, --help show this help message and exit
~/.atcodertools.toml
に以下の設定を保存すると、コードスタイルや、コード生成後に実行するコマンドを指定できます。
現在 4 種類に大別される設定カテゴリがサポートされています。
バージョン1.1.7以降では、言語毎にcodestyle
, postprocess
, run
を指定できます。(言語毎の設定を参照してください)
以下は、次の挙動を期待する場合の~/.atcodertools.toml
の例です。
indent_type='space'
スペースがインデントに使われる('tab'
を指定した場合はタブが使われる)indent_width=4
インデント幅は4である (indent_width
が無指定の場合4
(nim言語以外), 2
(nim言語)が規定値として使われます。)template_file='~/my_template.cpp'
コード生成テンプレートとして~/my_template.cpp
を使うworkspace_dir='~/atcoder-workspace/'
ワークスペースのルートは ~/atcoder-workspace/
lang='cpp'
言語設定は cpp
(提出時もしくはデフォルトのコードジェネレーター生成時に使われます)code_generator_file="~/custom_code_generator.py"
カスタムコードジェネレーター ~/custom_code_generator.py
を指定するexec_on_each_problem_dir='clang-format -i ./*.cpp'
exec_on_contest_dir='touch CMakeLists.txt'
clang-format
を実行して、最後にCMakeLists.txt
(空)をコンテスト用ディレクトリに生成するdownload_without_login=false
AtCoderにログインせずにダウンロードを行う機能を使わない (公開コンテストに対してのみ可能)parallel_download=false
データの並列ダウンロードを無効にするsave_no_session_cache=false
ログイン情報のクッキーを保存するin_example_format="in_{}.txt"
テストケース(input)のフォーマットをin_1.txt, in_2.txt, ...
とするout_example_format="out_{}.txt"
テストケース(output)のフォーマットをout_1.txt, out_2.txt, ...
とするcompile_command="g++ main.cpp -o main.out"
プログラムをatcoder-tools compile
でコンパイルする場合に実行されるコマンドrun_command="./main.out"
コンパイルしたプログラムをatcoder-tools test
で実行する場合に実行されるコマンド[codestyle]
indent_type='space' # 'tab' or 'space'
indent_width=4
template_file='~/my_template.cpp'
workspace_dir='~/atcoder-workspace/'
lang='cpp' # Check README.md for the supported languages.
code_generator_file="~/custom_code_generator.py"
[postprocess]
exec_on_each_problem_dir='clang-format -i ./*.cpp'
exec_on_contest_dir='touch CMakeLists.txt'
[run]
compile_command="g++ main.cpp -o main.out"
run_command="./main.out"
[etc]
download_without_login=false
parallel_download=false
save_no_session_cache=false
in_example_format="in_{}.txt"
out_example_format="out_{}.txt"
compile_before_testing=false
compile_only_when_diff_detected=false
バージョン1.1.7以降では、言語毎にcodestyle
, postprocess
, run
を指定できます。
(言語名).(設定カテゴリ名)
に対して設定を行うと、言語毎の設定になります。言語名が無い場合の通常の指定は共通のデフォルト設定として扱われます。
atcoder-tools起動時に使われる言語固有の設定は、--lang
プログラム引数が存在すればそれを、なければcodestyle.lang
に指定された値に基づきます。
(言語名).codestyle.lang
は無視されます。
以下の設定では、
--lang
引数無しで起動した際に使用される言語はPythonである。ただし
[python.codestyle] indent_width=2
### カスタムコードジェネレーター
[標準のC++コードジェネレーター](https://github.com/kyuridenamida/atcoder-tools/blob/master/atcodertools/codegen/code_generators/cpp.py)に倣って、
`(CogeGenArgs) -> str(ソースコード)`が型であるような`main`関数を定義した.pyファイルを`code_generator_file`で指定すると、コード生成時にカスタムコードジェネレーターを利用できます。
## テンプレートの例
`atcoder-tools gen`コマンドに対し`--template`でテンプレートソースコードを指定できます。
テンプレートエンジンの仕様については[jinja2](http://jinja.pocoo.org/docs/2.10/) の公式ドキュメントを参照してください。
テンプレートに渡される変数は以下の通りです。
- **prediction_success** 入力形式の推論に成功したとき `True`、 失敗したとき `False`が格納されている。この値が`True`のとき次の3種類の変数も存在することが保証される。
- **input_part** input用のコード
- **formal_arguments** 型つき引数列
- **actual_arguments** 型なし引数列
- **mod** 問題文中に存在するmodの整数値
- **yes_str** 問題文中に存在する yes や possible などの真を表しそうな文字列値
- **no_str** 問題文中に存在する no や impossible などの偽を表しそうな文字列値
```c++
#include <bits/stdc++.h>
using namespace std;
int main(){
// Failed to predict input format
return 0;
}
気軽にPRを送ってください。