Pull simulation code out into it's own function

This commit is contained in:
2025-06-04 11:20:31 -05:00
parent 050566e8d9
commit 8e34ef72b8

View File

@@ -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<dyn Error>> {
Ok((Map::new(data), guard_position))
}
fn simulate_guard_path(mut guard_position: Guard, map: Map) -> (usize, bool) {
let mut visited_set: HashSet<Position> = HashSet::new();
visited_set.insert(*guard_position.position());
let mut guard_states_set: HashSet<Guard> = 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<dyn Error>> {
// Handle command input
let args: Vec<String> = env::args().collect();
@@ -179,28 +206,15 @@ fn main() -> Result<(), Box<dyn Error>> {
)
}
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<Position> = 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(())
}