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ファイルをダウンロードします。
解凍したら ~/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 + P
で user settings
とタイプして、「ユーザー設定を開く」を選択して、設定画面を開きます。
以下の画像のように、インクルードパスを設定する項目を検索し、以下の2つの設定を追加します。
- "${workspaceFolder}/**"
- ~/ac-library/**
以上で、一通りの設定は完了です。
AtCoderの問題を読み込む
問題を読み込むには、コンソール上で、以下のコマンドを実行します。
$ atcoder-tools gen {コンテストID}
コンテストID
は、AtCoderページのURLに含まれています。
~/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