トップ画像
競プロ環境構築#1 共通編

執筆者: 終に鮭

最終更新: 4/17/2021

これから競プロを始めるWindows10ユーザーのための、快適な競プロ環境構築の方法をまとめます。LinuxでもOKです。多分Macも大丈夫。
以下に解説する方法はWindows10以外の非UNIX系OSには対応しませんが、仮想マシンを利用するか、ネイティブの対応するアプリケーションを利用すれば問題なく環境構築はできます。

記事情報

  • 記事作成日:2021-03-10
  • 最終更新日:2021-04-17


シリーズツリー

  1. ここ
  2. C/C++編
  3. Python編(予定)

ご希望あれば他の言語やAtCoderの始め方など紹介します。筆者TwitterにDMかメンションをお願いします。

Windows10にWSL2を導入する

Windows10にはWindows Subsystem for Linux(WSL)という便利な機能が備わっています。WSL2は本物のLinuxカーネルを使用することにより、ネイティブのLinuxと高い互換性を持ちます。 AtCoderのジャッジ環境も恐らくLinuxなので、なるべく環境を寄せるためにも導入します (2019/7からの言語アップデートの資料から、Ubuntu 18を使っているらしい。 GCCも10に更新されていないあたり、恐らく執筆時点では環境は変わっていない)。コンパイラなどの環境が既存の環境と競合すると面倒なので利用するという理由もあります。
具体的な導入方法はこのリンク先を見てもらったほうが早いです。 執筆中に初めて知ったんですが、Windows Insider Programに参加していればコマンド一つでインストールが完了するらしく驚き。 Windows10の不安定さにはイライラしているので、私は絶対参加したくないんですけど。今日もネットに繋がらなくてWindows Updateしたし

導入手順

以下の導入手順は前述のリンク先のx64マシン向けの要約です。詳細はリンク先を確認してください。また、この手順に従いいかなる損害等が発生しても、筆者は一切の責任を負いません。
WSL1をインストール済みの方も、WSL2にアップデートすることをおすすめします。

「Linux 用 Windows サブシステム」機能を有効化する

管理者としてPowerShellを起動し、次のコマンドを実行します。

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

作業が完了したら、再起動します。

Windows10を更新する

Win+Rキーを押して出てくるウィンドウにwinverと入力し、バージョンが1903より古ければアップデートします。

「仮想マシン プラットフォーム」機能を有効化する

PowerShellで次のコマンドを実行します。

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

作業が完了したら、再起動します。

WSL2 Linuxカーネルを更新する

ここから最新の更新パッケージをダウンロードし、インストールします。

WSLの標準バージョンを2に設定する

PowerShellで次のコマンドを実行します。

wsl --set-default-version 2

Linuxディストリビューションをインストールする

Microsoft Storeから好きなディストリビューションを選びインストールします。今回は情報も多く、比較的新しいUbuntu 20.04 LTSをインストール。

起動する

スタートメニューから起動します。UNIXユーザー名とパスワードの設定が求められるので、設定します。
とりあえずこれでインストール完了です。Windows Terminalの導入は必須ではないので飛ばします(どうせVSCodeから叩くし)。

テキストエディタを導入する

競プロでは原則、すべてのプログラムはシングルファイルです。その都合上、「プロジェクトを管理する」スタイルのIDEとは相性が悪いです(勝手に連結してコンパイルしてしまったり、main関数が複数あって怒られたり)。
もちろんお好きなものを使っていただいて構わないんですが、おすすめはMicrosoftのVisual Studio Codeです。 拡張機能が充実していて、これ一つで大抵の言語に対応できます。私が普段使いしているのもこれです(「競プロ エディタ」でGoogle検索すると上位はVSCodeがほとんど)。余談ですが記事もこれで執筆しています。
これはWindows側にインストールすればOKです(むしろWSLはX Window Systemを自分でインストールしないと使えないのでWSL側にインストールして使うのは割と手間)。

VSCodeを日本語化する

VSCodeを起動して、Ctrl+Shift+Xを押して拡張機能の管理ペインを開きます。 「Japanese」で検索してJapanese Language Pack for Visual Studio Codeをインストールします。 ウィンドウ右下にメッセージが出るのでRestartをクリックして再起動します。

VSCodeのターミナルからWSLを開く

まず好きな場所に競プロのプロジェクト用のディレクトリを作ります。ここではWindows側のC:\kyoproにします。 これをVSCodeでワークスペースとして開きます(右クリックすると「Code で開く」というのがあると思うのでそれをクリック)。
Ctrl+Shift+@で統合ターミナルを開き、wslと入力してWSLを起動します。

online-judge-toolsとatcoder-cliを導入する

テストケースの一括取得、一括テスト、提出などができるようになります。それぞれPython/pipとNode.js/npmが必要。
WSLで次のコマンドを実行します。

