RustでAtCoderに参加するための環境を構築しました
事の発端
Rustを書きたいけど手頃な題材が思い付かないなーというのと、そういえば競技プログラミングってどんな感じなんだろう? というのが合わさってRustでAtCoderに参加してみる事にしました。
そうとなればまずは競技環境の構築です。普段はVS Codeを使っているのと、依存関係等はコンテナ内に押し込めたいのでDev Containerを使う事にしました。
作ったもの
Dev Container内にRustツールチェーンとcargo-competeがインストールされるようにしたものを作りました。今年の9月頃に移行されたAtCoderの新ジャッジシステム(Rust 1.70.0)環境に対応しています。
使い方
(当たり前ですが)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)では新ジャッジシステムに対応していないようなのでこの辺を参考に、必要に応じてご自身でファイルを書き換えて下さい。ジャッジシステムにインストールされているライブラリは下記で言及されています。
セットアップが完了したらcargo compete new コンテスト名(e.g. abc086)
で雛形を作って問題を解いていきましょう。
cargo-competeの使い方は公式ドキュメントを参照して下さい。
cargo-competeの薄いラッパー
cargo-competeはスペル的にシェルでの補完がやりづらいと感じたので、Dev Container内にはatcoder
というcargo-competeの薄いラッパースクリプトを同梱してパスを通しています。
やっている事は受け取った引数をほぼそのままcargo compete
に渡しているだけですが、念のためREADMEに目を通す事をおすすめします。
(これは気持ち分かるなぁと思ったのでラッパー側で手当てしています)
補足等
- BashのhistoryはDev Containerを再ビルドしても保持されるようにしています
- Zshも同じ手法(
HISTFILE
にworkspaceFolderを指定)で保持できる...と思ったら何故か出来ないのでこちらは何もケアをしてません
- Zshも同じ手法(
- コンテナ内の環境をカスタマイズしたい場合は下記の機能が役に立つかもしれません
最後に
元々は旧ジャッジシステムで採用されていたRust 1.42.0を手元の開発環境であるAppleシリコンなmacOSにインストールする事が(たぶん)できない事に加え、cargo-competeやrust-analyzerのインストールにもいくつかの工夫が必要だった(Rustのバージョンが古すぎて)ので諸々をDev Containerに押し込むというのが主旨になる予定でした。
が、これを作った翌週くらいにジャッジシステムがアップデートされ、工夫していた諸々が不要になった現在では手元の環境を汚さない事くらいしかメリットが無くなってしまいました。
そういう訳で、あまり需要は無さそうですが供養という事で記事にしておきます。
Discussion