mirror of
https://github.com/rust-lang/rustlings.git
synced 2024-12-27 15:56:28 +00:00
19b5e24d5c
I struggled with this exercise and didn't understand that it was looking for a summary of goals scored/conceded per team, instead of per match. My goal here is just to clarify the language, essentially saying "the total number of goals the team scored" to indicate that we are looking for a sum. Updated the exercise description to clarify this point. Relates loosely to closed issue https://github.com/rust-lang/rustlings/issues/1361
87 lines
2.7 KiB
Rust
87 lines
2.7 KiB
Rust
// hashmaps3.rs
|
|
//
|
|
// 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. One approach to build the scores table is to use a Hashmap.
|
|
// The solution is partially written to use a Hashmap,
|
|
// complete it to pass the test.
|
|
//
|
|
// Make me pass the tests!
|
|
//
|
|
// Execute `rustlings hint hashmaps3` or use the `hint` watch subcommand for a
|
|
// hint.
|
|
|
|
// I AM NOT DONE
|
|
|
|
use std::collections::HashMap;
|
|
|
|
// A structure to store the goal details of a team.
|
|
struct Team {
|
|
goals_scored: u8,
|
|
goals_conceded: u8,
|
|
}
|
|
|
|
fn build_scores_table(results: String) -> HashMap<String, Team> {
|
|
// The name of the team is the key and its associated struct is the value.
|
|
let mut scores: HashMap<String, Team> = HashMap::new();
|
|
|
|
for r in results.lines() {
|
|
let v: Vec<&str> = r.split(',').collect();
|
|
let team_1_name = v[0].to_string();
|
|
let team_1_score: u8 = v[2].parse().unwrap();
|
|
let team_2_name = v[1].to_string();
|
|
let team_2_score: u8 = v[3].parse().unwrap();
|
|
// TODO: Populate the scores table with details extracted from the
|
|
// current line. Keep in mind that goals scored by team_1
|
|
// will be the number of goals conceded by team_2, and similarly
|
|
// goals scored by team_2 will be the number of goals conceded by
|
|
// team_1.
|
|
}
|
|
scores
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
fn get_results() -> String {
|
|
let results = "".to_string()
|
|
+ "England,France,4,2\n"
|
|
+ "France,Italy,3,1\n"
|
|
+ "Poland,Spain,2,0\n"
|
|
+ "Germany,England,2,1\n";
|
|
results
|
|
}
|
|
|
|
#[test]
|
|
fn build_scores() {
|
|
let scores = build_scores_table(get_results());
|
|
|
|
let mut keys: Vec<&String> = scores.keys().collect();
|
|
keys.sort();
|
|
assert_eq!(
|
|
keys,
|
|
vec!["England", "France", "Germany", "Italy", "Poland", "Spain"]
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn validate_team_score_1() {
|
|
let scores = build_scores_table(get_results());
|
|
let team = scores.get("England").unwrap();
|
|
assert_eq!(team.goals_scored, 5);
|
|
assert_eq!(team.goals_conceded, 4);
|
|
}
|
|
|
|
#[test]
|
|
fn validate_team_score_2() {
|
|
let scores = build_scores_table(get_results());
|
|
let team = scores.get("Spain").unwrap();
|
|
assert_eq!(team.goals_scored, 0);
|
|
assert_eq!(team.goals_conceded, 2);
|
|
}
|
|
}
|