Qiita Engineer Festa 2024(キータ・エンジニア・フェスタ 2024) - Qiita
において、約1ヶ月で38記事という大量の記事の投稿を要求されることがわかった。
そこで、あまりコストをかけずに記事数を稼ぐ方法を考えた結果、「Welcome to AtCoder を様々な言語で解く」ことを思いついた。
単に解くだけでなく、使用する言語仕様の解説を入れれば、記事として一応成立するだろう。
Welcome to AtCoder
PracticeA - Welcome to AtCoder
Welcome to AtCoder では、以下の形式で整数 $a$, $b$, $c$ および文字列 $s$ が入力として与えられる。
a
b c
s
この入力をもとに、与えられた整数の和 $sum = a + b + c$ および文字列 $s$ を、以下の形式で出力することが求められる。
sum s
今回用いた Rust の機能
プログラムの枠組みと変数宣言
Parsing command line arguments - Command Line Applications in Rust
Rust のプログラムは、以下の形で書くことができる。
fn main() {
// 処理内容
}
let
を用いることで、変数を宣言して値を割り当てることができる。
let 変数名 = 値;
数値の加算
+
演算子を用いることで、数値の加算を行うことができる。
データの出力
println!
を用いることで、標準出力にデータを出力し、さらに改行を出力できる。
第1引数に書式文字列、第2引数以降にデータを指定し、書式文字列中の {}
の位置にデータを埋め込んで出力できる。
println!(書式文字列, データ, ...)
データの入力
Stdin in std::io - Rust
BufRead in std::io - Rust
以下のようにすることで、標準入力から1行ずつ読み込むイテレータを得ることができる。
let mut lines = io::stdin().lines();
イテレータを用いる際は、let
だけでなく mut
もつけないと、値を取得する処理でエラーになるようである。
このイテレータは Option<Result<String, Error>>
型のデータを返すので、2回 unwrap()
を用いることで各行のデータを文字列 (String
) で得ることができる。
得られる文字列は改行文字を含まないようである。
let line = lines.next().unwrap().unwrap();
この機能は std::io
モジュールを用いるので、プログラムの先頭で以下のようにしてこのモジュールを取り込む。
use std::io;
文字列の数値への変換
文字列.parse().unwrap()
を用いることで、文字列を数値に変換できる。
変換先の型は、代入先の型で指定できる。
let str = "72";
let value : i32 = str.parse().unwrap();
文字列の分割
文字列.split_whitespace()
により、文字列を空白で分割した各部分を得るイテレータを得ることができる。
let str = "hello world";
let mut parts = str.split_whitespace();
このイテレータは Option<&str>
型の値を返すので、1回 unwrap()
を用いることで各部分の文字列を得ることができる。
let part = parts.next().unwrap();
提出コード
use std::io;
fn main() {
let mut lines = io::stdin().lines();
let line1 = lines.next().unwrap().unwrap();
let line2 = lines.next().unwrap().unwrap();
let line3 = lines.next().unwrap().unwrap();
let a : i32 = line1.parse().unwrap();
let mut bc = line2.split_whitespace();
let b : i32 = bc.next().unwrap().parse().unwrap();
let c : i32 = bc.next().unwrap().parse().unwrap();
println!("{} {}", a + b + c, line3);
}