online-judge-toolsのインストール

ここに書いてあることを要約した。

# パッケージリストをアップデート
sudo apt update

# Pythonを使う予定があればなるべくAtCoderのバージョンと同じものを
# なければ最新でよい
sudo apt install python3.8 python3-pip

# Pythonとpipのインストールをチェック
python3 -V
pip3 -V

pip3 install --upgrade pip
pip3 install online-judge-tools

# ojのインストールをチェック
oj --version

online-judge-toolsのバージョンが出れば成功。
パスが通っていないと怒られた場合は、

find / -name oj 2> /dev/null

を実行してojの置かれている場所(実行ファイルの親ディレクトリのパス。筆者が試すと/home/[USERNAME]/.local/binであった)を確認した後、

echo 'export PATH="/home/[USERNAME]/.local/bin:$PATH"' >> ~/.bashrc

~/.bashrcファイルに追記する。

source ~/.bashrc

~/.bashrcを読み込み、再びojのバージョンを確認する(次回以降のWSL起動時はsourceを叩く必要はない)。

atcoder-cliのインストール

詳細はここ。WSLを利用する場合はLinux向けのガイドを読んでください。あちらではapt-getを使っていますが、aptのほうがいいらしいのでDebian/Ubuntu系ではaptに読み替えましょう。
npmチーム非推奨の方法
!!!以下にある方法は非推奨なので更に下にあるほうを使ってください!!!

sudo apt update

# Node.jsとnpmをインストール
sudo apt install nodejs npm

# Node.jsとnpmのインストールをチェック
node -v
npm -v

npm install -g npm
npm install -g atcoder-cli

# accのインストールをチェック
acc -v

2021-03-12追追記: この方法(apt)でnpmをインストールした場合、npm install -gにはやはりsudoが必要なようです(ちゃんと検証してから情報を世に出しなさい)。
そこで、npmチームはnvmのようなNodeバージョン管理ツールを利用することを推奨しています。[1]
そんなわけで改めてNode.jsとnpmの導入方法を説明します。

# 公式スクリプトでnvmをインストールする
# 環境によってはwgetもインストールが必要
# curlを使ってもよい
wget 'https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh' -O - | bash

# nvmを環境変数に登録する
# 上記スクリプトによって実はできているので
# ~/.bashrcを再読込すればOK 
# シェルの再起動でもよい
source ~/.bashrc

# インストールのチェック
nvm -v

# nodeとnpmをインストールする
nvm install node

# インストールのチェック
nvm ls
node -v
npm -v

これでそれぞれバージョンが出ればnvm、Node.js、npmのインストールは成功です。
[1] Downloading and installing Node.js and npm | npm Docs https://docs.npmjs.com/downloading-and-installing-node-js-and-npm

We strongly recommend using a Node version manager like nvm to install Node.js and npm.

そしてatcoder-cliのインストール

npm install -g atcoder-cli
acc -v

atcoder-cliのバージョンが出れば成功。
2021-03-12追記:
npmにsudoをつけていましたがどうもPowerShellの改行コードの問題だったらしく、LFならばsudoをつけなくても正しく実行できるようです。 色々と不便なのでGit for Windowsを導入して、

"terminal.integrated.shell.windows": "C:/Program Files/Git/bin/bash.exe",

と設定に書き加え、Git Bashを使えば良いかなと思います。
2021-03-12追追記: nvmでインストールすればなぜか解決されました。やったぜ。

atcoder-cliの設定

atcoder-cliを使えば自動でコンテストごとにディレクトリを生成して、テストケースをダウンロードしてくれるんですが、このディレクトリにテンプレートファイルを配置することもできます。ojと連携してコードテストしたり、書いたコードをAtCoderに提出できたりします。至れり尽くせりやでほんま。

ojのパスを設定

acc check-oj

online-judge-tools is available. と出力されればこの項は終了です。
online-judge-tools is not available.と出力された場合、

find / -path "/mnt/c/*" -prune -o -name oj -print 2> /dev/null

でojの場所を探し(筆者の場合/home/[USERNAME]/.local/bin)、

acc config oj-path /home/[USERNAME]/.local/bin/oj

で登録します。再びacc check-ojでチェックして出れば成功です。

テストケースの配置されるディレクトリ名を変更する

ojは指定がなければtest/ディレクトリに配置されたテストケースを認識しますが、なぜかaccはtests/ディレクトリにテストケースをダウンロードするので、このディレクトリ名を変更します。

cd `acc config-dir`

config.jsonが配置されたディレクトリに移動します。
VimやEmacsなどの適当なテキストエディタでconfig.jsonを開き、該当行を次のように編集します。

"default-test-dirname-format": "test"

テンプレートを配置する

cd `acc config-dir`

