Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)のトピック#2の4問をRustで解いてみました。
ITP1 のトピック2では、条件分岐を学びます。「条件によって実行する内容を変え、処理の流れを制御する構造文を学習します。」とあります。Rust 入門として解いていきます。
目次
問題(2_A: Small, Large, or Equal)
問題のリンク先:AOJ ITP1 2_A問題:Small, Large, or Equal
if – else if – else 文を学びます。
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();
if a < b {
println!("a < b");
} else if a > b {
println!("a > b");
} else {
println!("a == b");
}
}
問題(2_B: Range)
問題のリンク先:AOJ ITP1 2_B問題:Range
条件文で使う条件式に論理演算を含む場合を学びます。
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();
if a < b && b < c {
println!("Yes");
} else {
println!("No");
}
}
問題(2_C: Sorting Three Numbers)
問題のリンク先:AOJ ITP1 2_C問題:Sorting Three Numbers
条件文に慣れるために、3変数のソートを扱います。
fn main() {
let mut s = String::new();
std::io::stdin().read_line(&mut s).unwrap();
let mut ws = s.trim().split_whitespace();
let mut a: i32 = ws.next().unwrap().parse().unwrap();
let mut b: i32 = ws.next().unwrap().parse().unwrap();
let mut c: i32 = ws.next().unwrap().parse().unwrap();
let mut t: i32;
if a > b {
t = a;
a = b;
b = t;
}
if a > c {
t = a;
a = c;
c = t;
}
if b > c {
t = b;
b = c;
c = t;
}
println!("{} {} {}", a, b, c);
}
C++/Python版では、配列をソートするプログラムも紹介しましたが、Rust版では、配列は別の文法要素として紹介することにしました。
問題(2_D: Circle in a Rectangle)
問題のリンク先:AOJ ITP1 2_D問題:Circle in a Rectangle
トピック2の最後として、少し複雑な条件を書いてみます。
fn main() {
let mut s = String::new();
std::io::stdin().read_line(&mut s).unwrap();
let mut ws = s.trim().split_whitespace();
let w: i32 = ws.next().unwrap().parse().unwrap();
let h: i32 = ws.next().unwrap().parse().unwrap();
let x: i32 = ws.next().unwrap().parse().unwrap();
let y: i32 = ws.next().unwrap().parse().unwrap();
let r: i32 = ws.next().unwrap().parse().unwrap();
if 0 <= (x - r) && (x + r) <= w &&
0 <= (y - r) && (y + r) <= h {
println!("Yes");
} else {
println!("No");
}
}
ここで紹介したすべてのプログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されました。
最後に
Rust の習熟度を上げるために、このコースを活用することにしました。条件文が中心の今回は、C/C++と似たプログラムとなりました。
引き続き、Rust で ITP1 の問題を紹介していきます。