Skip to main content

競プロ便利 CLI ツール。AtCoder と アルゴ式 に対応。

Project description

acac

競プロ便利 CLI ツール。AtCoderアルゴ式 に対応。

PyPI PyPI - Python Version Tests CodeQL codecov Downloads Downloads Downloads Code style: black

*現在 Pre-release のため、挙動やコマンドは変更される場合があります。

概要

競技プログラミングの過去問を解くときの(個人的に)典型的なワークフローを CLI として自動化したものです。

過去問だけでなく開催中のコンテストでも使えますが、ログイン機能は実装されていないため、手動で HTML ファイルを取得する必要があります。

インストール

Python 3.9 以上がインストールされていれば利用可能です。

pip install acac

事前準備

作業ディレクトリに移動して、acac init を実行します。

# 例
mkdir kyopro
cd kyopro
acac init

acac.toml が作成されます。これが設定ファイルです。

使用例

  1. まず、ブラウザで問題ページ(例えば、ABC 280 A - Pawn on a Grid)にアクセスします。

  2. URL をコピーします

    • 使用可能な場合、以下のショートカットキーが便利です。
      • Windows: Ctrl+L, Ctrl+C
      • Mac: command+L, command+C
  3. ターミナルで以下のようなコマンドを実行すると、問題用のフォルダ(以下、問題フォルダ)に環境が自動作成されます。

    acac https://atcoder.jp/contests/abc280/tasks/abc280_a
    
    処理の詳細
    • 問題フォルダを作成します。
    • ソースコードのテンプレートファイルが用意されていれば、そのファイルをコピーします。そうでなければ、ソースコード用の空ファイルを作成します。
    • cache.html が無ければ)問題ページにアクセスし、HTML ファイルを cache.html として保存します。
    • metadata.toml を作成します。
      • 問題ページのタイトルと URL が格納されます。
    • 問題ページ中からテストケースのサンプルを抽出し、テキストファイルとして保存します。
    • acac.toml で設定したコマンドを実行します。
    • acac.toml で設定したメッセージをクリップボードにコピーします。
      • 私は Git のコミットメッセージを設定しています。
  4. コードを書いて問題を解きます。

  5. ターミナルで以下のようなコマンドを実行します。

    acac https://atcoder.jp/contests/abc280/tasks/abc280_a -j
    

    すると、以下のように処理されます。

    • acac.toml で設定したコマンドを実行します(バージョン確認、コンパイル等)。
    • 用意されたテストケースに対してジャッジを行います。
    • acac.toml で設定したコマンドを実行します(クリーンアップ等)。
    • すべて AC であれば、ソースコードがクリップボードにコピーされますので、ブラウザに貼り付けて提出してください。
    • 「他の人の提出を確認しますか?」と聞かれるので、y と答えれば、同じ言語で AC した提出の一覧ページをブラウザで開きます。
    • acac.toml で設定したメッセージをクリップボードにコピーします。

設定ファイル

私が実際に使用している設定ファイルは こちら です。

# 設定ファイルの例

[create]
# 環境作成後に実行されるコマンドのリスト(以下は git add をして、VSCode でソースコード用のファイルを開いている)
post_create_commands = [
    "git add ${dir_path}/in ${dir_path}/out ${dir_path}/metadata.toml",
    "code . ${dir_path}/${source_file_name}",
]
# 環境作成後にクリップボードにコピーされるメッセージ
clipboard_message = "Create: ${url}"


[judge]
# ジャッジ後にソースコードをクリップボードにコピーするかどうか
copy_source_code_when_ac = true
# ジャッジ後にクリップボードにコピーされるメッセージ
clipboard_message = "AC: ${url} ${source_file_name}"


[language]
# デフォルトの使用言語
default = "cpp"


[language.settings.cpp]
# ソースコードのファイル名
source_file_name = "main.cpp"
# テンプレートファイルのパス
template_file_path = "templates/main.cpp"
[language.settings.cpp.commands]
# ジャッジ前に実行するコマンドのリスト(以下はバージョンを表示し、コンパイルしている)
pre_execute = [
    "g++ --version",
    "g++ ${dir_path}/${source_file_name} -o ${dir_path}/a.out",
]
# 実行コマンド
execute = "${dir_path}/a.out"
# ジャッジ後に実行するコマンドのリスト(以下は `a.out` を削除している)
post_execute = ["rm ${dir_path}/a.out"]


[language.settings.python3]
# ...

${var} の置換リスト

置換前 置換後
${dir_path} 問題フォルダのパス
${lang} 言語名
${source_file_name} ソースコードのファイル名(パスではありません)
${url} 問題ページの URL

コマンドオプション

モード指定

オプション モード
-c, --create 作業環境構築(デフォルト)
-j, --judge ジャッジ
-m, --manual URL にアクセスせず、HTML ファイルを手動で配置してテストケースを作成する

ログインが必要な場合、acac <url> -m を実行後、問題フォルダに問題ページの HTML ファイルを配置してください。

その他

acac.toml に指定したデフォルト値を一時的に上書きするような動きをします。イコールは必須です。

オプション 上書きされるもの
-l, --lang, lang=LANG_NAME 使用言語
-s, --source, source=SOURCE_FILE_NAME ソースコードのファイル名
# 例
acac https://atcoder.jp/contests/abc280/tasks/abc280_a -l=python3 --source=main2.py
acac https://atcoder.jp/contests/abc280/tasks/abc280_a -s=main2.py lang=python3 --judge

コンセプト

なぜ acac create <url>acac judge <url> のような一般的な CLI の慣例に沿っていないのか

  1. acac <url> で環境作成
  2. コードを書く
  3. ターミナルで Ctrl+P
  4. 末尾に -j をつけてジャッジ

という流れを高速で行うためです。基本的に、一つの問題に対し複数のコマンドを実行することが多いので、URL のあとにコマンドやオプションを指定する方式を採っています。

問題フォルダ構成が URL そのままで冗長なのはなぜか

開発当初は AtCoder/ABC/280/A/ のようなフォルダ構成にしていましたが、過去のコンテストの URL 規則との整合性や、未来への拡張性、ghq のような厳密性を保持するため、現在のような形にしました。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

acac-0.5.0.tar.gz (13.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

acac-0.5.0-py3-none-any.whl (15.1 kB view details)

Uploaded Python 3

File details

Details for the file acac-0.5.0.tar.gz.

File metadata

  • Download URL: acac-0.5.0.tar.gz
  • Upload date:
  • Size: 13.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.8

File hashes

Hashes for acac-0.5.0.tar.gz
Algorithm Hash digest
SHA256 57d3eb335cc676135514d8915887bf9879c930ed81000302b2d6e3a773273924
MD5 17afb0de086882d0817da6e301eb409d
BLAKE2b-256 d21b8ac7fe80b751baf971289403a414ac654d5aa131e765850c789ad19c6d80

See more details on using hashes here.

File details

Details for the file acac-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: acac-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 15.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.8

File hashes

Hashes for acac-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2e4cd3dbebe60e333f354a6c7d810c28ef0aa5806f149d38d2f203ca456850bd
MD5 2537efe32e6aa8cc51ce7838dd2728be
BLAKE2b-256 4bcdced807c4dfd1ec933ffa28fc40d9144c924bb7417b29c94e7594fa3aa4c8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page