day_6: part 2 done
This commit is contained in:
@@ -8,7 +8,7 @@ https://adventofcode.com/2024
|
|||||||
| 03 | Mull It Over | :pushpin: | :pushpin: | Regex |
|
| 03 | Mull It Over | :pushpin: | :pushpin: | Regex |
|
||||||
| 04 | Ceres Search | :pushpin: | :pushpin: | Matrix multidirectional search |
|
| 04 | Ceres Search | :pushpin: | :pushpin: | Matrix multidirectional search |
|
||||||
| 05 | Print Queue | :pushpin: | :pushpin: | Queue order |
|
| 05 | Print Queue | :pushpin: | :pushpin: | Queue order |
|
||||||
| 06 | Guard Gallivant | :pushpin: | | 2D navigation |
|
| 06 | Guard Gallivant | :pushpin: | :pushpin: | 2D navigation |
|
||||||
| 07 | | | | |
|
| 07 | | | | |
|
||||||
| 08 | | | | |
|
| 08 | | | | |
|
||||||
| 09 | | | | |
|
| 09 | | | | |
|
||||||
|
|||||||
@@ -48,6 +48,20 @@ impl Guard {
|
|||||||
false
|
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) {
|
fn turn_90(&mut self) {
|
||||||
match self.dir {
|
match self.dir {
|
||||||
Direction::N => self.dir = Direction::E,
|
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 the_guard, floor_map) = utils::read_floor_map_and_guard_input(input);
|
||||||
|
|
||||||
let mut visited_coordinates: HashSet<(usize, usize)> = HashSet::new();
|
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.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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,41 +14,44 @@ pub fn today() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn historian_hysteria() {
|
pub fn historian_hysteria() {
|
||||||
|
// NOTE: previous days are commented to speed up (all the blame is on day 6)
|
||||||
// Sunday 01
|
// Sunday 01
|
||||||
let key = sun_01::get_key("./assets/day_1_input").unwrap();
|
// let key = sun_01::get_key("./assets/day_1_input").unwrap();
|
||||||
println!("The key is: {key}");
|
// println!("The key is: {key}");
|
||||||
let similarity = sun_01::get_similarity("./assets/day_1_input");
|
// let similarity = sun_01::get_similarity("./assets/day_1_input");
|
||||||
println!("The similarity is: {similarity}");
|
// println!("The similarity is: {similarity}");
|
||||||
|
|
||||||
// Monday 02
|
// Monday 02
|
||||||
let safe_report_count = mon_02::check_reports_safety("./assets/day_2_reports_input");
|
// let safe_report_count = mon_02::check_reports_safety("./assets/day_2_reports_input");
|
||||||
println!("There are {safe_report_count} safe reports");
|
// println!("There are {safe_report_count} safe reports");
|
||||||
|
|
||||||
// Tuesday 03
|
// Tuesday 03
|
||||||
let multiplication_added_result = tue_03::mull_it_over("./assets/day_3_instruction_input");
|
// let multiplication_added_result = tue_03::mull_it_over("./assets/day_3_instruction_input");
|
||||||
println!(
|
// println!(
|
||||||
"The result of the sum of multiplications is {}",
|
// "The result of the sum of multiplications is {}",
|
||||||
multiplication_added_result
|
// multiplication_added_result
|
||||||
);
|
// );
|
||||||
let conditional_multiplication_added_result =
|
// let conditional_multiplication_added_result =
|
||||||
tue_03::mull_it_over_conditional("./assets/day_3_instruction_input");
|
// tue_03::mull_it_over_conditional("./assets/day_3_instruction_input");
|
||||||
println!(
|
// println!(
|
||||||
"The result of the conditional sum of multiplications is {}",
|
// "The result of the conditional sum of multiplications is {}",
|
||||||
conditional_multiplication_added_result
|
// conditional_multiplication_added_result
|
||||||
);
|
// );
|
||||||
|
|
||||||
// Wednesday 04
|
// Wednesday 04
|
||||||
let (xmas_appearances, x_mas_appearances) = wed_04::ceres_search("./assets/day_4_input");
|
// let (xmas_appearances, x_mas_appearances) = wed_04::ceres_search("./assets/day_4_input");
|
||||||
println!("XMAS appears {} times", xmas_appearances);
|
// println!("XMAS appears {} times", xmas_appearances);
|
||||||
println!("X-MAS appears {} times", x_mas_appearances);
|
// println!("X-MAS appears {} times", x_mas_appearances);
|
||||||
|
|
||||||
// Thursday 05
|
// Thursday 05
|
||||||
let (queue_mid_sum, fixed_queue_mid_sum) =
|
// let (queue_mid_sum, fixed_queue_mid_sum) =
|
||||||
thu_05::mid_queue_sum("./assets/day_5_rules_queue_input");
|
// thu_05::mid_queue_sum("./assets/day_5_rules_queue_input");
|
||||||
println!("The update mid-queue-sum is {}", queue_mid_sum);
|
// println!("The update mid-queue-sum is {}", queue_mid_sum);
|
||||||
println!("The fixed update mid-queue-sum is {}", fixed_queue_mid_sum);
|
// println!("The fixed update mid-queue-sum is {}", fixed_queue_mid_sum);
|
||||||
|
|
||||||
// Friday 06
|
// 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 will visit {} positions", guard_position_count);
|
||||||
|
println!("The guard would loop on {} positions", loop_obstacle_count);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ pub struct Rule(pub u32, pub u32);
|
|||||||
pub type Queue = Vec<u32>;
|
pub type Queue = Vec<u32>;
|
||||||
|
|
||||||
// Guard Gallivant
|
// Guard Gallivant
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
pub enum Direction {
|
pub enum Direction {
|
||||||
N,
|
N,
|
||||||
S,
|
S,
|
||||||
@@ -38,6 +39,7 @@ pub enum Floor {
|
|||||||
pub type PositionCount = usize;
|
pub type PositionCount = usize;
|
||||||
pub type IsGuardOut = bool;
|
pub type IsGuardOut = bool;
|
||||||
pub type FloorMap = Vec<Vec<Floor>>;
|
pub type FloorMap = Vec<Vec<Floor>>;
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
pub struct Guard {
|
pub struct Guard {
|
||||||
pub x: usize,
|
pub x: usize,
|
||||||
pub y: usize,
|
pub y: usize,
|
||||||
|
|||||||
Reference in New Issue
Block a user