コードテストを使ってる皆さん
AtCoderのコードを,ブラウザのコードテスト機能,ちょっと不便ですよね
- コードテストが重くて結果が遅いな
- 実行エラーを見て変数名のミスに気付いた
- queueから要素を取り出すには,
frontだっけ?topだっけ? - デバッグ用に表示してた配列を消し忘れて
WA
こんな悩みを抱えていませんか?
そんな悩みを全て解決するためにローカル環境にAtCoderの実行環境を作りましょう!!
目次
前提
環境構築
あると便利な設定
Special Thanks
終わりに
前提
この記事では,以下の環境を想定しています
- windows 11
- Ubuntu
- VS Code
また,以下のような読者を想定します
- Ubuntuターミナルの簡単なコマンドがわかる(cd , mkdir ...)
- VS Codeの基本的な操作が出来る
環境構築
- 1.WSL UbuntuにC++開発環境を導入する
- 2.競プロ用のディレクトリを構築する
- 3.AtCoder Libraryの導入
- 4.VS CodeとWSLを連携する
- 5.VS CodeのC++ビルド環境を構築する
- 6.VS CodeのAI機能をオフにする
1. WSL UbuntuにC++開発環境を導入する
Ubuntu環境でC++を扱えるようにするため以下の3つをインストールします
-
build-essential:C/C++のビルド環境 -
gdb:デバッグ -
git:AtCoder Libraryの導入
Ubuntuターミナルを起動して,以下のコマンドを実行します
sudo apt update
sudo apt install -y build-essential gdb git
インストールが正常に完了したら,確認のためバージョンを確認してください
g++ --version
gdb --version
git --version
2. 競プロ用のディレクトリを構築する
競プロのプログラムを管理するためのディレクトリを作ります.
ディレクトリの構成はこの記事に必ずしも従う必要はありませんが,ディレクトリの知識に自信がない場合は記事の構成を推奨します.
user直下にディレクトリを配置します.
~/projects/kyopro/
├── .vscode/ # VS Code の設定
├── abc/ # ABC の問題
└── test/ # 環境構築の動作確認
mkdir -p ~/projects/kyopro/{.vscode,abc,test}
3. AtCoder Libraryの導入
AtCoder Libraryとは,AtCoderでよく使うアルゴリズムをまとめたライブラリです.
あると便利なので入れておきましょう
user直下にlibフォルダを作り,GithubからAtCoder Libraryをダウンロードします
配置先は~/lib/ac-library-master
mkdir -p ~/lib
cd ~/lib
git clone https://github.com/atcoder/ac-library.git ac-library-master
ダウンロードが完了したら,実際にAtCoder Libraryが使えるかテストしましょう
2.で作ったtestディレクトリに新たに'test1.cpp'ファイルを作り,以下のコードを貼り付けてください.
#include <bits/stdc++.h>
#include <atcoder/dsu>
using namespace std;
using namespace atcoder;
int main() {
dsu uf(3);
uf.merge(0, 1);
cout << uf.same(0, 1) << '\n';
cout << uf.same(0, 2) << '\n';
}
ファイルが完成したら,実際に実行してみましょう.
Ubuntuターミナルで以下のコマンドを実行してみてください.
cd ~/projects/kyopro/test
g++ -std=gnu++23 test1.cpp -I ~/lib/ac-library-master -o test1
./test1
1
0
このように表示されれば,成功です.
4. VS CodeとWSLを連携する
VS Codeの拡張機能のタブを開いて,
Microsoft C/C++Microsoft WSL
この2つをインストールしてください.
インストール後,Ubuntuターミナルで,
cd ~/projects/kyopro
code .
を実行して VS Codeが起動するはずです.
起動したVS Codeの左下に青枠で,WSL Ubuntuと表示されていれば成功です.

