start,
}
}
+
+ fn guard_path(self: &mut Self) {
+ let mut turn_right: HashMap<(isize, isize), (isize, isize)> = HashMap::new();
+ turn_right.insert((-1,0), (0,1));
+ turn_right.insert((0,1), (1,0));
+ turn_right.insert((1,0), (0,-1));
+ turn_right.insert((0,-1), (-1,0));
+
+ let mut pos: (isize, isize) = self.start;
+ let mut dir: (isize, isize) = (-1, 0);
+ while self.map.contains_key(&pos) {
+ let mut c = self.map.get_mut(&pos).unwrap();
+ if "^.".contains(*c) {
+ *c = 'X';
+ }
+ if "#".contains(*c) {
+ pos = (pos.0 - dir.0, pos.1 - dir.1);
+ dir = *turn_right.get(&dir).unwrap();
+ }
+ pos = (pos.0 + dir.0, pos.1 + dir.1);
+ }
+ }
}
pub fn run(input: &str) -> Result<(), Box<dyn Error>> {
fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
println!("Running {} - part 1", get_day());
- let mut turn_right: HashMap<(isize, isize), (isize, isize)> = HashMap::new();
- turn_right.insert((-1,0), (0,1));
- turn_right.insert((0,1), (1,0));
- turn_right.insert((1,0), (0,-1));
- turn_right.insert((0,-1), (-1,0));
-
- let puzzle = Puzzle::new(input);
-
- let mut map = puzzle.map;
- let mut pos: (isize, isize) = puzzle.start;
- let mut dir: (isize, isize) = (-1, 0);
- while map.contains_key(&pos) {
- let mut c = map.get_mut(&pos).unwrap();
- if "^.".contains(*c) {
- *c = 'X';
- }
- if "#".contains(*c) {
- pos = (pos.0 - dir.0, pos.1 - dir.1);
- dir = *turn_right.get(&dir).unwrap();
- }
- pos = (pos.0 + dir.0, pos.1 + dir.1);
- }
+ let mut puzzle = Puzzle::new(input);
+
+ puzzle.guard_path();
- let res = map.into_iter()
+ let res = puzzle.map.into_iter()
.filter(|(_, c)| *c == 'X')
.count() as u32;