summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-06-24 16:50:03 +0200
committermo8it <mo8it@proton.me>2024-06-24 16:50:03 +0200
commitfbc226a51043f7c9be4c414292d37d3ce97038fe (patch)
tree4352f3fbd4b7850fdb3888c510771e175e8ce26e
parent5baa503bfc27fc691dbc292b46d37d25c17cffab (diff)
hashmaps2 solution
-rw-r--r--exercises/11_hashmaps/hashmaps2.rs23
-rw-r--r--rustlings-macros/info.toml5
-rw-r--r--solutions/11_hashmaps/hashmaps2.rs96
3 files changed, 107 insertions, 17 deletions
diff --git a/exercises/11_hashmaps/hashmaps2.rs b/exercises/11_hashmaps/hashmaps2.rs
index 05b7a87..b3691b6 100644
--- a/exercises/11_hashmaps/hashmaps2.rs
+++ b/exercises/11_hashmaps/hashmaps2.rs
@@ -6,8 +6,6 @@
// must add fruit to the basket so that there is at least one of each kind and
// more than 11 in total - we have a lot of mouths to feed. You are not allowed
// to insert any more of these fruits!
-//
-// Make me pass the tests!
use std::collections::HashMap;
@@ -21,7 +19,7 @@ enum Fruit {
}
fn fruit_basket(basket: &mut HashMap<Fruit, u32>) {
- let fruit_kinds = vec![
+ let fruit_kinds = [
Fruit::Apple,
Fruit::Banana,
Fruit::Mango,
@@ -46,12 +44,8 @@ mod tests {
// Don't modify this function!
fn get_fruit_basket() -> HashMap<Fruit, u32> {
- let mut basket = HashMap::<Fruit, u32>::new();
- basket.insert(Fruit::Apple, 4);
- basket.insert(Fruit::Mango, 2);
- basket.insert(Fruit::Lychee, 5);
-
- basket
+ let content = [(Fruit::Apple, 4), (Fruit::Mango, 2), (Fruit::Lychee, 5)];
+ HashMap::from_iter(content)
}
#[test]
@@ -81,7 +75,7 @@ mod tests {
#[test]
fn all_fruit_types_in_basket() {
- let fruit_kinds = vec![
+ let fruit_kinds = [
Fruit::Apple,
Fruit::Banana,
Fruit::Mango,
@@ -91,11 +85,12 @@ mod tests {
let mut basket = get_fruit_basket();
fruit_basket(&mut basket);
+
for fruit_kind in fruit_kinds {
- let amount = basket
- .get(&fruit_kind)
- .expect(format!("Fruit kind {:?} was not found in basket", fruit_kind).as_str());
- assert_ne!(amount, &0);
+ let Some(amount) = basket.get(&fruit_kind) else {
+ panic!("Fruit kind {fruit_kind:?} was not found in basket");
+ };
+ assert!(*amount > 0);
}
}
}
diff --git a/rustlings-macros/info.toml b/rustlings-macros/info.toml
index cf70d4d..0da573b 100644
--- a/rustlings-macros/info.toml
+++ b/rustlings-macros/info.toml
@@ -566,8 +566,9 @@ name = "hashmaps2"
dir = "11_hashmaps"
hint = """
Use the `entry()` and `or_insert()` methods of `HashMap` to achieve this.
-Learn more at https://doc.rust-lang.org/stable/book/ch08-03-hash-maps.html#only-inserting-a-value-if-the-key-has-no-value
-"""
+
+Learn more in The Book:
+https://doc.rust-lang.org/stable/book/ch08-03-hash-maps.html#only-inserting-a-value-if-the-key-has-no-value"""
[[exercises]]
name = "hashmaps3"
diff --git a/solutions/11_hashmaps/hashmaps2.rs b/solutions/11_hashmaps/hashmaps2.rs
index 4e18198..a5e6ef9 100644
--- a/solutions/11_hashmaps/hashmaps2.rs
+++ b/solutions/11_hashmaps/hashmaps2.rs
@@ -1 +1,95 @@
-// Solutions will be available before the stable release. Thank you for testing the beta version 🥰
+// We're collecting different fruits to bake a delicious fruit cake. For this,
+// we have a basket, which we'll represent in the form of a hash map. The key
+// represents the name of each fruit we collect and the value represents how
+// many of that particular fruit we have collected. Three types of fruits -
+// Apple (4), Mango (2) and Lychee (5) are already in the basket hash map. You
+// must add fruit to the basket so that there is at least one of each kind and
+// more than 11 in total - we have a lot of mouths to feed. You are not allowed
+// to insert any more of these fruits!
+
+use std::collections::HashMap;
+
+#[derive(Hash, PartialEq, Eq, Debug)]
+enum Fruit {
+ Apple,
+ Banana,
+ Mango,
+ Lychee,
+ Pineapple,
+}
+
+fn fruit_basket(basket: &mut HashMap<Fruit, u32>) {
+ let fruit_kinds = [
+ Fruit::Apple,
+ Fruit::Banana,
+ Fruit::Mango,
+ Fruit::Lychee,
+ Fruit::Pineapple,
+ ];
+
+ for fruit in fruit_kinds {
+ // If fruit doesn't exist, insert it with some value.
+ basket.entry(fruit).or_insert(5);
+ }
+}
+
+fn main() {
+ // You can optionally experiment here.
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ // Don't modify this function!
+ fn get_fruit_basket() -> HashMap<Fruit, u32> {
+ let content = [(Fruit::Apple, 4), (Fruit::Mango, 2), (Fruit::Lychee, 5)];
+ HashMap::from_iter(content)
+ }
+
+ #[test]
+ fn test_given_fruits_are_not_modified() {
+ let mut basket = get_fruit_basket();
+ fruit_basket(&mut basket);
+ assert_eq!(*basket.get(&Fruit::Apple).unwrap(), 4);
+ assert_eq!(*basket.get(&Fruit::Mango).unwrap(), 2);
+ assert_eq!(*basket.get(&Fruit::Lychee).unwrap(), 5);
+ }
+
+ #[test]
+ fn at_least_five_types_of_fruits() {
+ let mut basket = get_fruit_basket();
+ fruit_basket(&mut basket);
+ let count_fruit_kinds = basket.len();
+ assert!(count_fruit_kinds >= 5);
+ }
+
+ #[test]
+ fn greater_than_eleven_fruits() {
+ let mut basket = get_fruit_basket();
+ fruit_basket(&mut basket);
+ let count = basket.values().sum::<u32>();
+ assert!(count > 11);
+ }
+
+ #[test]
+ fn all_fruit_types_in_basket() {
+ let fruit_kinds = [
+ Fruit::Apple,
+ Fruit::Banana,
+ Fruit::Mango,
+ Fruit::Lychee,
+ Fruit::Pineapple,
+ ];
+
+ let mut basket = get_fruit_basket();
+ fruit_basket(&mut basket);
+
+ for fruit_kind in fruit_kinds {
+ let Some(amount) = basket.get(&fruit_kind) else {
+ panic!("Fruit kind {fruit_kind:?} was not found in basket");
+ };
+ assert!(*amount > 0);
+ }
+ }
+}