記録は作業の証

鉄道とコンピュータ

TRPL読書記 1

はじめに

知り合いが「これからはRustを知らないとまずいぞ」というので、重い腰をあげてRustを勉強することにした。

まずはTRPLから読んでみることにし、とりあえず第三章まで読んだので練習問題の自分の解答をここに掲載してみる。

書いたコード

温度を華氏と摂氏で変換する。

fn main() {
    let celsius = 33;
    let fahrenheit = (celsius as f64) * 1.8 + 32.0;
    println!("{}℃ → {}℉", celsius, fahrenheit);

    let fahrenheit = 88.0;
    let celsius = (fahrenheit - 32.) / 1.8;
    println!("{}℉ → {}℃", fahrenheit, celsius);
}

フィボナッチ数列のn番目を生成する。

fn main() {
    for n in 0..10 {
        println!("fib({}) is: {}", n, fib(n));
    }
}

fn fib(n: u32) -> u64 {
    if n == 0 {
        return 0;
    }
    if n == 1 {
        return 1;
    }
    let mut now: u64 = 0;
    let mut next: u64 = 1;

    for _ in 2..(n + 1) {
        let temp = now + next;
        now = next;
        next = temp;
    }

    next
}

クリスマスキャロルの定番、"The Twelve Days of Christmas"の歌詞を、 曲の反復性を利用して出力する。

fn main() {
    for n in 1..13 {
        print_on_the_nth_day_of_christmas(n);
        print_presents(n);
        print_partridge(n);
        println!("")
    }
}

fn print_on_the_nth_day_of_christmas(n: u8) {
    let d = [
        "zero", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth",
        "ninth", "tenth", "eleventh", "twelfth",
    ];

    println!(
        "On the {} day of Christmas my true love sent to me",
        d[n as usize]
    );
}

fn print_presents(n: u8) {
    let presents = [
        "dummy zero",
        "dummy one",
        "two turtle doves,",
        "three French hens,",
        "four calling birds,",
        "five golden rings.",
        "six geese a-laying,",
        "seven swans a-swimming,",
        "eight maids a-milking,",
        "nine ladies dancing,",
        "ten lords a-leaping,",
        "eleven pipers piping,",
        "twelve drummers drumming,",
    ];

    for i in (2..(n as usize + 1)).rev() {
        println!("{}", presents[i]);
    }
}

fn print_partridge(n: u8) {
    if n >= 2 {
        print!("and ");
    }
    println!("a Partridge in a Pear Tree.");
}