AtCoder用コンテストのプログラムをローカルで実行するためのプロジェクト作成方法。 cargo-generateを使う方法と、Rustの通常のプロジェクトを使う方法があります。

cargo-generate

cargo-generateを使うと、AtCoder用のプロジェクトを簡単に生成することができます。

参考 プロジェクトを生成する・AtCoderコンテストにRustで参加するためのガイドブック

問題ごとに以下を実行してプロジェクトを作成します。

cargo generate --git https://github.com/rust-lang-ja/atcoder-rust-base --branch ja

実行すると、プロジェクト名を求められるので、プロジェクト名を入力します。

cargo install cargo-generate
��   Project Name:
入力した名前のディレクトリが作成されますので、そのディレクトリに移動します。 作成された main.rs を編集して、cargo run で実行できます。

通常プロジェクト

Rustの通常プロジェクトを使う場合は、cargoコマンドで新規プロジェクトを作成します。 そこにbinディレクトリを作成して、コンテスト用ファイルを作成します。 ファイルは複数作成できます。ここではA問題用 a.rs、B問題用 b.rs、 ... f.rs とします。

作成したファイルの実行は、以下のようになります。

cargo run --bin [ファイル名]

例 [プロジェクトディレクトリ]/src/bin/a.rs (ABC問題のA問題用)

cargo run --bin a

プロジェクト作成

プロジェクト用ディレクトリを作成する場合は、以下を実行します。

cargo new [プロジェクト名]

成功するとプロジェクト名のディレクトリが作成されるので、その中に bin ディレクトリを作成します。

$ cargo new abc377
    Creating binary (application) `abc377` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

$ cd abc377
$ mkdir bin

src/bin ディレクトリに a.rs b.rs ... f.rs のようなコンテスト用ファイルを作成します。

abcXXX --- src --bin --- a.rs
        |             |- b.rs
        |             |...
        |             |- f.rs
        | 
        |
        -- Cargo.toml

ライブラリやマクロの設定

プロジェクト作成後に、必要なライブラリやマクロを追加します。

標準入力に proconio を使用する場合は、以下を実行して追加します。

cargo add proconio

AtCoder用ライブラリ ac-library-rs を使う場合は、 プロジェクトディレクトリで以下を実行して追加します。

cargo add ac-library-r

例 今回のプロジェクト作成直後

[package]
name = "abc377"
version = "0.1.0"
edition = "2021"

[dependencies]

例 標準入力用のproconio と ac-library-rs を追加した場合

[package]
name = "abc377"
version = "0.1.0"
edition = "2021"

[dependencies]
ac-library-rs = "0.1.1"
proconio = "0.4.5"

実行

以下で実行します。

cargo --bin [拡張子を除いたファイル名]

例 src/bin/a.rs を実行した場合

$ cargo run --bin a
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/a`
正常に実行されると、上記のような入力待ち状態になります。

参考 実行したABC377・A問題用の a.rs のサンプル

use proconio::input;

fn main() {
    input! {
        s: String,
    };
    let mut v: Vec<u8> = s.into_bytes();
    v.sort();

    let t: String = String::from_utf8(v).unwrap();
    let ans = if t == "ABC" {
        "Yes"
    } else {
        "No"
    };
    println!("{}", ans);
}