Day 2 Part 2 Complete
This commit is contained in:
parent
2634f487e2
commit
13a891400a
@ -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
|
@ -32,7 +32,35 @@ impl Solution for Day02 {
|
||||
&self,
|
||||
input: &mut Vec<String>,
|
||||
) -> Result<Box<dyn std::fmt::Display>, Box<dyn std::error::Error>> {
|
||||
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<bool, Box<dyn std::error::Error>> {
|
||||
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::<u32>()? > *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<Vec<u32>, Box<dyn std::error::Error>> {
|
||||
let re = Regex::new(format!("[0-9]+(?= {})", colour).as_str())?;
|
||||
|
||||
// Get the numbers correlating to a given colour and combine
|
||||
let nums: Vec<u32> = re
|
||||
.find_iter(&input)
|
||||
.map(|c| c.unwrap().as_str().parse::<u32>().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");
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user