diff --git a/day_06/src/main.rs b/day_06/src/main.rs index 9ec648f..0a87bc1 100644 --- a/day_06/src/main.rs +++ b/day_06/src/main.rs @@ -11,7 +11,7 @@ use std::{ io::{BufReader, prelude::*}, }; -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] enum Facing { Up, Down, @@ -54,7 +54,7 @@ impl Position { } } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] struct Guard { facing: Facing, position: Position, @@ -169,6 +169,33 @@ fn load_map(input_file: &str) -> Result<(Map, Guard), Box> { Ok((Map::new(data), guard_position)) } +fn simulate_guard_path(mut guard_position: Guard, map: Map) -> (usize, bool) { + let mut visited_set: HashSet = HashSet::new(); + visited_set.insert(*guard_position.position()); + let mut guard_states_set: HashSet = HashSet::new(); + + let mut infinite_loop = false; + loop { + if guard_states_set.contains(&guard_position) { + infinite_loop = true; + break; + } + let next_position = guard_position.next_position(); + match map.get_position(next_position) { + Some(true) => { + guard_position.turn_clockwise(); + } + Some(false) => { + guard_states_set.insert(guard_position); + guard_position.advance(); + visited_set.insert(next_position); + } + None => break, + } + } + (visited_set.len(), infinite_loop) +} + fn main() -> Result<(), Box> { // Handle command input let args: Vec = env::args().collect(); @@ -179,28 +206,15 @@ fn main() -> Result<(), Box> { ) } let input_file = &args[1]; - let (map, mut guard_position) = load_map(input_file)?; + let (map, guard_position) = load_map(input_file)?; println!("{}", map); println!("{:?}", guard_position); - let mut visited_set: HashSet = HashSet::new(); - visited_set.insert(*guard_position.position()); - loop { - let next_position = guard_position.next_position(); - match map.get_position(next_position) { - Some(true) => { - guard_position.turn_clockwise(); - } - Some(false) => { - guard_position.advance(); - visited_set.insert(next_position); - } - None => break, - } - } + let (locations_visited, infinite_loop) = simulate_guard_path(guard_position, map); - println!("Number of locations visited: {}", visited_set.len()); + println!("infinite_loop={}", infinite_loop); + println!("Number of locations visited: {}", locations_visited); Ok(()) }