Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)のトピック#3の4問をRustで解いてみました。
ITP1 のトピック3では、繰り返し処理を学びます。「条件に従って処理を繰り返し、反復処理を行う構造文を学習します。」とあります。Rust 入門として解いていきます。
問題(3_A: Print Many Hello World)
問題のリンク先:AOJ ITP1 3_A問題:Print Many Hello World
for 文を使って書いてみます。範囲の指定は、Python の range に近い表記を使います。識別子 _ は右辺値として参照できません。「名前を気にしない」という識別子です。
fn main() {
for _ in 0..1000 {
println!("Hello World");
}
}
問題(3_B: Print Test Cases)
問題のリンク先:AOJ ITP1 3_B問題:Print Test Cases
無条件の繰り返しは、loop 文を使います。break で抜けるのは、C/C++ と同じです。
fn main() {
let mut count = 1;
loop {
let mut s = String::new();
std::io::stdin().read_line(&mut s).unwrap();
let x: i32 = s.trim().parse().unwrap();
if x == 0 {
break
}
println!("Case {}: {}", count, x);
count += 1;
}
}
問題(3_C: Swapping Two Numbers)
問題のリンク先:AOJ ITP1 3_C問題:Swapping Two Numbers
3_B の問題と構造は同じですが、2変数を読み込みます。読み込む整数 x と y がどちらも 0 になれば無限ループを抜けます。
fn main() {
loop {
let mut s = String::new();
std::io::stdin().read_line(&mut s).unwrap();
let mut ws = s.trim().split_whitespace();
let x: i32 = ws.next().unwrap().parse().unwrap();
let y: i32 = ws.next().unwrap().parse().unwrap();
if x == 0 && y == 0 {
break
}
if x < y {
println!("{} {}", x, y);
} else {
println!("{} {}", y, x);
}
}
}
問題(3_D: How Many Divisors?)
問題のリンク先:AOJ ITP1 3_D問題:How Many Divisors?
トピック3の最後として、繰り返し、条件判断を行う応用として、約数となっている数の個数を求めるプログラムを作ります。a <= i <= b とするために「右側を含む範囲演算子」を使っています(9行目)。
fn main() {
let mut s = String::new();
std::io::stdin().read_line(&mut s).unwrap();
let mut ws = s.trim().split_whitespace();
let a: i32 = ws.next().unwrap().parse().unwrap();
let b: i32 = ws.next().unwrap().parse().unwrap();
let c: i32 = ws.next().unwrap().parse().unwrap();
let mut divisor = 0;
for i in a..=b {
if c % i == 0 {
divisor += 1;
}
}
println!("{}", divisor);
}
ここで紹介したすべてのプログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されました。
最後に
Rust の習熟度を上げるために、このコースを活用することにしました。繰り返し文については、Python とも C/C++ とも異なる文法を採用していることが学べました。
引き続き、Rust で ITP1 の問題を紹介していきます。