プログラミング

VSCodeでAtCoder用環境を構築する

内山浩佑

エンジニアの内山です。
先日、AWS認定資格の全冠を達成して一段落したので、競技プログラミングの活動を再開しました。

DWSでは競技プログラミング部があり、主にAtCoderというプログラミングコンテストサイトを利用しています。

参考

競技プログラミング部活動をはじめました

競プロ、おすすめです

今回は、VSCodeでAtCoder用環境を構築する方法を紹介します。

概要

今回の記事では、「AtCoder Tools」と「AtCoder Library」というツールを導入する手順となっています。これらのツールを導入することにより、以下のような環境ができあがります。

  • VSCodeのショートカットキーで、コードのテスト、コードの提出ができる
  • よく使われるデータ構造やアルゴリズムが実装されたライブラリを利用できる

以下、各ツールの紹介と設定手順を記載しています。

AtCoder Toolsとは

AtCoder Tools
https://github.com/kyuridenamida/atcoder-tools

AtCoder Toolsは、以下のような機能を備えています。

  • AtCoderの問題ページからサンプル入力を読み込み、手元のPCでテストできるようにする
  • 手元のPCからコマンドで直接AtCoderにコードを提出できるようにする
  • マクロやライブラリなど、あらかじめ用意したテンプレートを基に、問題を解く用のディレクトリを生成する

本記事では、AtCoder Toolsのコマンドをインストールし、VSCodeからショートカットキーで実行できるように設定します。

AtCoder Libraryとは

AtCoder Libraryは、AtCoder社が無料で配布しているライブラリです。
競技プログラミングでよく使われるデータ構造やアルゴリズムが実装されています。

https://atcoder.github.io/ac-library/document_ja/

本記事では、このライブラリを使えるように、パスの設定やコンパイラに渡す引数の設定を行っています。

AtCoder Toolsのインストール

Python3.8以降で動作するツールのため、pip3コマンドでインストールします。

$ pip3 install atcoder-tools

このコマンドで、依存パッケージmarkupsafeのバージョンが2.1.1でインストールされます。
この状態でatcoder-toolsコマンドを実行するとImportErrorが発生する場合があります。その場合は、バージョンを2.0.1にして入れ直す必要があります。

$ pip3 uninstall markupsafe
$ pip3 install markupsafe==2.0.1

参考
解決策。ImportError: cannot import name 'soft_unicode' from 'markupsafe'

インストールが完了すると atcoder-tools コマンドが使用できるようになります。

AtCoder Libraryのインストール

以下のリンクからzipファイルをダウンロードします。

https://atcoder.jp/posts/517

解凍したら ~/ac-library に置きます。
※場所は任意ですが、これ以降の解説は上記のディレクトリを前提としています。

AtCoder Libraryのテンプレートを設定

テンプレートを設定します。
以下の内容で ~/.atcodertools.toml ファイルを作成・編集します。

exec_on_contest_dir='ln -s ../.vscode ./.vscode && code .'
[codestyle]
template_file='~/atcoder-workspace/template.cpp'

以下の内容で、 ~/atcoder-workspace/template.cpp ファイルを作成・編集します。

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#include <utility>
#include <bitset>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <cassert>
#include <iomanip>
using namespace std;

#define REP(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define FOR(i, a, b) for (int i = (a), i##_len = (b); i <= i##_len; ++i)
#define REV(i, a, b) for (int i = (a); i >= (b); --i)
#define CLR(a, b) memset((a), (b), sizeof(a))
#define DUMP(x) cout << #x << " = " << (x) << endl;
#define INF 1001001001001001001ll
#define fcout cout << fixed << setprecision(12)

using ll = long long;
using vi = vector<int>;
using vl = vector<long long>;
using vs = vector<string>;
using vc = vector<char>;
using vb = vector<bool>;
using vpii = vector<pair<int, int>>;
using vpll = vector<pair<long long, long long>>;
using vvi = vector<vector<int>>;
using vvl = vector<vector<long long>>;
using vvc = vector<vector<char>>;
using vvb = vector<vector<bool>>;
using vvvi = vector<vector<vector<int>>>;
using pii = pair<int, int>;

template <typename T>
inline bool chmax(T &a, T b) {
  return ((a < b) ? (a = b, true) : (false));
}
template <typename T>
inline bool chmin(T &a, T b) {
  return ((a > b) ? (a = b, true) : (false));
}

{% 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 %}

// Generated by {{ atcodertools.version }} {{ atcodertools.url }}  (tips: You use the default template now. You can remove this line by using your custom template)
int main(){
    {% if prediction_success %}
    {{input_part}}
    solve({{ actual_arguments }});
    {% else %}
    // Failed to predict input format
    {% endif %}
    return 0;
}

このファイルの内容は一例なので、必要に応じて編集してください。

VSCode上でコマンドを実行できるように設定

VSCodeを立ち上げます。

コマンドパレット( Shift + Command + Pで起動)で、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++14 -D_GLIBCXX_DEBUG -I ~/ac-library ${fileBasename} && atcoder-tools test",
            "presentation": {
              "reveal": "always",
              "focus": true,
              "panel": "shared",
            }
          },
          {
            "label": "competitiveSubmit",
            "type": "shell",
            "command": "cd ${fileDirname} && g++ -O0 -std=c++14 -D_GLIBCXX_DEBUG -I ~/ac-library ${fileBasename} && atcoder-tools submit -u",
            "presentation": {
              "reveal": "always",
              "focus": true,
              "panel": "shared",
            }
          }
    ]
}

コマンドパレットで 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"
  },
  ...(省略)

この設定により、以下のショートカットキーが追加されます。

  • ctrl+t ローカルでテスト実行
  • ctrl+s コードを提出

VSCode上でAtCoder Libraryのインクルードパスを設定する

VSCode上で、AtCoder Library関連の自動補完が効くように設定します。

コマンドパレット Shift + Command + Puser settings とタイプして、「ユーザー設定を開く」を選択して、設定画面を開きます。

以下の画像のように、インクルードパスを設定する項目を検索し、以下の2つの設定を追加します。

  • "${workspaceFolder}/**"
  • ~/ac-library/**

スクリーンショット 2022-11-15 22.12.35.png (257.6 kB)

以上で、一通りの設定は完了です。

AtCoderの問題を読み込む

問題を読み込むには、コンソール上で、以下のコマンドを実行します。

$ atcoder-tools gen {コンテストID}

コンテストID は、AtCoderページのURLに含まれています。

スクリーンショット 2022-11-15 21.27.47.png (111.5 kB)

~/atcoder-workspace にコンテストのデータが読み込まれます。

あとは、VSCodeで開いて、コードを書いていってください。
ctrl+t でテストし、ctrl+s で提出しましょう。

参考

VSCode + online-judge-tools + AtCoder Libraryの環境構築
https://blog.knshnb.com/posts/vscode-oj-acl/

Customizing default settings
https://code.visualstudio.com/docs/cpp/customize-default-settings-cpp

AUTHOR
uchiko
uchiko
記事URLをコピーしました