Edited at

競技プログラミングで問題に集中するためのtools Windows10 WSL用 「code-runner」「atcoder-tools」


競技プログラミングの便利なツール「atcoder-tools」

atcoder-toolsはサンプルコードの取得や課題の提出などを支援してくれるツールです。

しかしWindows10上からは利用できないそうです、そこでWSL(Windows Subsystem for Linux)上からこのツールを使います。

(WSLはVSCodeからでも簡単に利用できるようになりました。)


環境

Windows10

WSL(indows Subsystem for Linux)

VScode


便利なtool群

code-runner

https://github.com/formulahendry/vscode-code-runner

Remote - WSL

https://github.com/Microsoft/vscode-remote-release

kyuridenamida/atcoder-tools: Convenient modules & tools for AtCoder users, written in Python 3.5

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

AtCoder Tools Documentation

https://kyuridenamida.github.io/atcoder-tools/#/


WSLのC++環境

WSLインストール後

sudo apt update

sudo apt upgrade

sudo apt install build-essential

sudo apt install gdb

コンパイラのバージョン

gcc --version

デバッガのバージョン

gdb --version

VSCodeのインストール

VSCodeのエクステンションのインストール


  • C/C++

  • C++ Intellisense

  • Code Runner

  • CMake

  • CMake Tools

  • Bracket Pair Colorizer

  • Settings Sync


code-runner


Code-Runner実行コマンド1個での設定

settings.jsonに追加


settings.json

{

"terminal.integrated.shell.windows": "C:\\Windows\\System32\\wsl.exe",
"code-runner.runInTerminal": true,
"code-runner.saveAllFilesBeforeRun": true,
"code-runner.saveFileBeforeRun": true,
"code-runner.terminalRoot": "/mnt/",
"code-runner.executorMap": {
"cpp": "cd $dir && g++ -std=c++11 -Wall -pedantic \"$fileName\" -o \"$fileNameWithoutExt.out\" && $dir\"$fileNameWithoutExt.out\""
// https://qiita.com/janus_wel/items/07140fcd1127b568087d
// -std=c++11 対象ソースが C++11 準拠としてコンパイルする
// -Wall 基本的な警告オプションを on にする
// -pedantic ISO C/C++ に存在しない文法を警告する
}
}


VSCodeのsettings.jsonに専用のコマンド

"code-runner.terminalRoot": "/mnt/"

を追加することでWSLにアクセスできるようになります。

code-runner.executorMapを競技プログラミング用に書き換えます。

(※テストケースはダウンロード済みであること、コメントアウトして切り替えると楽になります。)

code-runner.executorMapのカッコ内を書き換えます。


実行コマンドを2つに増やす。

テスト用と提出用に実行コマンドを2つに増やします。

cpp実行用のコマンドとcode-runnerの機能の一つであるカスタムコマンドの2つを利用します。

これで同じ拡張子でも2つの実行方法で使い分けられます。

キーボード-ショートカットに

デフォルトの言語の実行コマンドとカスタム実行コマンドをそれぞれ割り当てます。



"code-runner.customCommand": "cd $dir && g++ -std=c++11 -Wall -pedantic \"$fileName\" && atcoder-tools submit -u"

-u すでに提出済みでももう一度提出できるようにするオプション


Code-Runner実行コマンド2個での設定

settings.jsonに追加


settings.json

{

"code-runner.runInTerminal": true,
"code-runner.saveAllFilesBeforeRun": true,
"code-runner.saveFileBeforeRun": true,
"code-runner.terminalRoot": "/mnt/",
"code-runner.customCommand": "cd $dir && g++ -std=c++11 -Wall -pedantic \"$fileName\" && atcoder-tools submit -u",
"code-runner.executorMap": {
"cpp": "cd $dir && g++ -std=c++11 -Wall -pedantic \"$fileName\" && atcoder-tools test"
// https://qiita.com/janus_wel/items/07140fcd1127b568087d
// -std=c++11 対象ソースが C++11 準拠としてコンパイルする
// -Wall 基本的な警告オプションを on にする
// -pedantic ISO C/C++ に存在しない文法を警告する
},
}


