Skip to content

Commit

Permalink
新しい問題の追加
Browse files Browse the repository at this point in the history
  • Loading branch information
sotanengel committed Jan 4, 2025
1 parent 374ca90 commit 597d403
Show file tree
Hide file tree
Showing 10 changed files with 209 additions and 0 deletions.
8 changes: 8 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@ bin = [
{ name = "1_create_builder_1_sol", path = "solutions/7_types_Use_builders_for_complex_types/1_create_builder_1.rs" },
{ name = "1_create_builder_2", path = "exercises/7_types_Use_builders_for_complex_types/1_create_builder_2.rs" },
{ name = "1_create_builder_2_sol", path = "solutions/7_types_Use_builders_for_complex_types/1_create_builder_2.rs" },
{ name = "1_iter_sum", path = "exercises/9_types_Consider_using_iterator_transforms_instead_of_explicit_loops/1_iter_sum.rs" },
{ name = "1_iter_sum_sol", path = "solutions/9_types_Consider_using_iterator_transforms_instead_of_explicit_loops/1_iter_sum.rs" },
{ name = "2_iter_skip", path = "exercises/9_types_Consider_using_iterator_transforms_instead_of_explicit_loops/2_iter_skip.rs" },
{ name = "2_iter_skip_sol", path = "solutions/9_types_Consider_using_iterator_transforms_instead_of_explicit_loops/2_iter_skip.rs" },
{ name = "3_iter_filter", path = "exercises/9_types_Consider_using_iterator_transforms_instead_of_explicit_loops/3_iter_filter.rs" },
{ name = "3_iter_filter_sol", path = "solutions/9_types_Consider_using_iterator_transforms_instead_of_explicit_loops/3_iter_filter.rs" },
{ name = "4_turbofish_syntax", path = "exercises/9_types_Consider_using_iterator_transforms_instead_of_explicit_loops/4_turbofish_syntax.rs" },
{ name = "4_turbofish_syntax_sol", path = "solutions/9_types_Consider_using_iterator_transforms_instead_of_explicit_loops/4_turbofish_syntax.rs" },
]

