
cargo コマンドが使用できるようになれば OK です。RustCoder とします。# AtCoder 用の新規 Rust プロジェクト(RustCoder)を作成
> cargo new RustCoder
> cd RustCoder
> ls
Cargo.toml srcRustCoder 内には Cargo.toml と src/main.rs しかないと思います。このフォルダをこれから AtCoder 用に改造しましょう。cargo-compete をインストールするcargo-compete に関しては、「cargo-atcoderの代替品を作った」で解説されています。簡単に説明すると、AtCoder のテストケースのダウンロードやフォルダ作成、提出などを行えるコマンドラインツールとなっています。こちらのインストールは、下記のコマンドを入力するだけで行えます。> cargo install cargo-competecargo-compete がインストールできたら、先ほど作成した RustCoder 内で下記のコマンドを実行します。> cargo compete init atcoder
Do you use crates on AtCoder?
1 No
2 Yes
3 Yes, but I submit base64-encoded programs
1..3:cargo compete init atcoder で AtCoder 用にプロジェクトを初期化します。しかし、「AtCoder でクレートを使用しますか?」と入力を求められました。ここでは、2番を選択すると良いと思います。crate というのは、外部ライブラリとか外部パッケージのようなものです。実は Rust は標準ライブラリが少なめで、AtCoder ではあらかじめいくつかの crate がインストールされています。質問の意味は、「AtCoder で使える crate を使用しますか?」ということです。3番は「バイナリ提出」をするということを意味しています。バイナリ提出に関してはしたことがないのでよく分かりませんが、2番で問題ありません。compete.toml, template-cargo-lock.toml, .cargo/config.toml の3つのファイルが作成されたと思います。基本的には compete.toml 以外は中身を見る必要はないと思います。compete.toml を編集するcompete.toml は、名前の通り cargo compete コマンドの設定ファイルです。このファイルの [template] と書かれた項目を探してください。おそらく、以下のようになっていると思います。[template]
src = '''
fn main() {
todo!();
}
'''[template]
src = '''
use proconio::{fastout, input};
#[fastout]
fn main() {
input! {}
}
'''proconio は、競プロの入出力用のクレートです。これはどんな問題でも確実に使うので、[template] 内に記述して最初から使えるように設定します。cargo-member をインストールする> cargo install cargo-memberRustCoder を開きます。その後、VSCode の上部メニューからターミナルを開きます。ターミナルで以下のコマンドを実行してみてください。> cargo compete new practicecargo compete new コマンドを使用します。問題URLの contests の後の英数字が「コンテストID」を表しています。次に、先ほどインストールした cargo member コマンドを使用します。> cargo member include practicepractice フォルダがワークスペースのメンバーに追加されます。RustCoder/Cargo.toml を確認してみてください。workspace = {members = ["practice"],exclude = []}rust-analyzer がうまく動作しないため注意してください。ワークスペースについて知りたい方はこちらを読んでみると良いかと思います。Cargo.toml 内の上記の部分を見ると、他の部分と違う記述で浮いていてなんとなく落ち着かない人もいるかと思います。そんな繊細な方は、最初からある [dependencies] の上あたりに [workspace] と記述して保存した後に cargo member コマンドを実行すると幸せになれるかもしれません。practice を作成したので、A 問題を実際に解いていきましょう。use proconio::{fastout, input};
#[fastout]
fn main() {
input! {
a: usize,
(b, c): (usize, usize),
s: String
}
println!("{} {}", a + b + c, s);
}> cd practice
> cargo compete test atoolchain をインストールする(2022/5/25)】を参考にしてください。> cargo compete submit acargo compete login でログインをしてください。cargo compete を利用するとターミナル上でコンテストフォルダの作成・テストケースのダウンロード・テストから提出まで一貫して行うことが出来ます。cargo compete new <contest> と cargo member include <contest> を実行するのは面倒なので、VSCode の tasks.json を活用して自動化します。tasks.json は .vscode 内に作成します。> cd RustCoder
> mkdir .vscode
> cd .vscode
> touch tasks.json
tasks.json を作成できます。tasks.json に以下の部分を追記します。{
--- 前略 ---
"tasks": [
--- 略 ---
{
"label": "rust: cargo compete new",
"type": "cargo",
"command": "compete",
"args": [
"new",
"${input:contest}"
]
},
{
"label": "rust: cargo member include",
"type": "cargo",
"command": "member",
"args": [
"include",
"${input:contest}"
]
},
{
"label": "new contest",
"dependsOrder": "sequence",
"dependsOn": [
"rust: cargo compete new",
"rust: cargo member include",
],
"presentation": {
"echo": false,
"reveal": "silent",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": true
},
"problemMatcher": []
}
],
"inputs": [
{
"id": "contest",
"description": "contestID",
"type": "promptString"
}
]
--- 後略 ---
}rust: cargo compete new とラベル付けされているタスクは、新規コンテストファイルを作成するタスクとなっています。このタスクの引数 args には、${input:contest} がありますが、これは一番下の inputs と関連し、入力を受け付けるようになっています。rust: cargo member include とラベル付けされているタスクは、${input:contest} で指定されたフォルダをワークスペースのメンバーに追加するタスクです。new contest とラベル付けされたタスクは、この2つのタスクをまとめたものです。「⌘+P」→「task new contest」と入力してこのタスクを実行すると、contestID の入力を求められ、フォルダの作成とワークスペースメンバーへの追加が連続で行われます。toolchain をインストールする(2022/5/25)cargo compete test を実行すると、error: toolchain '1.42.0-x86_64-apple-darwin' is not installedtoolchain のバージョン指定が 1.42.0 となっています。そのため、cargo-compete でテストを行う際もこのバージョンの toolchain が必要となります。以下のコマンドを実行して必要なバージョンの toolchain をインストールします。> rustup toolchain install 1.42.0cargo compete test を実行しようとすると以下のようなエラーが表示されると思います。--- 前略 ---
error: failed to parse manifest at `.../RustCoder/Cargo.toml`
Caused by:
failed to parse the `edition` key
Caused by:
supported edition values are `2015` or `2018`, but `2021` is unknown
--- 後略 ---edition が違うというエラーです。Cargo.toml の [package] の edition 部分を以下のように 2018 へ変更して保存してください。[package]
edition = "2018"cargo compete test コマンドが実行できるようになったかと思います。toolchain のバージョンを変更する場合は、こちらで紹介されているような、rust-toolchain というファイルを使用する方法が一般的です。しかし、VSCode の拡張機能 rust-analyzer は 1.42.0 で正常に動作しません。そのため、rust-analyzer の恩恵を受けつつ cargo compete コマンドを実行するためには、rust-toolchain を使用せず、「プロジェクト全体のバージョンは最新の安定版のまま、cargo compete に必要な 1.42.0 の toolchain をインストールする」必要があります。