day_6: part 2 done
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user