執筆者: 終に鮭
最終更新: 2021/04/17
これから競プロを始めるWindows10ユーザーのための、快適な競プロ環境構築の方法をまとめます。LinuxでもOKです。多分Macも大丈夫。
以下に解説する方法はWindows10以外の非UNIX系OSには対応しませんが、仮想マシンを利用するか、ネイティブの対応するアプリケーションを利用すれば問題なく環境構築はできます。
ご希望あれば他の言語やAtCoderの始め方など紹介します。筆者TwitterにDMかメンションをお願いします。
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にアップデートすることをおすすめします。
管理者としてPowerShellを起動し、次のコマンドを実行します。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
作業が完了したら、再起動します。
Win+Rキーを押して出てくるウィンドウにwinver
と入力し、バージョンが1903より古ければアップデートします。
PowerShellで次のコマンドを実行します。
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
作業が完了したら、再起動します。
ここから最新の更新パッケージをダウンロードし、インストールします。
PowerShellで次のコマンドを実行します。
wsl --set-default-version 2
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を起動して、Ctrl+Shift+X
を押して拡張機能の管理ペインを開きます。 「Japanese」で検索してJapanese Language Pack for Visual Studio Codeをインストールします。 ウィンドウ右下にメッセージが出るのでRestart
をクリックして再起動します。
まず好きな場所に競プロのプロジェクト用のディレクトリを作ります。ここではWindows側のC:\kyopro
にします。 これをVSCodeでワークスペースとして開きます(右クリックすると「Code で開く」というのがあると思うのでそれをクリック)。Ctrl+Shift+@
で統合ターミナルを開き、wsl
と入力してWSLを起動します。
テストケースの一括取得、一括テスト、提出などができるようになります。それぞれPython/pipとNode.js/npmが必要。
WSLで次のコマンドを実行します。
ここに書いてあることを要約した。
# パッケージリストをアップデート
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
を叩く必要はない)。
詳細はここ。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を使えば自動でコンテストごとにディレクトリを生成して、テストケースをダウンロードしてくれるんですが、このディレクトリにテンプレートファイルを配置することもできます。ojと連携してコードテストしたり、書いたコードをAtCoderに提出できたりします。至れり尽くせりやでほんま。
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もAtCoderの認証を通す必要があります。
oj login https://atcoder.jp
を実行し、ユーザー名とパスワードを入力します。Seleniumをインストールしろと警告が出ますが無視しても構いません。
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
で参照すればそれでよいと思います。
コンテスト中にもoj t
やacc s
を使うわけですが、 acc s
は3秒の待機と提出時の確認があり、 更に言語指定などが含まれてくると(Python3, Python2, PyPyなど)打つ時間だけ損してしまいます。
そこでエイリアスを設定して素早く打てるようにしておきます (昨日はその分時間ロスしてRated1000位を逃しました(半ギレ)。 あと9秒だけ早ければよかったのですが)
省略形がoj t
。コードテストをします。
私が使っているのは以下。ただしエイリアスはあくまで文字列置換なので、ファイル名の指定は最後でないとできません。 故に、ファイル名も変数化したければ関数として実装する必要があります。
alias oj-t-pypy="oj t -c 'pypy3 main.py'"
省略形が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++の競プロ向け環境構築について説明します。乞うご期待。
この人が書いた記事