diff --git a/README.md b/README.md index 2c994de..4d18f04 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ https://adventofcode.com/2024 | 03 | Mull It Over | :pushpin: | :pushpin: | Regex | | 04 | Ceres Search | :pushpin: | :pushpin: | Matrix multidirectional search | | 05 | Print Queue | :pushpin: | :pushpin: | Queue order | -| 06 | Guard Gallivant | :pushpin: | | 2D navigation | +| 06 | Guard Gallivant | :pushpin: | :pushpin: | 2D navigation | | 07 | | | | | | 08 | | | | | | 09 | | | | | diff --git a/src/advent_of_code/fri_06.rs b/src/advent_of_code/fri_06.rs index 4f247a2..7536580 100644 --- a/src/advent_of_code/fri_06.rs +++ b/src/advent_of_code/fri_06.rs @@ -48,6 +48,20 @@ impl Guard { false } + fn will_loop(&mut self, map: &FloorMap) -> bool { + let mut prev_positions: HashSet<(usize, usize, usize)> = HashSet::new(); + + while !self.step(map) { + let new_prev_position = (self.x, self.y, self.dir as usize); + if prev_positions.contains(&new_prev_position) { + return true; + } + prev_positions.insert(new_prev_position); + } + + false + } + fn turn_90(&mut self) { match self.dir { Direction::N => self.dir = Direction::E, @@ -58,7 +72,7 @@ impl Guard { } } -pub fn guard_gallivant(input: &str) -> PositionCount { +pub fn guard_gallivant(input: &str) -> (PositionCount, usize) { let (mut the_guard, floor_map) = utils::read_floor_map_and_guard_input(input); let mut visited_coordinates: HashSet<(usize, usize)> = HashSet::new(); @@ -69,5 +83,16 @@ pub fn guard_gallivant(input: &str) -> PositionCount { visited_coordinates.insert((the_guard.x, the_guard.y)); } - visited_coordinates.len() + let (the_guard, mut floor_map) = utils::read_floor_map_and_guard_input(input); + let mut loop_obstacles_count: usize = 0; + for visited in &visited_coordinates { + let mut temp_guard = the_guard.clone(); + floor_map[visited.1][visited.0] = Floor::Obstacle; + if temp_guard.will_loop(&floor_map) { + loop_obstacles_count += 1; + } + floor_map[visited.1][visited.0] = Floor::Clear; + } + + (visited_coordinates.len(), loop_obstacles_count) } diff --git a/src/advent_of_code/mod.rs b/src/advent_of_code/mod.rs index a7ffd5c..082ff57 100644 --- a/src/advent_of_code/mod.rs +++ b/src/advent_of_code/mod.rs @@ -14,41 +14,44 @@ pub fn today() { } pub fn historian_hysteria() { + // NOTE: previous days are commented to speed up (all the blame is on day 6) // Sunday 01 - let key = sun_01::get_key("./assets/day_1_input").unwrap(); - println!("The key is: {key}"); - let similarity = sun_01::get_similarity("./assets/day_1_input"); - println!("The similarity is: {similarity}"); + // let key = sun_01::get_key("./assets/day_1_input").unwrap(); + // println!("The key is: {key}"); + // let similarity = sun_01::get_similarity("./assets/day_1_input"); + // println!("The similarity is: {similarity}"); // Monday 02 - let safe_report_count = mon_02::check_reports_safety("./assets/day_2_reports_input"); - println!("There are {safe_report_count} safe reports"); + // let safe_report_count = mon_02::check_reports_safety("./assets/day_2_reports_input"); + // println!("There are {safe_report_count} safe reports"); // Tuesday 03 - let multiplication_added_result = tue_03::mull_it_over("./assets/day_3_instruction_input"); - println!( - "The result of the sum of multiplications is {}", - multiplication_added_result - ); - let conditional_multiplication_added_result = - tue_03::mull_it_over_conditional("./assets/day_3_instruction_input"); - println!( - "The result of the conditional sum of multiplications is {}", - conditional_multiplication_added_result - ); + // let multiplication_added_result = tue_03::mull_it_over("./assets/day_3_instruction_input"); + // println!( + // "The result of the sum of multiplications is {}", + // multiplication_added_result + // ); + // let conditional_multiplication_added_result = + // tue_03::mull_it_over_conditional("./assets/day_3_instruction_input"); + // println!( + // "The result of the conditional sum of multiplications is {}", + // conditional_multiplication_added_result + // ); // Wednesday 04 - let (xmas_appearances, x_mas_appearances) = wed_04::ceres_search("./assets/day_4_input"); - println!("XMAS appears {} times", xmas_appearances); - println!("X-MAS appears {} times", x_mas_appearances); + // let (xmas_appearances, x_mas_appearances) = wed_04::ceres_search("./assets/day_4_input"); + // println!("XMAS appears {} times", xmas_appearances); + // println!("X-MAS appears {} times", x_mas_appearances); // Thursday 05 - let (queue_mid_sum, fixed_queue_mid_sum) = - thu_05::mid_queue_sum("./assets/day_5_rules_queue_input"); - println!("The update mid-queue-sum is {}", queue_mid_sum); - println!("The fixed update mid-queue-sum is {}", fixed_queue_mid_sum); + // let (queue_mid_sum, fixed_queue_mid_sum) = + // thu_05::mid_queue_sum("./assets/day_5_rules_queue_input"); + // println!("The update mid-queue-sum is {}", queue_mid_sum); + // println!("The fixed update mid-queue-sum is {}", fixed_queue_mid_sum); // Friday 06 - let guard_position_count = fri_06::guard_gallivant("./assets/day_6_guard_map_input"); + let (guard_position_count, loop_obstacle_count) = + fri_06::guard_gallivant("./assets/day_6_guard_map_input"); println!("The guard will visit {} positions", guard_position_count); + println!("The guard would loop on {} positions", loop_obstacle_count); } diff --git a/src/advent_of_code/types.rs b/src/advent_of_code/types.rs index b524c29..47998ca 100644 --- a/src/advent_of_code/types.rs +++ b/src/advent_of_code/types.rs @@ -25,6 +25,7 @@ pub struct Rule(pub u32, pub u32); pub type Queue = Vec; // Guard Gallivant +#[derive(Clone, Copy)] pub enum Direction { N, S, @@ -38,6 +39,7 @@ pub enum Floor { pub type PositionCount = usize; pub type IsGuardOut = bool; pub type FloorMap = Vec>; +#[derive(Clone, Copy)] pub struct Guard { pub x: usize, pub y: usize,