Tools

Rustで始めるAtCoder入門

はじめに

こんにちは。フロントエンドエンジニアなんもわからない浦丸です。
最近小旅行にハマっています。先週仙台に二郎を食べに行きました。個人的にここは麺がめちゃくちゃウマくて好きです。

みなさん、AtCoderやってますか?
AtCoderは、ある課題をプログラミングで解いてその正確性と速度を競うとても競技性の高い楽しいコンテストです。(ちょっと前までは)
AtCoderにはレートが存在し、コンテストの順位に応じてレートが変化しレート帯によって、下から灰、茶色、…、赤、任意の色という風に色分けされています。色が暖色に近づけば近づくほどちやほやされます。

私は学生時代、研究室でAtCoderを勧められて緑までレートを上げましたが、入社以降は手つかずでした。最近研究室の方で緑や水色の後輩たちが増えてきており、煽られが発生したため負けず嫌いが発動してしまいました。
ということで今回は、リハビリもかねて以前から興味のあったRustでAtCoderに入門していきます。
Dockerを使用したRustの環境構築、自動テストや提出まで備忘録として残していきます。

前提

  • AtCoderのアカウントを作成済み
  • Docker Desktopがインストール済み

環境構築

検証環境

  • OS:Windows 11 Pro 25H2
  • Docker:(最新版)
  • Rust:rustc 1.89.0

DockerでRustの環境構築

適当なディレクトリ上で、作業用フォルダを作成します。

mkdir atcoder-rust-docker
cd atcoder-rust-docker

atcoder-rust-docker直下にDockerfileを以下の内容で作成します。

FROM rust:1.89-bullseye

RUN apt-get update && apt-get install -y --no-install-recommends \
    git curl ca-certificates pkg-config libssl-dev \
    vim-tiny \
    && rm -rf /var/lib/apt/lists/*

RUN cargo install cargo-compete --locked

WORKDIR /work

起動を簡単にするためにMakeFileを作成しておきましょう。atcoder-rust-docker直下にMakefileを以下の内容で作成します。

IMAGE := atcoder-rust
CONTAINER := atcoder-rust-cp
WORKDIR := /work

.PHONY: build create shell start stop rm

build:
	docker build -t $(IMAGE) .

create:
	docker run -it --name $(CONTAINER) -v "$$(pwd):$(WORKDIR)" $(IMAGE) bash

start:
	docker start $(CONTAINER)

shell:
	docker exec -it -w $(WORKDIR) $(CONTAINER) bash

stop:
	docker stop $(CONTAINER)

rm:
	docker rm $(CONTAINER)

makeコマンドを使用し、docker buildしてコンテナに入りましょう。

make build
make create

cargo-completeの設定

このままでもコンテストに挑むことはできますが、テストや提出周りで利便性を上げるためにツールを導入しましょう。導入するツールはcargo-completeです。
https://github.com/qryxip/cargo-compete

コンテナ内で以下のコマンドを実行します。terminal上で1~3を選択させられるため、2を選択すると、.cargo/config.toml, compete.toml, template-cargo-lock.tomlが生成されます。

cargo compete init atcoder

生成されたcompete.tomlが古い状態なので、3か所編集します。
editionは2021, toolchainは1.89.0, language_idは6088に修正してください。

AtCoderへのログイン

ツール上でテストや提出を完結させるために、atcoderへログインします。
ログインにはcargo complete login atcoderか、cookies.jsonlを書き換える方法の2通りがありますが、前者はreCAPTCHAの影響でうまくいかないようなので、後者でログインします。

まずはブラウザ上でAtCoderへログインし、cookieにREVEL_SESSIONを保存します。普通にログインすればokです。
https://atcoder.jp/login
その後、ブラウザの開発者ツールからREVEL_SESSIONクッキーを取得します。

cookies.jsonlを指定場所に作成し、編集します。

mkdir -p ~/.local/share/cargo-compete
vi ~/.local/share/cargo-compete/cookies.jsonl

cookies.jsonlはこれです。REVEL_SESSIONのxxxの部分は先程取得した値で上書きします。

{"raw_cookie":"REVEL_SESSION=xxx; HttpOnly; Secure","path":["/",true],"domain":{"HostOnly":"atcoder.jp"},"expires":{"AtUtc":"2026-08-19T11:26:06Z"}}

実際にテストと提出をしてみる

ここまでで、テストと提出までの環境作成を行いました。ここからは実際に提出してみます。
今回は最近行われたabc445のA問題を実際に解いてみます。
https://atcoder.jp/contests/abc445

フォルダ作成をして移動します。/src/bin下に問題数分rustファイルが生成されるので、a.rsを編集します。

cargo compete new abc445
cd ./abc445

今回の問題は、入力文字列の先頭と末尾が等しいかどうかを判定すればよいので、このようなコードになるでしょう。

use proconio::{input, marker::Chars};

fn main() {
	input!{s: Chars}
	println!("{}", if s[0] == s[s.len() - 1] {"Yes"} else {"No"});
}

それでは、問題が解けたのでテストケースで確認してみます。テストは以下のコマンドで実行できます。

cargo compete test a

そうすると色々でてきて、無事Acceptedされたことが分かりました。
もし間違っていた場合はWrong Answerと表示されるため修正しましょう。

さて、公開テストケースがすべて通ったら提出してみましょう。提出は以下のコマンドで実行できます。ちなみに、このコマンドは公開テストケースが通った場合に自動で提出するため、公開テストケースは通ってるが非公開テストケースが通っていない場合はWAになってしまうので、基本的にはtestコマンドで動作確認しておいた方がいいでしょう。

ここまでやったところで………………

なぜか提出がrejectされてしまいます。cargo-competeのissueを見てみると、これは未対応(というかAtCoder側のreCAPTCHAの問題っぽい)なようでした。
まあテストツールや実行環境としては優秀だと思うのでヨシ!

ということで、テストを通したら従来通りブラウザ上で提出するようにしましょう。

おわりに

今回はrustでatcoderをやるための実行環境を整えました。
強力なツールだったcargo-competeですが、AtCoder側の使用変更で一部機能が使えない残念な結果になってしまいました。しかし、依然準備やテストには有効活用できるため、引き続き使用していきたいですね。
不思議なもので、記事を書いてみると競技プログラミングへのモチベーションが上がったので、しばらくは精進してコンテストに参加したいなと思っています。

次の小旅行は名古屋に行って二郎を食べたいです。

おすすめ記事

Recommend