Ccmmutty logo
Commutty IT
6 min read

Rust のための AtCoder 環境構築( cargo-compete 導入編 パターン2 )

https://cdn.magicode.io/media/notebox/2e55f969-4734-449b-ac52-84c3bd03de77.jpeg

はじめに

Rust で AtCoder に参加する際に役に立つ cargo-compete の導入方法と基本的な使い方についての解説を行います.新ジャッジ対応版です. AtCoderがABC314(2023/08/13)から新ジャッジで行われるようになるとともに,cargo-competeでのコードの提出がうまくいかなくなったのでいい機会と思い記事を書いてみました.
以下のURLに示す以前の記事では rust-analyzer を動作させるために cargo-member を導入しました.こちらの記事で解説する方法ではcargo-memberを導入せず .vscode フォルダをコンテストフォルダ(abc314のような名前のフォルダ)を作成することで rust-analyzer が動作させる方法を解説します.

注意

Rustのインストールは済んでいるものとします.
記事を書いてる人のOSはWindows,エディタはVSCodeです.環境が違うとうまくいかないことがあるかもしれません.
また,この記事にではcargo-competeでの提出のためにほかに,
のインストールを行います.もっと,スマートな方法もあるかもしれません.また,cargo-competeのアップデートに伴い一部手順が不要になることもあると思われますので最新情報にはご留意ください.

各種インストール

アップデート,インストールには時間がかかる場合があります.
Rustのバージョンが古いとインストール等うまくいかない場合があるので以下のコマンドで適宜アップデートしておきましょう.筆者の現在(23/08/20時点)のバージョンは russtup(1.26.0), rustc(1.71.1), cargo(1.71.1)となっています.
> rustup update
次に,cargo-udeps, cargo-equip, cargo-competeをインストールします.
> cargo install cargo-udeps
> cargo install cargo-equip
> cargo install cargo-compete
以上で必要なツールのインストールは終わりです.

環境構築

プロジェクト作成

各コンテスト用のコンテストフォルダを管理するためのプロジェクトフォルダrust-coderを作成し,作成したフォルダに移動します.提出用フォルダの名前はrust-coderとしていますがフォルダ名はなんでも大丈夫です.
> mkdir rust-coder
> cd rust-coder
次に,作成したフォルダ内で以下のコマンドを入力します.
> cargo compete init atcoder
途中で出る選択肢は,自分の環境に合わせて選んでください.筆者は,2の選択肢を選びました.大抵は2で大丈夫だと思います.
これで,フォルダ内に以下に示すようなフォルダやファイルが作成されます(cargo-compete v0.10.6現在).
.cargo                          # フォルダ
compete.toml                    # ファイル
template-cargo-lock.toml        # ファイル
ここに,手動でCargo.tomlを追加します.追加後は以下のようになります.
.cargo                          # フォルダ
Cargo.toml                      # ファイル
compete.toml                    # ファイル
template-cargo-lock.toml        # ファイル

設定ファイル編集

compete.tomlの編集を行います.
[template]の項目を次のように編集します.
[template]
src = '''
use proconio::{
    input,
    fastout,
};

#[fastout]
fn main() {
    input! {}
}
'''
以上の[template]はこの後出るcargo compete new practiceのコマンドを入力したときに生成される提出用のソースコードファイルのテンプレートとなります.
[test]の項目にあるtoolchainをコメントアウトします.編集後は以下のようになります.
[test]
# Toolchain for the test. (optional)
# toolchain = "1.42.0"
# Profile for `cargo build`. ("dev" | "release")
#
# Defaults to `"dev"`.
#profile = "dev"
[submit]の項目を次のように編集します.
[submit]
kind = "command"
args = ["cargo", "equip", "--exclude-atcoder-crates", "--remove", "docs", "--minify", "libs", "--bin", "{{ bin_name }}"]
language_id = "5054"
これで,環境構築は終了です.次は,practiceで提出,ACするまでの流れに沿って基本的な使い方を説明していきます.

cargo-competeの基本的な使い方 (コンテストフォルダ作成 ~ ACまで)

AtCoder 内の practice contest ( https://atcoder.jp/contests/practice ) a問題をACするまでの流れに沿って解説を行います.作業は前項までに作成したプロジェクトフォルダrust-coderフォルダ内で行います.cargo-competeコマンドについて知りたいときや困ったときはターミナルから
> cargo compete --help
のコマンドを入力してみてください.

コンテストフォルダの作成

ターミナルからのコマンド入力をしていきます.はじめに,以下のコマンドでコンテストフォルダの作成を行います.
> cargo compete new practice
次に,コンテストフォルダ内で.vscodeフォルダの作成を行い,さらにそのフォルダ内でsettings.jsonファイルを作成します.省略/practice/.vscode/settings.jsonのようになっています.ファイルの内容は以下の通りです.
{
    "rust-analyzer.checkOnSave.command": "clippy",
    "rust-analyzer.checkOnSave.extraArgs": ["--", "-A", "clippy::needless_return"]
}

コード作成とテスト,提出

はじめにログインを行います.以下のコマンドを入力後表示されるプロンプトに従ってAtCoderのID,パスワードをそれぞれ入力して下さい.
> cargo compete login atcoder
コンテストフォルダ内の a.rs にてa問題用のコードを編集します.
use proconio::{
    input,
    fastout,
};

#[fastout]
fn main() {
    input! {
        a: usize,
        (b, c): (usize, usize),
        s: String,
    }

    println!("{} {}", a + b + c, s);
}
プログラムがかけたら,テストケースを試します.以下のpraciceフォルダに移動し,コマンドを実行することでテストケースを通過するかチェックすることができます.
> cd practice
> cargo compete test a
テスト確認後は次のコマンドから提出を行います.
cargo compete submit a
問題なければ,コードが提出されACするはずです.
お疲れ様でした.これで環境構築と基本的な使い方の説明は終わりです.

終わりに

以降コンテスト参加する際はプロジェクト作成のところで作成したrust-coderフォルダ内で
> cargo compete new abc315
といったような形で,コンテストフォルダを追加し管理することができます.
ここまで読んでいただきありがとうございました.もし,問題があればコメント欄かTwitter( https://twitter.com/excute_sira ) の方に連絡ください.誤字脱字誤り等も指摘していただけると嬉しいです.
もっと詳しく知りたい場合は,公式のリポジトリを参照してみてください.

おまけ

以下の記事で,よりcargo-competeを快適に使う方法が紹介されていました.私もこの記事を参考にして環境設定を行っています.こちらも見てみるといいかもしれません.ただし,Windowsではpowershellやデフォルトのコマンドプロンプトではシェルスクリプトは実行できなかった気がします.適宜バッチファイルに読み替えるか,必要なツールを導入するかしましょう.私はGitBashを使っています.

Discussion

コメントにはログインが必要です。