config.jsonが配置されたディレクトリに移動します。
ここにディレクトリを作成します。ディレクトリ名は言語名にすれば良いと思います。以下はC++の場合の例です。

mkdir cpp

移動して、テンプレートファイルを配置します。

cd cpp
touch main.cpp
# main.cppを編集する

accに対してこれがテンプレートであることを伝えるため、template.jsonファイルを作成します

touch template.json
# template.jsonを編集する

次のように書きます。当然ですが作成したファイル名に応じて適宜変えてください。

{
 "task": {
  "program": ["main.cpp"],
  "submit": "main.cpp"
 }
}

config.jsonが配置されたディレクトリにcd ..で戻り、該当行を作成したディレクトリ名に変更します。

"default-template": "cpp"

使ってみる

言語に関係ない部分のインストール作業は大体終わりです。それではaccを実際に使ってみましょう。

ディレクトリの生成とテストケースのダウンロード

例えばABC088のD問題のテストケースをダウンロードするとします。

acc new abc088

上記のコマンドを入力するとログインが求められるので、AtCoderのユーザー情報を入力します。
次に上下キーとスペースキーを使って問題を選びます。選んだらEnterを押して待ちます。
完了したら、ディレクトリを開きます。ディレクトリ./abc088/dができているはずです。テンプレートを設定した場合、その中にテンプレートファイルがコピーされています。

コードテスト

コードを書き終えたら、コードテストします。

コンパイラ言語の場合

コンパイラ言語の場合はコンパイルしてa.outファイルに書き出します。そして、

oj t

を実行すればコードテストが行われます。

インタプリタ言語の場合

a.outファイルを作れない場合、-cオプションをつけて実行します。ただし、標準入出力に対応している環境(Node.js等の場合は/dev/stdinを読み込める環境)でなければなりません。
例えばPython3でmain.pyをテストしたい場合は

oj t -c 'python3 main.py'

を実行します。

その他のオプション

問題によっては、

絶対誤差または相対誤差が $10^{-6}$ 未満であれば正解とする

といった場合があります。このような場合は-eオプションを指定します。上記の場合は、

oj t -e 1E-6

のようにします。もちろん-cオプションと組み合わせることも可能です。
他にもいくつかオプションがありますが、oj -hで確認できます。

提出

ojを使えばブラウザを使わずに問題を提出できます。さらに、accを経由すればURLの指定も不要です。

ojへのログイン

ojもAtCoderの認証を通す必要があります。

oj login https://atcoder.jp

を実行し、ユーザー名とパスワードを入力します。Seleniumをインストールしろと警告が出ますが無視しても構いません。

accで提出

accで生成された問題のディレクトリ(今回はabc088/d)に移動し、

acc s main.py

のように提出するファイルを指定します。しばらく待つと

Are you sure? Please type "abcd"

のように表示されるので、提出してよければそのとおりに(abcdと入力して)、提出したくない場合はそのまま何も入力せずにReturnキーを押します。
本来はここでブラウザが起動して、ジャッジ結果を見られるのですが、私の環境はイカれてるらしく提出から7分も経ってやっとChromeに結果が出ました。アホか?
2021-03-12追記: Ubuntuごとここに書いてる方法でインストールし直したら 割とすぐにブラウザが出るようになったので、気にしないでください。
まあ提出結果のページのURLはターミナルに出るので、 あまりに長いようならCtrl+Cで強制停止して、 URLをAlt+Clickで参照すればそれでよいと思います。

エイリアスの設定(2021-03-14追記)

コンテスト中にもoj tacc sを使うわけですが、 acc sは3秒の待機と提出時の確認があり、 更に言語指定などが含まれてくると(Python3, Python2, PyPyなど)打つ時間だけ損してしまいます。
そこでエイリアスを設定して素早く打てるようにしておきます (昨日はその分時間ロスしてRated1000位を逃しました(半ギレ)。 あと9秒だけ早ければよかったのですが)

oj test

省略形がoj t。コードテストをします。
私が使っているのは以下。ただしエイリアスはあくまで文字列置換なので、ファイル名の指定は最後でないとできません。 故に、ファイル名も変数化したければ関数として実装する必要があります。

alias oj-t-pypy="oj t -c 'pypy3 main.py'"

acc submit

省略形がacc s。AtCoderにコードを提出します。
私が使っているのは以下。ただしエイリアスはあくまで(ry
ハイフン2個--で区切ると、それより左はacc sのオプション、右はoj sのオプションになります。
詳細はacc s --help及びoj s --helpで確認できます。

alias acc-s-pypy='acc s main.py -- -l 4047 -w 0 -y'

次回予告

次回はC/C++の競プロ向け環境構築について説明します。乞うご期待。

取得に失敗しました

2020年度 入部

Twitter GitHub YouTube