day_6: part 2 done

This commit is contained in:
2024-12-07 18:52:27 +01:00
parent b731175828
commit e63ce3640f
4 changed files with 58 additions and 28 deletions

View File

@@ -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 | | | | |

View File

@@ -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)
}

View File

@@ -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);
}

View File

@@ -25,6 +25,7 @@ pub struct Rule(pub u32, pub u32);
pub type Queue = Vec<u32>;
// 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<Vec<Floor>>;
#[derive(Clone, Copy)]
pub struct Guard {
pub x: usize,
pub y: usize,