はじめに
これまで競技プログラミングのコンテストのうち、AtCoder のコンテストに参加し、以下のツールを使っていました。
- iTerms2
- 以下のツールを実行する CUI
- Vim
- エディタ
- online-judge-tools/oj
- サンプルによるテストの実行
- atcoder-cli
- コンテスト用ディレクトリの準備
- テンプレートの用意
- サンプルのダウンロード
- ソースコードの提出
これらのツールのおかげで快適に参加できていましたが、今後 Codeforces などの他のコンテストに参加することを考えると以下の課題がありました。
- atcoder-cli は AtCoder に特化しているため、他コンテストのディレクトリの準備などは難しそう。
- online-judge-tools/api-client の issue#127 によると Codeforces では CUI からのソースコードの提出を避けた方が良さそう。
- AC Library をインクルードできないジャッジへの対応ができていない。
上記の課題を自分なりに解決するため、以下の対応を行いました。
- atcoder-cli で行っていた作業の多くを online-judge-tools/template-generator の oj-prepare で行うように変更した。
- atcoder-cli によるソースコードの提出を web ブラウザからの提出に変更した。
- AC Library の
expander.py
の alias 設定を行った。
本記事は上記の対応の作業メモです。
atcoder-cli で行っていた作業の多くを oj-prepare で行うように変更した
online-judge-tools/template-generator のインストール
template-generator の README の通りに以下を実行し template-generator をインストールしました。
% pip3 install online-judge-template-generator
oj-prepare をデフォルトで使ってみた感想
oj-prepare を AtCoder のコンテストに対して行ったところ以下の感想を持ちました。
generate.py
の自動生成が嬉しい。- これまでは必要なときに最初から作成していた。
- 入力のフォーマットを解析して生成されたコードが読みやすい・必要に応じて変更しやすそう。
main.cpp
とmain.py
が両方作成されるため、shell を操作する際にタブ補完が引っかかる。main.cpp
の入力・出力部分の自動生成を使いこなす自信がない。
oj-prepare の設定
README の Settings を見ながら設定しました。
設定ファイル prepare.config.toml
のパスですが oj-prepare -h
でヘルプを表示させると、以下のようにオプション --config-file
の説明にデフォルト値として記載されていました(一部の出力結果を加工しています)。
% oj-prepare -h
usage: oj-prepare [-h] [-v] [-c COOKIE] [--config-file CONFIG_FILE] url
positional arguments:
url
optional arguments:
-h, --help show this help message and exit
-v, --verbose
-c COOKIE, --cookie COOKIE
--config-file CONFIG_FILE
default: /Users/${ユーザ名}/Library/Application
Support/online-judge-tools/prepare.config.toml
以下が私の設定です。
contest_directory = "{contest_id}"
problem_directory = "{problem_id}"
[templates]
"main.cpp" = "main.cpp"
"generate.py" = "generate.py"
設定の目的は以下の通りです。
- コンテストのディレクトリと問題のディレクトリを作成する。
main.cpp
とgenerate.py
だけ生成する。
oj-template のためのテンプレート作成
テンプレートのサンプルや oj-template のソースコードを見ながら、以下のような main.cpp
テンプレートを作成しました。
- 入力・出力部分の自動生成は行わない。
- コンテストの URL を見て
atcoder.jp
を含むならば AC Library をインクルードする。 - 問題文の解析結果に剰余の定数がある場合は AC Library の
atcoder::modint
用の型定義を追加する。
テンプレートの処理部分は以下の通りです。
logger = getLogger(__name__)
include = ""
typedefinition = ""
if "atcoder.jp" in data["analyzed"].resources.url:
include = "#include <atcoder/all>"
mod = data["analyzed"].constants.get("MOD")
if mod:
if not include:
include = "#include <atcoder/modint>"
typedefinition = "\n".join([
f"using mint = atcoder::modint{mod.value};",
"using VM1 = vector<mint>;",
"using VM2 = vector<VM1>;",
])
atcoder-cli によるソースコードの提出を web ブラウザからの提出に変更した
CUI によるソースコードの提出を諦めて、ある程度簡単に web ブラウザから提出できないか考えました。
私は以下が面倒だと考えていました。
- ソースコードをフォームに貼り付けて提出する場合、iTerms2 経由で Vim を使用しているため、ソースコード全体をコピーするのが面倒。
- ファイル
main.cpp
を提出する場合、Finder で作業ディレクトリまで移動するのが面倒。
調べてみると MacOS には open というコマンドがあり open .
のように使用すると iterm2 から Finder を起動して作業ディレクトリを開くことできるようです。
以下が web の参考文献です。詳しく知りたい方は MacOS のターミナルで man 1 open
を実行ください。
幸い、AtCoder, Codeforces, yukicoder ではファイルでのソースコード提出ができるため、許容範囲の手間でソースコードを提出できるようになりました。
AC Library の expander.py の alias 設定を行った
AC Library をインクルードできないコンテストでは AC Library の Appendix / FAQ 「他のジャッジへの提出方法」にしたがって expander.py
を使うことにしました。
使いやすいように以下の alias 設定をしました。/path/to/ac-library
は AC Library のディレクトリの絶対パスです。
% alias aclexpand='/path/to/ac-library/expander.py --lib /path/to/ac-library'
初めての virtual participation
設定を確認するため、Codeforces Round #640 (Div. 4) にバーチャル参加してみました。
AC Library を使いたい問題がなく、expander.py
周辺の設定確認はできませんでしたが、その他の環境設定については特に問題ありませんでした。
今後、気になった点が出てきたら変更を検討することにして、ひとまず、この環境設定で問題を解いていこうと思います。