From e47fcf7d73d2d54f265e24b3f85ceaf3ed304020 Mon Sep 17 00:00:00 2001 From: Daan Sieben Date: Wed, 3 Apr 2024 11:42:19 +0200 Subject: [PATCH] solutions --- exercises/src/bin/exercise_01.rs | 2 +- exercises/src/bin/exercise_02.rs | 2 +- exercises/src/bin/exercise_03.rs | 2 +- exercises/src/bin/exercise_04.rs | 2 +- exercises/src/bin/exercise_05.rs | 2 +- exercises/src/bin/exercise_06.rs | 5 +++-- exercises/src/bin/exercise_07.rs | 10 ++++++---- exercises/src/bin/exercise_08.rs | 2 +- exercises/src/bin/exercise_09.rs | 6 +++--- exercises/src/bin/exercise_10.rs | 2 +- exercises/src/bin/exercise_11.rs | 6 +++--- exercises/src/bin/exercise_12.rs | 2 +- exercises/src/bin/exercise_13.rs | 3 ++- exercises/src/bin/exercise_14.rs | 5 +++++ exercises/src/bin/exercise_15.rs | 5 +++++ exercises/src/bin/exercise_16.rs | 4 ++++ exercises/src/bin/exercise_17.rs | 3 ++- exercises/src/bin/exercise_18.rs | 10 ++++++++-- exercises/src/bin/exercise_19.rs | 4 +++- exercises/src/bin/exercise_20.rs | 13 +++++++++++++ exercises/src/bin/exercise_21.rs | 11 ++++++++++- exercises/src/bin/exercise_22.rs | 5 +++-- exercises/src/bin/exercise_23.rs | 6 +++++- exercises/src/bin/exercise_24.rs | 11 +++++++++++ exercises/src/bin/exercise_25.rs | 4 ++++ exercises/src/bin/exercise_26.rs | 16 +++++++++++++--- exercises/src/bin/exercise_27.rs | 3 ++- exercises/src/bin/exercise_28.rs | 9 ++++++--- exercises/src/bin/exercise_29.rs | 11 ++++++++++- exercises/src/bin/exercise_30.rs | 18 +++++++++++++----- exercises/src/bin/exercise_31.rs | 4 ++-- 31 files changed, 144 insertions(+), 44 deletions(-) diff --git a/exercises/src/bin/exercise_01.rs b/exercises/src/bin/exercise_01.rs index e2bbfca..669fbc6 100644 --- a/exercises/src/bin/exercise_01.rs +++ b/exercises/src/bin/exercise_01.rs @@ -4,7 +4,7 @@ /// fn exercise() -> i32 { - let output = 7; + let mut output = 7; // Do not change below this line __________________________________________ println!("The value of output is: {}", output); diff --git a/exercises/src/bin/exercise_02.rs b/exercises/src/bin/exercise_02.rs index 2a1031f..6ca50bd 100644 --- a/exercises/src/bin/exercise_02.rs +++ b/exercises/src/bin/exercise_02.rs @@ -7,7 +7,7 @@ fn exercise() -> i32 { let output = 7; // Do not change this line println!("The value of output is: {}", output); - output = 5; + let output = 5; println!("The value of output is: {}", output); output // Do not change this line } diff --git a/exercises/src/bin/exercise_03.rs b/exercises/src/bin/exercise_03.rs index 89cfb7a..35595f6 100644 --- a/exercises/src/bin/exercise_03.rs +++ b/exercises/src/bin/exercise_03.rs @@ -9,7 +9,7 @@ fn exercise() -> i32 { let mut output = "seven"; // Do not change this line println!("The value of output is: {}", output); - output = 5; + let output = 5; println!("The value of output is: {}", output); output // Do not change this line } diff --git a/exercises/src/bin/exercise_04.rs b/exercises/src/bin/exercise_04.rs index c02a788..360c6aa 100644 --- a/exercises/src/bin/exercise_04.rs +++ b/exercises/src/bin/exercise_04.rs @@ -9,7 +9,7 @@ fn exercise() -> i32 { let mut output = 7; // Do not change this line { println!("The value of output is: {}", output); - output = 5; // <-- how to tell the compiler that this is a different variable? + let output = 5; // <-- how to tell the compiler that this is a different variable? println!("The value of output is: {}", output); } output // Do not change this line diff --git a/exercises/src/bin/exercise_05.rs b/exercises/src/bin/exercise_05.rs index c9261de..cde93e7 100644 --- a/exercises/src/bin/exercise_05.rs +++ b/exercises/src/bin/exercise_05.rs @@ -10,7 +10,7 @@ fn exercise() -> i32 { } fn square(value: i32) -> i32 { - value * value; + value * value } fn main() { diff --git a/exercises/src/bin/exercise_06.rs b/exercises/src/bin/exercise_06.rs index b7ab5da..2add792 100644 --- a/exercises/src/bin/exercise_06.rs +++ b/exercises/src/bin/exercise_06.rs @@ -9,12 +9,13 @@ fn exercise() -> i32 { divide(value) } -fn divide(value: i32) { +#[allow(clippy::eq_op)] +fn divide(value: i32) -> i32 { if value == 0 { 0 } else { value / value - }; + } } fn main() { diff --git a/exercises/src/bin/exercise_07.rs b/exercises/src/bin/exercise_07.rs index ec40e94..097d111 100644 --- a/exercises/src/bin/exercise_07.rs +++ b/exercises/src/bin/exercise_07.rs @@ -12,10 +12,12 @@ fn exercise() -> String { let c = String::from("five"); let d = c; - // format!("{a}={c}") - // format!("{b}={c}") - // format!("{a}={d}") - // format!("{b}={d}") + // format!("{a}={c}") // Invalid: borrow of moved value `c` + // format!("{b}={c}") // Invalid: borrow of moved value `c` + format!("{a}={d}") // Valid: as a is a primitive type, it has a copy trait, + // meaning that b is not taking ownership but is a copy of a + // format!("{b}={d}") // Valid: as a is a primitive type, it has a copy trait, + // meaning that b is not taking ownership but is a copy of a } fn main() { diff --git a/exercises/src/bin/exercise_08.rs b/exercises/src/bin/exercise_08.rs index 926af6f..f2fbbed 100644 --- a/exercises/src/bin/exercise_08.rs +++ b/exercises/src/bin/exercise_08.rs @@ -7,7 +7,7 @@ #[allow(unused)] fn exercise() -> String { let value = String::from("Hello world"); - read_string(value); + let value = read_string(value); value } diff --git a/exercises/src/bin/exercise_09.rs b/exercises/src/bin/exercise_09.rs index 565cd13..8224fff 100644 --- a/exercises/src/bin/exercise_09.rs +++ b/exercises/src/bin/exercise_09.rs @@ -9,12 +9,12 @@ fn exercise() -> String { // Do not change this function let value = String::from("Hello world"); - read_string(value); - read_string(value); + read_string(&value); + read_string(&value); value } -fn read_string(value: String) { +fn read_string(value: &String) { println!("{}", value); } diff --git a/exercises/src/bin/exercise_10.rs b/exercises/src/bin/exercise_10.rs index afeac1f..44827f6 100644 --- a/exercises/src/bin/exercise_10.rs +++ b/exercises/src/bin/exercise_10.rs @@ -11,7 +11,7 @@ fn exercise() -> String { value } -fn read_first_word() { +fn read_first_word(value: &str) -> &str { // Adjust the signature of this function to make the example compile value.split_once(' ').unwrap().0 } diff --git a/exercises/src/bin/exercise_11.rs b/exercises/src/bin/exercise_11.rs index 9dd3bad..2dba9f5 100644 --- a/exercises/src/bin/exercise_11.rs +++ b/exercises/src/bin/exercise_11.rs @@ -5,12 +5,12 @@ /// value by 2? Hint: refer to exercise_01 to see how to add mutability to a variable. /// fn exercise() -> i32 { - let value = 5; - times_two(value); + let mut value = 5; + times_two(&mut value); value } -fn times_two(value: i32) { +fn times_two(value: &mut i32) { *value *= 2; // This line does not require any changes! } diff --git a/exercises/src/bin/exercise_12.rs b/exercises/src/bin/exercise_12.rs index c975f62..9ad8292 100644 --- a/exercises/src/bin/exercise_12.rs +++ b/exercises/src/bin/exercise_12.rs @@ -6,7 +6,7 @@ fn exercise() -> i32 { let tuple = (1, 2, 3, 5, 13, 21, 34); - todo!("return the correct entry from the tuple") + tuple.3 } fn main() { diff --git a/exercises/src/bin/exercise_13.rs b/exercises/src/bin/exercise_13.rs index 8569ce8..75f2ff7 100644 --- a/exercises/src/bin/exercise_13.rs +++ b/exercises/src/bin/exercise_13.rs @@ -6,7 +6,8 @@ /// fn exercise() -> (i32, String) { - todo!("Call get_input and return the sum of all i32 and the concatenation of all Strings") + let (a, b, c, d, e) = get_input(); + (a + c + e, format!("{}{}", b, d)) } fn get_input() -> (i32, String, i32, String, i32) { diff --git a/exercises/src/bin/exercise_14.rs b/exercises/src/bin/exercise_14.rs index 1024c84..6d01cb6 100644 --- a/exercises/src/bin/exercise_14.rs +++ b/exercises/src/bin/exercise_14.rs @@ -18,6 +18,11 @@ struct Order { shipping: i32, tax: i32, } +impl Order { + fn total_cost(&self) -> i32 { + self.cost + self.shipping + self.tax + } +} fn main() { exercise(); diff --git a/exercises/src/bin/exercise_15.rs b/exercises/src/bin/exercise_15.rs index ad67dcb..bc3a832 100644 --- a/exercises/src/bin/exercise_15.rs +++ b/exercises/src/bin/exercise_15.rs @@ -26,6 +26,11 @@ struct Order { shipping: i32, tax: i32, } +impl Order { + fn apply_discount_to_cost(&mut self, discount: i32) { + self.cost -= discount; + } +} fn main() { exercise(); diff --git a/exercises/src/bin/exercise_16.rs b/exercises/src/bin/exercise_16.rs index 6186613..bf44a4a 100644 --- a/exercises/src/bin/exercise_16.rs +++ b/exercises/src/bin/exercise_16.rs @@ -32,6 +32,10 @@ impl Order { fn cost_without_tax(&self) -> i32 { self.cost + self.shipping } + + fn have_equal_cost_without_tax(order1: &Order, order2: &Order) -> bool { + order1.cost_without_tax() == order2.cost_without_tax() + } } fn main() { diff --git a/exercises/src/bin/exercise_17.rs b/exercises/src/bin/exercise_17.rs index 077face..1810292 100644 --- a/exercises/src/bin/exercise_17.rs +++ b/exercises/src/bin/exercise_17.rs @@ -12,7 +12,8 @@ fn exercise() -> i32 { let shipping = 10; let tax = 5; - todo!("Create an order using the builder pattern"); + let order = OrderBuilder::new(cost).shipping(shipping).tax(tax).build(); + order.total_cost() } #[allow(unused)] diff --git a/exercises/src/bin/exercise_18.rs b/exercises/src/bin/exercise_18.rs index 828c44b..dd5aafc 100644 --- a/exercises/src/bin/exercise_18.rs +++ b/exercises/src/bin/exercise_18.rs @@ -4,7 +4,7 @@ /// is positive, -1 if the number is negative, and 0 if the number is zero. /// -fn exercise() -> () { +fn exercise() { // Do not change this function println!("Sign for 5 is {}", sign(5)); println!("Sign for 25 is {}", sign(25)); @@ -13,7 +13,13 @@ fn exercise() -> () { } fn sign(value: i32) -> i32 { - todo!("implement sign function here") + if value > 0 { + 1 + } else if value < 0 { + -1 + } else { + 0 + } } fn main() { diff --git a/exercises/src/bin/exercise_19.rs b/exercises/src/bin/exercise_19.rs index 4a4a954..da1d472 100644 --- a/exercises/src/bin/exercise_19.rs +++ b/exercises/src/bin/exercise_19.rs @@ -6,7 +6,9 @@ fn exercise() -> i32 { let mut sum = 0; - todo!("Sum the numbers from 1 to 100 and store the result in the variable `sum` here"); + for i in 1..=100 { + sum += i; + } sum } diff --git a/exercises/src/bin/exercise_20.rs b/exercises/src/bin/exercise_20.rs index 3591d62..d4850f4 100644 --- a/exercises/src/bin/exercise_20.rs +++ b/exercises/src/bin/exercise_20.rs @@ -17,6 +17,19 @@ enum TrafficLight { Yellow, Green, } +impl TrafficLight { + fn switch_to_next(&self) -> TrafficLight { + if self == &TrafficLight::Green { + TrafficLight::Yellow + } else if self == &TrafficLight::Yellow { + TrafficLight::Red + } else if self == &TrafficLight::Red { + TrafficLight::Green + } else { + unreachable!() + } + } +} fn main() { exercise(); diff --git a/exercises/src/bin/exercise_21.rs b/exercises/src/bin/exercise_21.rs index 5d2a724..c0ab317 100644 --- a/exercises/src/bin/exercise_21.rs +++ b/exercises/src/bin/exercise_21.rs @@ -4,7 +4,7 @@ /// Try to use pattern matching to implement the method. /// -fn exercise() -> () { +fn exercise() { // Do not change this function println!("Dog sound: {}", Animal::Dog.make_sound()); println!("Cat sound: {}", Animal::Cat.make_sound()); @@ -17,6 +17,15 @@ enum Animal { Cat, Cow, } +impl Animal { + fn make_sound(&self) -> &str { + match self { + Animal::Dog => "Woof", + Animal::Cat => "Meow", + Animal::Cow => "Moo", + } + } +} fn main() { exercise(); diff --git a/exercises/src/bin/exercise_22.rs b/exercises/src/bin/exercise_22.rs index 9db1bf3..ed47103 100644 --- a/exercises/src/bin/exercise_22.rs +++ b/exercises/src/bin/exercise_22.rs @@ -8,8 +8,9 @@ fn exercise() -> i32 { let mut sum = 0; for i in 1..=100 { - let divided = integer_divided_by_two(i); - todo!("If the `integer_divided_by_two` function returns Some value, add its output to the sum"); + if let Some(value) = integer_divided_by_two(i) { + sum += value; + } } sum diff --git a/exercises/src/bin/exercise_23.rs b/exercises/src/bin/exercise_23.rs index 8ec1d1f..b05836d 100644 --- a/exercises/src/bin/exercise_23.rs +++ b/exercises/src/bin/exercise_23.rs @@ -6,7 +6,11 @@ use std::num::ParseIntError; fn exercise(input: &str) -> i32 { - todo!(); + if let Ok(value) = int_value(input) { + value + } else { + 0 + } } #[allow(dead_code)] diff --git a/exercises/src/bin/exercise_24.rs b/exercises/src/bin/exercise_24.rs index f80676d..1b145da 100644 --- a/exercises/src/bin/exercise_24.rs +++ b/exercises/src/bin/exercise_24.rs @@ -23,6 +23,17 @@ struct Square { struct Circle { value: f32, } +impl Area for Square { + fn area(&self) -> f32 { + self.value * self.value + } +} +impl Area for Circle { + fn area(&self) -> f32 { + let radius = self.value / 2.0; + core::f32::consts::PI * radius * radius + } +} trait Area { fn area(&self) -> f32; diff --git a/exercises/src/bin/exercise_25.rs b/exercises/src/bin/exercise_25.rs index 2a589be..55153f2 100644 --- a/exercises/src/bin/exercise_25.rs +++ b/exercises/src/bin/exercise_25.rs @@ -21,6 +21,10 @@ fn exercise() -> String { ) } +fn get_first(pair: (T, T)) -> T { + pair.0 +} + fn main() { println!("{}", exercise()); } diff --git a/exercises/src/bin/exercise_26.rs b/exercises/src/bin/exercise_26.rs index 7c12015..ff0538b 100644 --- a/exercises/src/bin/exercise_26.rs +++ b/exercises/src/bin/exercise_26.rs @@ -8,19 +8,29 @@ use std::collections::{HashMap, HashSet}; fn vector_sum(vector: Vec) -> i32 { let mut total = 0; - todo!("Return the sum of the vector"); + for i in vector { + total += i; + } total } fn hashset_product(hashset: HashSet) -> i32 { let mut total = 1; - todo!("Return the product of the hashset"); + for i in hashset { + total *= i; + } total } fn hashmap_sum(hashmap: HashMap<&str, Vec>) -> HashMap<&str, i32> { let mut total = HashMap::new(); - todo!("Return the sum of the hashmap values per key"); + for (key, value) in hashmap { + let mut sum = 0; + for i in value { + sum += i; + } + total.insert(key, sum); + } total } diff --git a/exercises/src/bin/exercise_27.rs b/exercises/src/bin/exercise_27.rs index baba6ea..b383b49 100644 --- a/exercises/src/bin/exercise_27.rs +++ b/exercises/src/bin/exercise_27.rs @@ -6,7 +6,8 @@ /// fn exercise(a: i32, b: i32) -> i32 { - todo!("Call the apply function twice with a closure defined above"); + let sum = apply(|a, b| a + b, a, b); + apply(|a, b| a * b, sum, b) } fn apply i32>(func: F, a: i32, b: i32) -> i32 { diff --git a/exercises/src/bin/exercise_28.rs b/exercises/src/bin/exercise_28.rs index a738775..7cf51cd 100644 --- a/exercises/src/bin/exercise_28.rs +++ b/exercises/src/bin/exercise_28.rs @@ -7,15 +7,18 @@ use std::collections::{HashMap, HashSet}; /// fn vector_sum(vector: Vec) -> i32 { - todo!("Return the sum of the vector"); + vector.into_iter().sum() } fn hashset_product(hashset: HashSet) -> i32 { - todo!("Return the product of the hashset"); + hashset.into_iter().product() } fn hashmap_sum(hashmap: HashMap<&str, Vec>) -> HashMap<&str, i32> { - todo!("Return the sum of the hashmap values per key"); + hashmap + .into_iter() + .map(|(key, value)| (key, value.into_iter().sum())) + .collect() } fn main() { diff --git a/exercises/src/bin/exercise_29.rs b/exercises/src/bin/exercise_29.rs index 89347cc..e42038f 100644 --- a/exercises/src/bin/exercise_29.rs +++ b/exercises/src/bin/exercise_29.rs @@ -6,12 +6,21 @@ fn exercise((orange, apple, banana): (Product, Product, Product)) -> f32 { let mut basket = Basket { items: vec![] }; - // basket.add(Product); + for _ in 0..3 { + basket.add(orange.clone()); + } + for _ in 0..2 { + basket.add(apple.clone()); + } + for _ in 0..5 { + basket.add(banana.clone()); + } basket.print(); basket.total() } +#[derive(Debug, Clone)] struct Product { #[allow(dead_code)] name: String, diff --git a/exercises/src/bin/exercise_30.rs b/exercises/src/bin/exercise_30.rs index a6325cf..c6a734c 100644 --- a/exercises/src/bin/exercise_30.rs +++ b/exercises/src/bin/exercise_30.rs @@ -6,7 +6,15 @@ fn exercise((orange, apple, banana): (Product, Product, Product)) -> f32 { let mut basket = Basket { items: vec![] }; - // basket.add(Product); + for _ in 0..3 { + basket.add(&orange); + } + for _ in 0..2 { + basket.add(&apple); + } + for _ in 0..5 { + basket.add(&banana); + } basket.print(); basket.total() @@ -20,12 +28,12 @@ struct Product { price: f32, } -struct Basket { - items: Vec, +struct Basket<'a> { + items: Vec<&'a Product>, } -impl Basket { - fn add(&mut self, product: Product) { +impl<'a> Basket<'a> { + fn add(&mut self, product: &'a Product) { self.items.push(product); } diff --git a/exercises/src/bin/exercise_31.rs b/exercises/src/bin/exercise_31.rs index 4089b6b..581a32d 100644 --- a/exercises/src/bin/exercise_31.rs +++ b/exercises/src/bin/exercise_31.rs @@ -17,8 +17,8 @@ mod example { Model { value: 5 } } - struct Model { - value: i32, + pub struct Model { + pub value: i32, } }