現在のショートカットの設定では下記のように割り当てています。

Run Codeに ctrl+1

Run Custom Commandに ctrl+2


atcoder-tools

入力を自動生成

kyuridenamida/atcoder-tools: Convenient modules & tools for AtCoder users, written in Python 3.5

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

インストール

sudo pip3 install atcoder-tools

chromeの拡張機能

Tampermonkey

https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo

スクリプト

https://kyuridenamida.github.io/atcoder-tools/index.user.js

このスクリプトをインストール済みであると、at-coderの問題ページに行くと解析されたスニペットが埋め込まれています。



ABC120のD問題

https://atcoder.jp/contests/abc120/tasks/abc120_d

を訪れるだけでいい。

(対応言語 C++ Java Rust Python3)


HOMEのアクセスしづらい問題

WSLのHOMEはCドライブの奥深いところにあるので

普段使用していたり、アクセスしやすい場所に変更します。

ホームの変更

sudo vim /etc/passwd


/home/ユーザ名

/mnt/d/普段使用している場所
に変更する。
/d/はドライブ名

pwdコマンドでHOMEが変更されたかどうか確認します。


atcoder-tools使用方法

atcoder-tools gen コンテストid

例1

atcoderのABCコンテスト137回

基本形

sudo atcoder-tools gen ABC137

例2

configファイルを利用した例

sudo atcoder-tools gen ABC137 --config /mnt/d/2019/pg/atcodertools.toml


atcodertoolsの設定ファイル

atcodertools.toml


tomlとは

設定ファイル記述言語 TOML - Qiita

https://qiita.com/b4b4r07/items/77c327742fc2256d6cbe

GitHub の中の人が提案した、設定ファイルを記述するための小さな言語です。


自動生成機能がついたテンプレートファイル

my_template.cpp

※優先順位

コマンドライン>設定ファイル内

sudo atcoder-tools gen ABC136 --workspace /mnt/d/2019/pg/ABC/131-140 --config /mnt/d/2019/pg/atcodertools.toml

workspace_dirをこのようにコマンドライン上で追加した場合設定ファイル内の設定よりも優先されて使用されます。


atcodertools.toml

[codestyle]

indent_type = 'space'
indent_width = 4
workspace_dir = '/mnt/d/2019/pg/ABC/'
lang = 'cpp'
template_file='/mnt/d/2019/pg/my_template.cpp'
[etc]
download_without_login=false
parallel_download=false
save_no_session_cache=false


※わかりやすい設定だけ利用しました。

[postprocess]

exec_on_each_problem_dir='clang-format -i ./*.cpp'
exec_on_contest_dir='touch CMakeLists.txt'

※この設定とかよくわかりません。


my_template.cpp

#include <bits/stdc++.h>

using namespace std;

// 総数を1000000007で割った余り
const long long mod = 1e9 + 7;

using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define ull unsigned long long
#define ld long double
#define vi vector<int>
#define vll vector<ll>
#define vc vector<char>
#define vs vector<string>
#define vpii vector<pii>
#define vpll vector<pll>

#define rep(i, n) for (int i = 0, i##_len = (n); i < i##_len; i++)
#define rep1(i, n) for (int i = 1, i##_len = (n); i <= i##_len; i++)
#define repr(i, n) for (int i = ((int)(n)-1); i >= 0; i--)
#define rep1r(i, n) for (int i = ((int)(n)); i >= 1; i--)

#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()

#define SORT(v, n) sort(v, v + n);
#define VSORT(v) sort(v.begin(), v.end());
#define RSORT(x) sort(rall(x));
#define pb push_back
#define mp make_pair

#define INF (1e9)
#define PI (acos(-1))
#define EPS (1e-7)

ull gcd(ull a, ull b) { return b ? gcd(b, a % b) : a; }
ull lcm(ull a, ull b) { return a / gcd(a, b) * b; }

