#[path = "../lib.rs"] mod lib; struct Game { id: u64, reveals: Vec<(u64, u64, u64)>, } fn parse(line: &str) -> Option { let (head, tail) = line.split_once(": ")?; let (_, id_str) = head.split_once(" ")?; let id = id_str.parse::().ok()?; let mut reveals = vec![]; for reveal_str in tail.split("; ") { let mut reveal = (0, 0, 0); for c in reveal_str.split(", ") { let (number, name) = c.split_once(" ")?; let n = number.parse::().ok()?; match name { "red" => reveal.0 = n, "green" => reveal.1 = n, "blue" => reveal.2 = n, _ => return None, } } reveals.push(reveal); } return Some(Game { id: id, reveals: reveals, }); } fn main() { let mut sum1 = 0; let mut sum2 = 0; for line in lib::iter_input() { let game = parse(&line).unwrap(); if game.reveals.iter().all( |(red, green, blue)| *red <= 12 && *green <= 13 && *blue <= 14 ) { sum1 += game.id; } let mut min_red = 0; let mut min_green = 0; let mut min_blue = 0; for reveal in game.reveals.iter() { min_red = min_red.max(reveal.0); min_green = min_green.max(reveal.1); min_blue = min_blue.max(reveal.2); } sum2 += min_red * min_green * min_blue; } println!("part1: {}", sum1); println!("part2: {}", sum2); }