use std::io::BufRead; #[derive(Debug)] struct Game { id: usize, red: u32, blue: u32, green: u32, } impl From<&str> for Game { fn from(s: &str) -> Self { let (game, sets) = s.split_once(':').unwrap(); let (_, id) = game.split_once(' ').unwrap(); let id = id.parse::().unwrap(); let (mut r, mut g, mut b) = (0, 0, 0); let mut items: Vec<(u32, &str)> = vec![]; for set in sets.split(';') { let sublist = set.split(','); for list in sublist { let list = list.trim_start(); let (num, color) = list.split_once(' ').unwrap(); items.push((num.parse::().unwrap(), color)); } } for (num, color) in items { use std::cmp::max; match color { "red" => r = max(r, num), "green" => g = max(g, num), "blue" => b = max(b, num), _ => {} } } Self { id, red: r, green: g, blue: b, } } } fn solve_part_one(data: &str) -> u32 { let mut games: Vec = vec![]; for game in data.lines() { games.push(Game::from(game)); } let mut ans: u32 = 0; for game in games { if game.red <= 12 && game.green <= 13 && game.blue <= 14 { ans += game.id as u32; } } ans } fn solve_part_two(data: &str) -> u32 { let mut games: Vec = vec![]; for game in data.lines() { games.push(Game::from(game)); } games .iter() .map(|game| game.red * game.blue * game.green) .sum::() } fn main() { let test_1 = include_str!("../input/day2_1.test"); let prod = include_str!("../input/day2.prod"); println!("part_1 test: {:?}", solve_part_one(test_1)); println!("part_1 prod {:?}", solve_part_one(prod)); println!("part_2 test: {:?}", solve_part_two(test_1)); println!("part_2 prod {:?}", solve_part_two(prod)); }