🦀

RustでAtCoderに参加するための環境を構築しました

2023/10/25に公開

事の発端

Rustを書きたいけど手頃な題材が思い付かないなーというのと、そういえば競技プログラミングってどんな感じなんだろう? というのが合わさってRustでAtCoderに参加してみる事にしました。

そうとなればまずは競技環境の構築です。普段はVS Codeを使っているのと、依存関係等はコンテナ内に押し込めたいのでDev Containerを使う事にしました。

作ったもの

Dev Container内にRustツールチェーンとcargo-competeがインストールされるようにしたものを作りました。今年の9月頃に移行されたAtCoderの新ジャッジシステム(Rust 1.70.0)環境に対応しています。

https://github.com/nyuyuyu/atcoder-rust-vscode-devcontainers

使い方

(当たり前ですが)VS CodeとDockerが動く環境が前提です。

Dev Containerの構築

上記のリポジトリはテンプレートリポジトリなのでこれを元に新規リポジトリを生成してお手元にクローンして下さい。クローンしたディレクトリをVS Codeで開くとDev Containerで開き直す?と聞かれると思うので開き直して下さい。(ダイアログが出ない/閉じてしまった場合はコマンドパレットのDev Containers: Open Folder in Container...で開き直せます)

初回はコンテナのビルドが実行されるので少し待たされます。気長にお待ち下さい。

ビルドが終わるとVS Code内のターミナルがコンテナに接続されるようになります。更にrust-analyzerとそれを扱うVS CodeのExtensionも自動でインストールされるのでこの段階でコードを書き始める事が可能です。

cargo-competeのセットアップ

cargo-competeはコンテストへの参加や雛形コードの生成、簡単なテストやコードの提出をCLIで実行できる便利なプログラムです。これを使う場合はドキュメントに従って初期セットアップをして下さい。ただし、cargo compete initが生成するファイルが現時点(2023/10/25)では新ジャッジシステムに対応していないようなのでこの辺を参考に、必要に応じてご自身でファイルを書き換えて下さい。ジャッジシステムにインストールされているライブラリは下記で言及されています。

https://img.atcoder.jp/file/language-update/language-list.html

セットアップが完了したらcargo compete new コンテスト名(e.g. abc086)で雛形を作って問題を解いていきましょう。

cargo-competeの使い方は公式ドキュメントを参照して下さい。

cargo-competeの薄いラッパー

cargo-competeはスペル的にシェルでの補完がやりづらいと感じたので、Dev Container内にはatcoderというcargo-competeの薄いラッパースクリプトを同梱してパスを通しています。

やっている事は受け取った引数をほぼそのままcargo competeに渡しているだけですが、念のためREADMEに目を通す事をおすすめします。

(これは気持ち分かるなぁと思ったのでラッパー側で手当てしています)

補足等

最後に

元々は旧ジャッジシステムで採用されていたRust 1.42.0を手元の開発環境であるAppleシリコンなmacOSにインストールする事が(たぶん)できない事に加え、cargo-competeやrust-analyzerのインストールにもいくつかの工夫が必要だった(Rustのバージョンが古すぎて)ので諸々をDev Containerに押し込むというのが主旨になる予定でした。

が、これを作った翌週くらいにジャッジシステムがアップデートされ、工夫していた諸々が不要になった現在では手元の環境を汚さない事くらいしかメリットが無くなってしまいました。

そういう訳で、あまり需要は無さそうですが供養という事で記事にしておきます。

Discussion