👌

AtCoderをRustではじめてみる!

2022/03/08に公開

みなさん、プログラミング言語Rustはご存じですか?
そう、Rustとは なんか人気らしくて言語仕様がめんどくさいけど使いこなせたらすごいんじゃね? という言語です。
冗談はさておき、本稿では、Rustを使ってAtCoderに参加する際に幸せになれるツールをご紹介します。

プログラミング言語 Rust

Rustは次世代のシステムプログラミング言語で、なんとStackOverflowの”エンジニアに最も愛されている言語”の調査で6年連続1位を獲得しているようです。
いったい何がエンジニアを惹きつけるのか? 真実は定かではありませんが、Rustには魅力的な要素がいろいろあるようです。そんなに人気ならぜひ書けるようになりたい。でも作りたいものが特にない。そんな我らの強い味方が、AtCoderですね。

AtCoder

AtCoderは毎週末にコードコンテストを開催しているWebサイトです。コードコンテストは、出されたお題に対する解答をソースコードで提出する形式のものです。アイデアがなくても、より実践に近い形でコーディングの練習ができます。AtCoderでは当然Rustも使用できます。そして、Rustで参加する際に、知っておくといろいろと便利になるツールがあります。

proconio

コードコンテストのどのお題についてもほとんど共通して書かなければいけない処理があります。それは、お題の入力を受け取る処理です。お題の入力は文字列として与えられます。例えば、以下のような形式です。

N M
A_1 A_2 ... A_N

ここで、Nは配列の最大値、Mは何らかの閾値、Aは要素数Nの配列だと仮定したら、それぞれ別の変数に格納するように受け取りたいですよね。でも入力は文字列です。これがPythonであれば簡単なのですが、Rustの標準ライブラリでは、1行読み取ったらunwrapして改行を削除して空白でパースして整数変換して……なんてことになるわけです。非常に面倒ですね。
幸いなことに、Rustではこのような入力処理を簡単に行うためのマクロを含むライブラリ proconio が存在し、AtCoderでも使えるようになっています。proconioのinput!マクロを使えば、上記の入力例は以下の様に受け取れます。

input!{
    n: i32,
    m: i32,
    a: [i32; n],
}

非常に簡単ですね。

cargo-atcoder

AtCoderでのコードの提出は、以下のようなサイトの入力フォームから行えます。

コードテストもWebサイト上で行えますが、ローカルで環境構築したほうが細かいデバッグができますし、何よりコンパイルが速いです。なので、ローカルでテストケースを通りそうなコードにしてから、Web上の入力フォームにコピペして提出する、というプロセスが一般的かと思うのですが、面倒ですよね。
cargo-atcoder というツールを使えば、ローカルで書いたコードをコマンドラインから直接提出できます。例えば、C問題の解答を提出したかったら、コマンドラインに

cargo atcoder submit c

と打つだけで提出できます。非常に簡単ですね。問題ごとのサンプルテストケースも、testサブコマンドを使えばチェックできます。ツール自体のインストールは、Rust標準のパッケージマネージャCargoから簡単に行えます。
ちなみに、cargo-atcoderの代替品として cargo-compete なるものがあるようなんですが、僕は使ったことないので分かりません。

まとめ

他にも、以下のようなガイドブックもあるので、読んでみると面白いと思います。

参考資料

Discussion