summaryrefslogtreecommitdiff
path: root/solutions
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-06-26 01:52:33 +0200
committermo8it <mo8it@proton.me>2024-06-26 01:52:33 +0200
commitf1bd4447924e797e8fb0012f6bc47a507438f3f5 (patch)
tree9a2e3ebb04bce9fe83dfa0658c41ac289658bd5d /solutions
parentfbc226a51043f7c9be4c414292d37d3ce97038fe (diff)
hashmaps3 solution
Diffstat (limited to 'solutions')
-rw-r--r--solutions/11_hashmaps/hashmaps3.rs84
1 files changed, 83 insertions, 1 deletions
diff --git a/solutions/11_hashmaps/hashmaps3.rs b/solutions/11_hashmaps/hashmaps3.rs
index 4e18198..f4059bb 100644
--- a/solutions/11_hashmaps/hashmaps3.rs
+++ b/solutions/11_hashmaps/hashmaps3.rs
@@ -1 +1,83 @@
-// Solutions will be available before the stable release. Thank you for testing the beta version 🥰
+// A list of scores (one per line) of a soccer match is given. Each line is of
+// the form "<team_1_name>,<team_2_name>,<team_1_goals>,<team_2_goals>"
+// Example: "England,France,4,2" (England scored 4 goals, France 2).
+//
+// You have to build a scores table containing the name of the team, the total
+// number of goals the team scored, and the total number of goals the team
+// conceded.
+
+use std::collections::HashMap;
+
+// A structure to store the goal details of a team.
+#[derive(Default)]
+struct Team {
+ goals_scored: u8,
+ goals_conceded: u8,
+}
+
+fn build_scores_table(results: &str) -> HashMap<&str, Team> {
+ // The name of the team is the key and its associated struct is the value.
+ let mut scores = HashMap::new();
+
+ for line in results.lines() {
+ let mut split_iterator = line.split(',');
+ // NOTE: We use `unwrap` because we didn't deal with error handling yet.
+ let team_1_name = split_iterator.next().unwrap();
+ let team_2_name = split_iterator.next().unwrap();
+ let team_1_score: u8 = split_iterator.next().unwrap().parse().unwrap();
+ let team_2_score: u8 = split_iterator.next().unwrap().parse().unwrap();
+
+ // Insert the default with zeros if a team doesn't exist yet.
+ let mut team_1 = scores.entry(team_1_name).or_insert_with(|| Team::default());
+ // Update the values.
+ team_1.goals_scored += team_1_score;
+ team_1.goals_conceded += team_2_score;
+
+ // Similarely for the second team.
+ let mut team_2 = scores.entry(team_2_name).or_insert_with(|| Team::default());
+ team_2.goals_scored += team_2_score;
+ team_2.goals_conceded += team_1_score;
+ }
+
+ scores
+}
+
+fn main() {
+ // You can optionally experiment here.
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ const RESULTS: &str = "England,France,4,2
+France,Italy,3,1
+Poland,Spain,2,0
+Germany,England,2,1
+England,Spain,1,0";
+
+ #[test]
+ fn build_scores() {
+ let scores = build_scores_table(RESULTS);
+
+ assert!(["England", "France", "Germany", "Italy", "Poland", "Spain"]
+ .into_iter()
+ .all(|team_name| scores.contains_key(team_name)));
+ }
+
+ #[test]
+ fn validate_team_score_1() {
+ let scores = build_scores_table(RESULTS);
+ let team = scores.get("England").unwrap();
+ assert_eq!(team.goals_scored, 6);
+ assert_eq!(team.goals_conceded, 4);
+ }
+
+ #[test]
+ fn validate_team_score_2() {
+ let scores = build_scores_table(RESULTS);
+ let team = scores.get("Spain").unwrap();
+ assert_eq!(team.goals_scored, 0);
+ assert_eq!(team.goals_conceded, 3);
+ }
+}