Home

Awesome

Build Status codecov PyPI

AtCoder Tools

Python 3.5 以降で動作する AtCoder からサンプル入力をダウンロードしたりする際に便利なツールです。

このツールには次のような機能があります。

対応言語Contributor 1Contributor 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)

Demo

<img src="https://user-images.githubusercontent.com/233559/52807100-f6e2d300-30cd-11e9-8906-82b9f9b2dff7.gif" width=70%>

How to install

pip3 install atcoder-tools

ただのpipだとPython 2系を使ってインストールされる可能性があるためうまくいかないかもしれません。

Userscript by @kmyk (NEW! 2019/03/06)

Tampermonkey(各種ブラウザで動作)でインストールすることが可能なUserscriptです。公開されている過去問を対象として、atcoder-toolsで自動生成されたコードをそのままAtCoderのスニペット上で利用できます。

  1. Tampermonkey をインストールする (Chrome, FireFox)
  2. https://kyuridenamida.github.io/atcoder-tools/index.user.js にアクセスしてUserscriptをインストール
  3. ログインした状態で適当な問題ページに行く(e.g. https://atcoder.jp/contests/abc120/tasks/abc120_d)
  4. 正しくインストールされている場合、ページ下部のコードスニペットにコードが標準で埋め込まれている (atcoder-toolsの対応言語のみ) <img src="https://user-images.githubusercontent.com/233559/53821542-56d3e780-3fb1-11e9-89d9-24a3d0e9af5c.png" width=50%>

Analysis

https://kyuridenamida.github.io/atcoder-tools/

各問題ごとの解析結果などが載っています。

使用方法

重要: かつてパスワード入力なしでログインを実現するためにAccountInformation.pyにログイン情報を書き込むことを要求していましたが、セキュリティリスクが高すぎるため、セッション情報のみを保持する方針に切り替えました。 今後はできるだけ保持されているセッション情報を利用してAtCoderにアクセスし、必要に応じて再入力を要求します。 過去のユーザーの皆様にはAccountInformation.pyを削除して頂くようお願い申し上げます。

使用方法を確認するためにはatcoder-tools (コマンド名) --helpを用います。 例えばatcoder-tools gen --helpatcoder-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

gen の詳細

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

test の詳細

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

submit の詳細

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

codegen の詳細

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

set の詳細

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

compileの詳細

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の例です。

[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は無視されます。

以下の設定では、

[codestyle]
lang='python'
indent_type='space'
indent_width=4
[cpp.codestyle]
indent_type='tab'
code_generator_file="~/custom_code_generator.py"
[cpp.postprocess]
exec_on_each_problem_dir='clang-format -i ./*.cpp'
exec_on_contest_dir='touch CMakeLists.txt'
[java.run]

[python.codestyle]
indent_width=2

カスタムコードジェネレーター

標準のC++コードジェネレーターに倣って、 (CogeGenArgs) -> str(ソースコード)が型であるようなmain関数を定義した.pyファイルをcode_generator_fileで指定すると、コード生成時にカスタムコードジェネレーターを利用できます。

テンプレートの例

atcoder-tools genコマンドに対し--templateでテンプレートソースコードを指定できます。 テンプレートエンジンの仕様についてはjinja2 の公式ドキュメントを参照してください。

テンプレートに渡される変数は以下の通りです。

#include <bits/stdc++.h>
using namespace std;

{% if mod %}
const long long MOD = {{ mod }};
{% endif %}
{% if yes_str %}
const string YES = "{{ yes_str }}";
{% endif %}
{% if no_str %}
const string NO = "{{ no_str }}";
{% endif %}

{% if prediction_success %}
void solve({{ formal_arguments }}){

}
{% endif %}

int main(){
    {% if prediction_success %}
    {{input_part}}
    solve({{ actual_arguments }});
    {% else %}
    // Failed to predict input format
    {% endif %}
    return 0;
}

Contribution

気軽にPRを送ってください。

Licence

MIT

Author

kyuridenamida (@kyuridenamida)