Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)のトピック#1の4問をRustで解いてみました。
ITP1 のトピック1は、「プログラミングの入門として、基本構造、変数、入出力、計算式を学習します。」とあります。Rust 入門として解いていきます。
問題(1_A: Hello World)
問題のリンク先:AOJ ITP1 1_A問題:Hello World
文字列を出力する問題です。Rust プログラムのエントリーポイントは、C/C++ と同じ関数 main となります。
関数 main で文字列を出力します。println は、指定された文字列を出力するマクロです。マクロであるため、println!
と書いています。
fn main() {
println!("Hello World");
}
C/C++の printf に近い書き方もできます。{}
はプレースホルダーと呼ばれて、後に続く引数を出力します。
fn main() {
println!("{} {}", "Hello", "World");
}
問題(1_B: X Cubic)
問題のリンク先:AOJ ITP1 1_B問題:X Cubic
ひとつの整数を受け取り、その整数の3乗を出力します。
最初の3行では、文字列を読み込み、行末コードを切り取った後で整数に変換しています。
fn main() {
let mut s = String::new();
std::io::stdin().read_line(&mut s).unwrap();
let x: i32 = s.trim().parse().unwrap();
println!("{}", x * x * x);
}
3乗は、pow メソッドでも計算できます。以下となります。
fn main() {
let mut s = String::new();
std::io::stdin().read_line(&mut s).unwrap();
let x: i32 = s.trim().parse().unwrap();
println!("{}", x.pow(3));
}
問題(1_C: Rectangle)
問題のリンク先:AOJ ITP1 1_C問題:Rectangle
二つの整数を受け取り、計算結果を出力します。
整数を2つ文字列から切り出すためにメソッド split_whitespace を使っています。切り出された文字列を parse して、整数を得ています。
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();
println!("{} {}", a * b, 2 * (a + b));
}
問題(1_D: Watch)
問題のリンク先:AOJ ITP1 1_D問題:Watch
整数を入力として、計算結果をフォーマットした文字列で出力する問題です。
Rust の変数は、mut を指定しないと初期化した値から再代入ができません。値を切り替えれるようにするためには、文字列 buf の宣言のように mut(mutable: 可変)を指定する必要があります。
fn main() {
let mut buf = String::new();
std::io::stdin().read_line(&mut buf).unwrap();
let s: i32 = buf.trim().parse().unwrap();
let hour: i32 = s / (60 * 60);
let minute: i32 = s / 60 % 60;
let second: i32 = s % 60;
println!("{}:{}:{}", hour, minute, second);
}
ここで紹介したすべてのプログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されました。
最後に
Rust の習熟度を上げるために、Python の場合と同じく、このコースを活用することにしました。簡単なプログラムですが、Rust の文法を調べながら解いているため勉強になります。
引き続き、Rust で ITP1 の問題を紹介していきます。