[package]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#[allow(clippy::useless_vec)]
fn main() {
let numbers = vec![1, 2, 3, 4, 5];

// TODO: イテレータを使って簡潔に実装し直してください。
let mut sum = 0;
for i in 0..numbers.len() {
sum += numbers[i];
}

println!("Sum: {}", sum);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#[allow(clippy::useless_vec)]
fn main() {
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];

let mut sum = 0;
let mut index = 2; // 最初の2要素をスキップ

// TODO: イテレータを使って簡潔に実装し直してください。
while index < numbers.len() {
sum += numbers[index];
index += 3; // 3つおきに要素を取得
}

println!("Sum of elements at multiples of 3 indices: {}", sum);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#[allow(clippy::useless_vec)]
fn main() {
let numbers = vec![17, 3, 25, 8, 42, 7, 19, 6, 1, 12, 9, 5];

let mut odd_numbers = Vec::new();

// TODO: イテレータを使って簡潔に実装し直してください。
for i in 0..numbers.len() {
let x = numbers[i];
if x % 2 != 0 && x < 10 {
odd_numbers.push(x);
}
}

println!("{:?}", odd_numbers);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
fn parse_numbers(items: Vec<&str>) -> Result<Vec<i32>, std::num::ParseIntError> {
let mut results = Vec::new();

// TODO: イテレータを使って簡潔に実装し直してください。
for i in 0..items.len() {
match items[i].parse::<i32>() {
Ok(num) => results.push(num),
Err(e) => return Err(e),
}
}

Ok(results)
}

#[allow(clippy::useless_vec)]
fn main() {
let items = vec!["42", "93", "apple", "17"];
let parsed = parse_numbers(items);

match parsed {
Ok(numbers) => println!("Parsed numbers: {:?}", numbers),
Err(e) => eprintln!("Failed to parse: {}", e),
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_parse_numbers_success() {
let items = vec!["42", "93", "17"];
let result = parse_numbers(items);
assert!(result.is_ok());
assert_eq!(result.unwrap(), vec![42, 93, 17]);
}

#[test]
fn test_parse_numbers_failure() {
let items = vec!["42", "apple", "17"];
let result = parse_numbers(items);
assert!(result.is_err());
}

#[test]
fn test_parse_empty_list() {
let items: Vec<&str> = vec![];
let result = parse_numbers(items);
assert!(result.is_ok());
assert_eq!(result.unwrap(), vec![]);
}
}
28 changes: 28 additions & 0 deletions info.toml
Original file line number Diff line number Diff line change
Expand Up @@ -151,3 +151,31 @@ dir = "7_types_Use_builders_for_complex_types"
test = false
hint = """ビルダーパターンの応用編です。オプショナルなフィールドの処理方法を学びます。"""
skip_check_unsolved = false

[[exercises]]
name = "1_iter_sum"
dir = "9_types_Consider_using_iterator_transforms_instead_of_explicit_loops"
test = false
hint = """iter().sum()を使って、反復処理で合計を求める方法を学びます。ループを使わずに結果を取得しましょう。"""
skip_check_unsolved = true

[[exercises]]
name = "2_iter_skip"
dir = "9_types_Consider_using_iterator_transforms_instead_of_explicit_loops"
test = false
hint = """iter().skip(n)で先頭からn個の要素をスキップします。イテレータを活用して効率的にデータを処理しましょう。"""
skip_check_unsolved = true

[[exercises]]
name = "3_iter_filter"
dir = "9_types_Consider_using_iterator_transforms_instead_of_explicit_loops"
test = false
hint = """iter().filter()を使って条件に合う要素を抽出します。ループを使わずにデータをフィルタリングしましょう。"""
skip_check_unsolved = true

[[exercises]]
name = "4_turbofish_syntax"
dir = "9_types_Consider_using_iterator_transforms_instead_of_explicit_loops"
test = true
hint = """collectでターボフィッシュ記法(::<>構文)を使って型を指定する方法を学びます。曖昧な型を明確に指定しましょう。"""
skip_check_unsolved = true
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#[allow(clippy::useless_vec)]
fn main() {
let numbers = vec![1, 2, 3, 4, 5];

// イテレータを使って合計を計算します。
let sum: i32 = numbers.iter().sum();

println!("Sum: {}", sum);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#[allow(clippy::useless_vec)]
fn main() {
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];

let sum: i32 = numbers
.iter()
.skip(2) // 最初の2要素をスキップ
.step_by(3) // 3つおきに要素を取得
.sum();

println!("Sum of elements at multiples of 3 indices: {}", sum);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#[allow(clippy::useless_vec)]
fn main() {
let numbers = vec![17, 3, 25, 8, 42, 7, 19, 6, 1, 12, 9, 5];

let odd_numbers: Vec<i32> = numbers
.iter()
.filter(|&&x| x % 2 != 0 && x < 10)
.copied()
.collect();

println!("{:?}", odd_numbers);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
fn parse_numbers(items: Vec<&str>) -> Result<Vec<i32>, std::num::ParseIntError> {
items
.into_iter()
.map(|item| item.parse::<i32>())
.collect::<Result<Vec<_>, _>>()
}

#[allow(clippy::useless_vec)]
fn main() {
let items = vec!["42", "93", "apple", "17"];
let parsed = parse_numbers(items);

match parsed {
Ok(numbers) => println!("Parsed numbers: {:?}", numbers),
Err(e) => eprintln!("Failed to parse: {}", e),
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_parse_numbers_success() {
let items = vec!["42", "93", "17"];
let result = parse_numbers(items);
assert!(result.is_ok());
assert_eq!(result.unwrap(), vec![42, 93, 17]);
}

#[test]
fn test_parse_numbers_failure() {
let items = vec!["42", "apple", "17"];
let result = parse_numbers(items);
assert!(result.is_err());
}

#[test]
fn test_parse_empty_list() {
let items: Vec<&str> = vec![];
let result = parse_numbers(items);
assert!(result.is_ok());
assert_eq!(result.unwrap(), vec![]);
}
}

0 comments on commit 597d403

Please sign in to comment.