VSCode + online-judge-tools + AtCoder Libraryの環境構築

以前競プロ用のVSCodeの環境構築の記事を書きました。 先日AtCoder Library (ACL)がリリースされたので、それに対応するための記事を書こうと思います。 また、前の記事ではサンプルの自動テスト・提出用のツールをAtCoderとCodeforcesで別のものを紹介しましたが、現在は複数の競技プログラミングサイトに対応していて高機能なonline-judge-toolsを使っているのでそれも書きます。

自分用のメモでもあるので少し雑かもしれませんがおかしいところがあったらtwitterなどで連絡してくださると助かります。 また、VSCode自体のインストールや環境構築がすんでいない方は旧記事も参照してください。

AtCoder Library (ACL)の導入

ここからzipファイルをダウンロードして~/に展開しておきましょう。

$ ls ~/ac-library/
atcoder		document_en	document_ja	expander.py

VSCodeのパスの設定

補完やシンタックスハイライトが聞くように、.vscode/c_cpp_properties.jsonincludePathにライブラリのパスを追加します。

{
    "configurations": [
        {
            // ...
            "includePath": [
                "~/ac-library/**",
                "${workspaceFolder}/**"
            ],
            // ...
        }
    ],
}

Code Runnerの設定

settings.jsonのCode Runnerのコンパイルオプションに-I ~/ac-libraryを追加します。 以下は例です。自分の好きなコンパイルオプションを設定してください。

    "code-runner.executorMap": {
        "cpp": "cd $dir && g++ -O0 -std=c++17 -Wshadow -Wall -Wno-sign-compare -D_GLIBCXX_DEBUG -include ~/.competitive_local.hpp -I ~/ac-library $fileName && ./a.out",
    },

online-judge-toolsの導入

ドキュメントに従ってインストールしてログインなどを済ませておきましょう。

サンプルのダウンロード

以下のような関数を.bashrcなどに書いておくと便利です。

function dl_problem() {
  if [ $# -ne 1 ]; then
    echo "number of argments should be 1"
    return 1
  fi
  dir_name=${1##*/}
  echo $dir_name
  mkdir $dir_name
  cd $dir_name
  oj d $1
}
dl_problem https://atcoder.jp/contests/abc178/tasks/abc178_f

などのように実行することで、現在いる場所に問題名のディレクトリを作ってくれます。

提出ショートカットの設定

.vscode/tasks.jsonの設定例です。

{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "label": "competitiveTestSample",
      "type": "shell",
      "command": "cd ${fileDirname} && g++ -O0 -std=c++17 -D_GLIBCXX_DEBUG -I ~/ac-library ${fileBasename} && oj t",
      "presentation": {
        "reveal": "always",
        "focus": true,
        "panel": "shared",
      }
    },
    {
      "label": "competitiveSubmit",
      "type": "shell",
      "command": "cd ${fileDirname} && CPLUS_INCLUDE_PATH=~/ac-library python3 ~/ac-library/expander.py ${fileBasename} && oj s combined.cpp",
      "presentation": {
        "reveal": "always",
        "focus": true,
        "panel": "shared",
      }
    }
  ]
}

AtCoder以外のサイトでの提出もふまえて、提出するファイルはACLのexpander.pyを用いて#includeを展開したものにしています。 提出ファイルサイズ制限などに引っかからないように、<atcoder/all>ではなく使うライブラリだけをインクルードしたほうがいいかもしれません。

こうすることで、keybindings.jsonを以下のように設定することでショートカットでテストや提出ができるようになります。

[
  {
    "key": "ctrl+t",
    "command": "workbench.action.tasks.runTask",
    "when": "editorTextFocus",
    "args": "competitiveTestSample"
  },
  {
    "key": "ctrl+s",
    "command": "workbench.action.tasks.runTask",
    "when": "editorTextFocus",
    "args": "competitiveSubmit"
  },
]