pub fn task_one(input: &str) -> String { let list = parse_into_game_list(&input); let mut sum = 0; // only 12 red cubes, 13 green cubes, and 14 blue cubes for game in list { let mut game_possible = true; for draw in game.draws { if draw.red > 12 || draw.green > 13 || draw.blue > 14 { game_possible = false; break; } } if game_possible { sum += game.number; } } sum.to_string() } pub fn task_two(input: &str) -> String { let list = parse_into_game_list(&input); let mut sum = 0; for game in list { let mut highest_red = 0; let mut highest_green = 0; let mut highest_blue = 0; for draw in game.draws { if draw.red > highest_red { highest_red = draw.red; } if draw.green > highest_green { highest_green = draw.green; } if draw.blue > highest_blue { highest_blue = draw.blue; } } sum += highest_red * highest_green * highest_blue; } sum.to_string() } struct Game { draws: Vec, number: u32 } struct Draw { red: u32, green: u32, blue: u32 } fn parse_into_game_list(input: &str) -> Vec { let mut list = Vec::new(); for line in input.lines() { let mut game_number = 0; let mut draws = Vec::new(); // Game 4: 14 green, 14 red, 1 blue; 15 red, 13 green, 1 blue; 6 green, 15 red; 7 green let mut it = line.split_whitespace(); let mut draw = Draw { red: 0, green: 0, blue: 0 }; while let Some(val) = it.next() { if val.ends_with(":") { game_number = val.trim_matches(':').parse().unwrap(); } let number = val.parse::(); if number.is_ok() { let color_and_delimiter = it.next().unwrap(); let x: &[_] = &[';', ',']; let color = color_and_delimiter.trim_matches(x); match color { "green" => draw.green = number.unwrap(), "red" => draw.red = number.unwrap(), "blue" => draw.blue = number.unwrap(), _ => panic!("") } if color_and_delimiter.ends_with(";") { draws.push(draw); draw = Draw { red: 0, green: 0, blue: 0 }; } } } draws.push(draw); list.push(Game { draws, number: game_number }); } list }