Codeforces 用に競技プログラミング環境を変更した

はじめに

これまで競技プログラミングのコンテストのうち、AtCoder のコンテストに参加し、以下のツールを使っていました。

  • iTerms2
    • 以下のツールを実行する CUI
  • Vim
    • エディタ
  • online-judge-tools/oj
    • サンプルによるテストの実行
  • atcoder-cli
    • コンテスト用ディレクトリの準備
    • テンプレートの用意
    • サンプルのダウンロード
    • ソースコードの提出

これらのツールのおかげで快適に参加できていましたが、今後 Codeforces などの他のコンテストに参加することを考えると以下の課題がありました。

  1. atcoder-cli は AtCoder に特化しているため、他コンテストのディレクトリの準備などは難しそう。
  2. online-judge-tools/api-client の issue#127 によると Codeforces では CUI からのソースコードの提出を避けた方が良さそう。
  3. AC Library をインクルードできないジャッジへの対応ができていない。

上記の課題を自分なりに解決するため、以下の対応を行いました。

  1. atcoder-cli で行っていた作業の多くを online-judge-tools/template-generator の oj-prepare で行うように変更した。
  2. atcoder-cli によるソースコードの提出を web ブラウザからの提出に変更した。
  3. 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.cppmain.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.cppgenerate.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 周辺の設定確認はできませんでしたが、その他の環境設定については特に問題ありませんでした。

今後、気になった点が出てきたら変更を検討することにして、ひとまず、この環境設定で問題を解いていこうと思います。