🪡

【C++】AtCoderローカルテスト環境構築【VSCode】

2023/05/06に公開

ローカルで、C++コードのコンパイル・テストができる環境を構築しました。

2023/09/21更新:
この環境構築方法だと、いちいちコピペしてテストして提出する必要があります。
atcoder-cliとか使うともっと楽できると思いますので他サイト参考にしてください。気が向いたら書き足します。

2023/08/17更新:
AtCoderジャッジシステム変更のため、コンパイルのバージョンをC++17→C++23に変更

想定環境

Windows 11

VSCodeのインストール

未の場合、こちらのURLからインストール。
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

VSCodeのシェルをbashに変更

こちらのURLを参考に、WSLを有効にしてください。
https://www.aise.ics.saitama-u.ac.jp/~gotoh/HowToEnableWSL.html

また、Microsoft StoreからUbuntuをインストールしてください。
バージョンは何でも動作すると思います。一応、私の環境では無印Ubuntuが入っています。

次に、VSCodeで
Ctrl+Shift+P→「既定のプロファイル」で検索、クリック→「Ubuntu(WSL)」をクリック
すると、デフォルトのターミナルがbashになります。

setting.jsonには色々設定が追加されていると思います。
最後の"terminal.integrated.defaultProfile.windows": "Ubuntu (WSL)"以外は消しても差し支えないです。

    "terminal.integrated.profiles.windows": {
        "PowerShell": {// 色々書かれている
        },
        "Command Prompt": {},
        "Ubuntu (WSL)": {}
    },
    "terminal.integrated.defaultProfile.windows": "Ubuntu (WSL)",

※bashにする理由
Windows PowerShellのままだと、AtCoder Libraryを使用する場合に、コンパイルエラーが大量に出ます。
参考URL:
https://mmnkblog.hatenablog.com/entry/2020/10/22/032125
回避する方法を試しても、コードによってはエラーが出てしまうので、bashにしてしまったほうが楽だと思います。
AtCoder Libraryを使用しない場合はお好みです。個人的には何かとbashの方が便利なので、設定推奨。

bashを有効にしない場合、MinGWをインストールし、g++を有効にしてください。
こちらのURLを参考に。
https://www.javadrive.jp/cstart/install/index6.html

bashにg++をインストール

Ubuntuで、以下のコマンドを実行します。

sudo apt update
sudo apt install g++

名前解決の設定

おそらく、WSLの初期設定ではDNSがうまく動かないはずです。
インストールできない場合は、以下のコマンドで設定してから、再度行ってください。

sudo rm /etc/resolv.conf
sudo sh -c "echo 'nameserver 8.8.8.8' > /etc/resolv.conf"

コンパイルしてみる

VSCodeのワーキングディレクトリに、hello.cpp作りましょう。

hello.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << "Hello, World!" << endl;
}

以下のコマンドを、VSCodeのターミナルに打ち込んで、コンパイルします。
※ファイルが見つからない等出る場合、フォルダやファイルの場所・名前を確認してみてください。

g++ hello.cpp -std=c++23

以下のコマンドで、コンパイルしたファイルを実行します。

./a.out

「Hello, World!」が表示されたら成功です。

標準入力を読み込んで実行

in.txtを作りましょう。

in.txt
GoodBye

hello.cppを以下のように書き換えます。

hello.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    cin >> s;
    cout << s << ", World!" << endl;
}

以下のコマンドを、VSCodeのターミナルに打ち込んで、コンパイルします。

g++ hello.cpp -std=c++23

以下のコマンドで、コンパイルしたファイルを実行します。
< ./in.txtのようにすることで、in.txtを標準入力として受け取れます。

./a.out < ./in.txt

「GoodBye, World!」が表示されたら成功です。

in.txtを書き換えれば、他の標準入力も試せます。
例えば、in.txtを「Hello」に書き換えて保存したら、再度./a.out < ./in.txtを実行してみてください。「Hello, World!」が表示されます。

今後、ローカルでテストする際は、

  1. C++のコードを書く
  2. g++ ファイル名 -std=c++23でコンパイル
  3. in.txtに標準入力を書き込む
  4. ./a.out < ./in.txtでテスト実行

のように行えます。
コンパイル・実行は、ファイル保存後に行ってください。最後に保存した状態でコンパイル・実行されます。

カスタマイズ

ここからはオプションなので、気に入ったものがあれば導入してみてください。

後述しますが、最終的に私のコンパイルコマンドは以下のようにしました。

g++ $F.cpp -std=c++23 -o out.out -I /mnt/c/Users/rare/git/training-atcoder/ac-library

また、エイリアス設定で簡易に実行できるようにもしています。

実行ファイル名を指定してコンパイル

ファイル名がa.outだと、並び順が気に食わなかったので、指定します。
-oオプションを使用してください。

g++ hello.cpp -std=c++23 -o out.out

out.outはセンス無いと思うので、test.exeなどがいいですね多分。お好みで。
テスト実行する際は、./out.out < ./in.txtのように、a.outの箇所を変えるだけです。

コンパイル対象ファイルを変数化

例えば、hello.cppをコンパイルする場合、こうします。

F=hello #ファイル名を変数Fに代入
g++ $F.cpp -std=c++23

ACLを含んでコンパイル

ACLを使用する場合、-Iオプションでatcoderフォルダのパスを指定します。
ACLドキュメントにも記載あります。
https://atcoder.github.io/ac-library/document_ja/

ドキュメントより、atcoderフォルダをmain.cppと同じ場所に置いてコンパイルする場合、

g++ main.cpp -std=c++23 -I .

で良いですが、毎回atcoderフォルダをコピーするのは不便なので、
相対パスか絶対パスで指定することをお勧めします。

絶対パスについて、
WSLでは通常とパスが違います。(C:\~ではなく、/mnt/c/~となっているはず)
VSCodeのターミナルでac-libraryフォルダに行き、pwdすればパスがわかると思います。
以下は私の例です。

g++ main.cpp -std=c++23 -I /mnt/c/Users/rare/git/training-atcoder/ac-library

エイリアスの設定

Linuxのエイリアスって便利ですよね。
WSLでも設定できます。

VSCodeのターミナルで構わないので、.bashrcを編集しましょう。

vi ~/.bashrc

設定したいエイリアスを末尾とかに追記します。
私の場合、コンパイルコマンドはacc、実行コマンドはactに設定しています。
(atcoder compile, atcoder testの意味)
以下は私の例です。ここまで紹介したものを詰め込んでいます。

# g++ alias
alias acc='g++ $F.cpp -std=c++23 -o out.out -I /mnt/c/Users/rare/git/training-atcoder/ac-library'
alias act='./out.out < ./in.txt'

設定後は読み込み直しておきましょう。

source ~/.bashrc

オールカスタマイズ後のテスト手順

  1. C++のコードを書く
  2. F=ファイル名で変数Fに代入
  3. accでコンパイル
  4. in.txtに標準入力を書き込む
  5. actでテスト実行

Discussion