青枠が表示されている状態で,もう一度拡張機能のタブを開き,Microsoft C/C++に
「Install in WSL: Ubuntu」と表示されている場合は,追加でインストールしておいてください.
5. VS CodeのC++ビルド環境を構築する
.vscodeの設定を作成します.
.vscodeの直下に,c_cpp_properties.json,launch.json,tasks.jsonの3つのjsonファイルを作ります.
~/projects/kyopro/.vscode
├── c_cpp_properties.json # C/C++拡張の解析・補完設定
├── launch.json # デバッグ実行する設定
└── tasks.json # C++をビルドする設定
作成したら各jsonファイルに以下のjsonファイルの内容を貼り付けてください
!!注意!!
json内のパスで(User)となっている部分は,自身のWSLの名前に変更してください!!
!!注意終了!!
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/home/(User)/lib/ac-library-master"
],
"defines": [],
"compilerPath": "/usr/bin/g++",
"cStandard": "c17",
"cppStandard": "gnu++23",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
{
"version": "0.2.0",
"configurations": [
{
"name": "C++ Debug in WSL",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"preLaunchTask": "C/C++: g++ build active file",
"internalConsoleOptions": "neverOpen"
}
]
}
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-std=gnu++23",
"-g",
"-DLOCAL",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-I",
"/home/(User)/lib/ac-library-master"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
全て内容を変更して,保存したら,実際に機能するか試してみましょう.
VS Code設定の機能テスト
まずctrl + shift + Pから,reload Windowを選択します.
その後,test1.cppを選択した状態でctrl + shift + Bを試してください.
ターミナル上に「ビルドが正常に完了しました。」と表示されれば,tasks.jsonは正常に機能しています.
次に,test1.cppを選択した状態で,F5キーを押してみてください.
デバッグが始まり,下部のターミナルに「1,0」が表示されれば,launch.jsonも正常に機能しています.
ついでに,標準入力にも対応しているか確認しておきましょう.
testディレクトリに新たにtest2.cppを作り,以下のコードをコピペしてください.
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
cout << n * 2 << '\n';
}
F5のデバッグで起動して,VS Code下部ターミナルに,10と入力して,'20'と出力されたら成功です.
6. VS CodeのAI機能をオフにする
VS Codeでは,デフォルトでAIによるコード補間や,提案機能が備わっています.
公式ルールにも明言されている通り,開催中のABCコンテストでは,翻訳用途を除き,生成AIの利用を原則禁止しています.
そのため,開催中のコンテストをローカル環境のVS Codeで解く場合にはAI機能をオフにする必要があります.
.vscodeに新たにsettings.jsonを作成し,以下の内容を貼り付けてください.
{
"chat.disableAIFeatures": true
}
これにより,kyoproワークスペースでCopilotなどのAI機能をオフに出来ます.
あると便利な設定
これまでの内容で,実際に利用できる競プロのローカル環境は構築出来ました.
ここからは,私が実際に利用していく中で,追加した設定を紹介します.
既に環境自体は完成しているので,必要に応じて参考にしてみてください.
コンパイルを簡単に
現在構築した環境では,ターミナルからコンパイルするために,
g++ -std=gnu++23 test.cpp -I ~/lib/ac-library-master -o test
このように書く必要があります.
これを毎回書くのは面倒ですよね.
Ubuntu/home/(User)直下にある.bashrcファイルを編集します.
.bashrcを開いて,末尾に以下の内容を追加してください.
注意
ここでも,(User)を自分のWSLのユーザ名に変更してください!!
...
# AtCoder Library
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/home/(User)/lib/ac-library-master
# C++23 compile command
alias gpp='g++ -std=gnu++23'
# release stack limit
ulimit -s unlimited
内容は,
export ...は-I ~/lib/ac-library-masterを,
alias ...は,-std=gnu++23を省略するためのものです.
最後のulimit ...は,コンパイルとは関係ないのですが,再帰の深い問題などを解くときに,スタック上限を回避するためのものです.ついでに変更しておきましょう.
変更を保存したら,ターミナル上で,
source ~/.bashrc
を実行することで,.bashrcの変更を適用できます.
変更が正常にできていれば,以降は以下のコマンドでコンパイルができます.
gpp test.cpp -o test
テンプレートのcppファイルを使おう
ある程度競プロをやっている方は,テンプレートのcppファイルをベースにして,問題を解いている方も多いと思います.
そうでない方でも,コンテストごとにディレクトリを作って,問題ファイルを作るのは面倒.
そこで,独自コマンドを追加して快適にしましょう!
先ほどの.bashrcファイルの末尾に,さらに以下の内容を貼り付けてください.
mkabc() {
local contest="$1"
shift
local dir="$HOME/projects/kyopro/abc/abc${contest}"
local template="$HOME/projects/kyopro/template.cpp"
mkdir -p "$dir"
if [ "$#" -gt 0 ]; then
for problem in "$@"; do
cp --update=none "$template" "$dir/${contest}${problem}.cpp"
done
else
for problem in a b c d e f g; do
cp --update=none "$template" "$dir/${contest}${problem}.cpp"
done
fi
}
変更後は先ほど同様,以下のコマンドを実行して変更を反映します.
source ~/.bashrc
.bashrcの変更が出来たら,次はテンプレート用のcppファイルを作りましょう.
~/projects/kyopro直下に新たにtemplate.cppファイルを作成してください.
作成したファイルの内容は,各自のテンプレートコードにしてください.
これで,ターミナル上でmkabcコマンドが使えるようになります.
mkabcコマンドはターミナル上で,以下のように使えます.
mkabc 440
mkabc 440 c d e
mkabc 440では,指定されたコンテスト番号のファイルを作ってくれます.
abc/abc440/
├── 440a.cpp
├── 440b.cpp
├── 440c.cpp
├── 440d.cpp
├── 440e.cpp
├── 440f.cpp
└── 440g.cpp
各ファイルの中身は,template.cppのコピーとなっており,また,既に作られているファイルを上書きすることもないです.
mkabc 440 c d eでは,指定したコンテスト番号の,指定した問題のファイルだけを作ってくれます.こちらも既に存在するファイルを上書きすることはないです.
(筆者はABCしか挑んでいないのでABC用のコマンドしかありません.ARCやAGC用は別途作ってください.)
デバッグマクロを追加しよう
記事の冒頭で,**デバッグ用に表示してた配列を消し忘れてWA**というミスを例に挙げましたが,これを解決するために,template.cppに以下のテンプレを追加しました.
#ifdef LOCAL
#define debug(x) cerr << #x << " = " << (x) << '\n'
#define debugVec(v) do { \
cerr << #v << " = ["; \
for(int i = 0; i < (int)(v).size(); i++){ \
if(i) cerr << ", "; \
cerr << (v)[i]; \
} \
cerr << "]\n"; \
} while(0)
#else
#define debug(x)
#define debugVec(v)
#endif
debug(x)は,変数を入力することで,その変数の内容を表示できます.
debugVec(x)は,vector型の変数の中身を表示できます.
これらは,コンパイル時にLOCALが定義されている時のみ,使えるマクロです.
先ほどのtasks.jsonでは"-DLOCAL"を指定しているため,VS Codeからビルドした場合や,F5でデバッグした場合には表示されます.
一方で,先ほど作ったgppコマンドでは,debug(x),debugVec(x)は表示されません.
また,AtCoderでデバッグ関数を書いたまま提出しても,無視されるため,「デバッグ用の表示を消し忘れた」というミスを回避できます.
Special Thanks
この記事を書くにあたって,下記の動画を参考にさせていただきました.
投稿者の方に深く感謝します.
参考にした動画
終わりに
ここまで記事を読んでくださりありがとうございます.
質問,感想等ありましたら,コメントまでお願いします.