From 13a891400a297ceaf5f6f8bd261f9629d636f5b1 Mon Sep 17 00:00:00 2001 From: Luke Else Date: Sat, 2 Dec 2023 11:48:22 +0000 Subject: [PATCH] Day 2 Part 2 Complete --- src/input/day02_test2 | 5 ++++ src/solutions/day02.rs | 58 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/input/day02_test2 b/src/input/day02_test2 index e69de29..1cd7d33 100644 --- a/src/input/day02_test2 +++ b/src/input/day02_test2 @@ -0,0 +1,5 @@ +Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green +Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue +Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red +Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red +Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green \ No newline at end of file diff --git a/src/solutions/day02.rs b/src/solutions/day02.rs index 30c2716..3036f0b 100644 --- a/src/solutions/day02.rs +++ b/src/solutions/day02.rs @@ -32,7 +32,35 @@ impl Solution for Day02 { &self, input: &mut Vec, ) -> Result, Box> { - Ok(Box::new("Ready")) + let mut power = 0u32; + for game in input.iter().enumerate() { + let mut min_count: HashMap<&str, u32> = + HashMap::from([("red", 0), ("green", 0), ("blue", 0)]); + + let hands = game.1.split(';'); + + // Look at each time a handful is pulled out + for run in hands { + // Find the max number of instances of a given colour in a run + for colour in &mut min_count { + let num_cubes = self.get_num_cubes(run, colour.0)?; + if !num_cubes.is_empty() && num_cubes[0] > *colour.1 { + //Update with the new max + *colour.1 = num_cubes[0]; + } + } + } + + // Calculate the power for this given game + let mut game_power = 1u32; + for colour in &min_count { + game_power *= *colour.1; + } + + // Combine to formt he total power + power += game_power; + } + Ok(Box::new(power)) } fn get_day(&self) -> u8 { @@ -47,14 +75,9 @@ impl Day02 { colour_max: &HashMap<&'static str, u32>, ) -> Result> { for colour in colour_max { - let re = Regex::new(format!("[0-9]+(?= {})", colour.0).as_str())?; - - let nums_string: Vec<&str> = - re.find_iter(&input).map(|c| c.unwrap().as_str()).collect(); - - for num in nums_string { - // If just 1 game is over, return false - if num.parse::()? > *colour.1 { + let nums = self.get_num_cubes(input, colour.0)?; + for num in nums { + if num > *colour.1 { return Ok(false); } } @@ -62,6 +85,21 @@ impl Day02 { Ok(true) } + + fn get_num_cubes( + &self, + input: &str, + colour: &str, + ) -> Result, Box> { + let re = Regex::new(format!("[0-9]+(?= {})", colour).as_str())?; + + // Get the numbers correlating to a given colour and combine + let nums: Vec = re + .find_iter(&input) + .map(|c| c.unwrap().as_str().parse::().unwrap_or(0)) + .collect(); + Ok(nums) + } } /// Test from puzzle input @@ -101,6 +139,6 @@ mod test { .unwrap() .to_string(); - assert_eq!(answer, "Ready"); + assert_eq!(answer, "2286"); } }