💭

Dockerを使ったRustのAtCoder環境構築

2023/08/30に公開

RustでAtCoderを始めようと思い環境構築をしたので、そのメモ。

DockerでRustの環境を構築する手順

cargo-competeが便利そうだったので導入しました。

Docerfileの作成

RustのバージョンはAtCoderと合わせました。

Dockerfile
FROM rust:bullseye

RUN cargo install cargo-compete \
    && rustup install 1.42.0 \
    && rustup default 1.42.0

composeファイルの作成

composeファイルは無くてもいいのですが、volumeやコンテナの中に入って作業しやすいように書きました。

compose.yaml
services:
  abc:
    build: .
    tty: true
    volumes:
      - ./:/work
    working_dir: /work

Dockerイメージのビルドと起動

docker compose up -d

AtCoderの問題を解くための設定

cargo-competeを使うための設定をします。

初期化

cargo compete init atcoder

選択肢が出てきたら2を選択します。

login

cargo compete login atcoder

usernameとpasswordを入力。

テンプレートの編集

ファイルを生成するときのテンプレートを設定できます。
compete.tomlの23行目あたりに書いてあります。

compete.toml
[template]
src = '''
fn main() {
    todo!();
}
'''

最初はこの様になっているので適宜変更しましょう。

よく使うコマンド

プロジェクトを作成してAtCoderのページを開く

--openとつけることで問題のページも開いてくれるようになります。

cargo compete new --open abc081

以下のようなディレクトリ構造になっています。

abc163
├── src
│   └── bin
│       ├── a.rs
│       ├── b.rs
│       ├── c.rs
│       └── d.rs
├── testcases
├── Cargo.lock
└── Cargo.toml

特定の問題だけのプロジェクトにしたい時は --problemsとつけます。

以下の例ではaとbの問題だけです。

cargo compete new --problems a b --open abc081

テストを実行

cargo compete test a

テストして提出する

cargo compete submit a

addコマンドを使えるようにする(追記)

プロジェクトを作成する際に問題を指定したとき(--problems)に、あとから問題を追加できるようにします。

compete.tomlを開いて以下を追加してください。

compete.toml
[add]
url = 'https://atcoder.jp/contests/{{ args[0] }}/tasks/{{ args[0] }}_{{ args[1] }}'
bin-name = '{{ args[0] }}-{{ args[1] }}'
bin-alias = '{{ args[1] }}'
bin-src-path = 'src/bin/{{ bin_alias }}.rs'

問題を追加する

追加したいプロジェクトに移動して一問ずつ追加してください。

cd abc081
cargo compete add abc081 c

参考にした記事

Discussion