{% 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 func({{ formal_arguments }}){

}
{% endif %}

int main(){
ios::sync_with_stdio(false);
cin.tie(0);
// cout << fixed << setprecision(5);

{% if prediction_success %}
{{input_part}}
func({{ actual_arguments }});
{% else %}
// Failed to predict input format
{% endif %}
return 0;
}



aliasの設定

コマンド+atcoderABC開催番号で事前準備をするコマンドを作る。

WSLの設定

#HOMEのpath

export PATH=$PATH:/mnt/d/2019/pg
#シェルファイルの収納場所
export PATH=$PATH:/mnt/d/2019/pg/sh

alias abc='atcodertools.sh'

ターミナルを立ち上げる時に設定を反映させる

source ~/.bashrc


シェルファイルを作る

シェルファイルの収納場所

/mnt/d/2019/pg/sh


atcodertools_gen.sh

number=$1

sudo atcoder-tools gen ABC${number} --config /mnt/d/2019/pg/atcodertools.toml


atcodertools_submit.sh

execfile=$1

sudo atcoder-tools submit --unlock-safety --exec ./${execfile}.out

/mnt/d/2019/pg/ABC/

このpathはABCコンテストのソース等を入れるフォルダpath


シェルの実行

abc [コンテスト開催番号]

例 atcoder ABCコンテスト135回の場合

abc 135

※取得できない場合1.5秒間隔で繰り返ししてくれるので、コンテスト開催時間の直前に実行しておくと便利です。


その他

atcoder-tools test

カレント・ディレクトリ上に実行ファイルと入出力(in_.txt, out_.txt)がある状態で実行するとローカルテストを行います。

atcoder-tools submit

カレント・ディレクトリ上で実行すると対応する問題がサンプルに通る場合ソースコードを提出します。既にAtCoder上にその問題に対する提出がある場合、-uを指定しないと提出できないようになっています。

デフォルトのconfigの場所

C:\Users\ユーザー名\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\usr\local\lib\python3.6\dist-packages\atcodertools\tools

atcodertools-default.toml

この設定ファイルはworkspace_dir等を設定できます。

デフォルトのtemplateの場所

C:\Users\ユーザー名\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\usr\local\lib\python3.6\dist-packages\atcodertools\tools\templates

atcodertools-default.toml

default_template.cpp

これら設定ファイルを最初はHOMEにコピーを置いて微調整していきます。

コピーする時、自分用のファイルだとわかるように適当に名前を変えておきます。

default_template.cpp => my_template.cpp

(途中)


zshへの変更

zshを利用してみます。

ダウンロード

sudo apt-get install zsh

git clone https://github.com/zsh-users/zsh-completions ~/.oh-my-zsh/custom/plugins/zsh-completions

curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh

インストール

sudo chsh -s $(which zsh)

#HOMEのpath

export PATH=$PATH:/mnt/d/2019/pg
#シェルファイルの収納場所
export PATH=$PATH:/mnt/d/2019/pg/sh

#エイリアス
alias abc='atcodertools_gen.sh'
alias sub='atcodertools_submit.sh'

設定を反映させます。

source ~/.zshrc

エイリアスで

abc 137

とコマンドを実行することでコマンドを短く出来ます。


参考URL&この後やること

C#+VS Code でAtCoder やってみる(準備編) - Qiita

https://qiita.com/wishangel@github/items/c79356357c8d20323d5d

競技プログラミングのための補助ツールを作った - うさぎ小屋

https://kimiyuki.net/blog/2017/01/19/pr-online-judge-tools/

kmyk/online-judge-tools: Tools for online judge services. Downloading sample cases, Testing/Submitting your code, and various utilities.

https://github.com/kmyk/online-judge-tools

AtCoderのサンプルケースを自動でテストさせてみる(Win10&C++) - Qiita

https://qiita.com/dasiita08/items/4364a7a7adc700876e03

kyuridenamida/atcoder-tools: Convenient modules & tools for AtCoder users, written in Python 3.5

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

online-judge-tools · PyPI

https://pypi.org/project/online-judge-tools/