AIZU ONLINE JUDGE

AOJ ITP1 トピック#2をRustで解く

AOJ_ITP1_2

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 の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA