|
1 |
| -use std::collections::HashMap; |
| 1 | +use std::collections::{HashMap, HashSet}; |
2 | 2 |
|
3 | 3 | pub fn solve_part1(input: &str) -> i32 {
|
4 | 4 | let map: Vec<Vec<char>> = parse_map(input);
|
5 |
| - scrape_map_for_guard(map).0 |
| 5 | + scrape_map_for_guard(&map).0 |
6 | 6 | }
|
7 | 7 |
|
8 | 8 | pub fn solve_part2(input: &str) -> i32 {
|
9 | 9 | let map = parse_map(input);
|
10 |
| - let mut map_variants: Vec<Vec<Vec<char>>> = vec![]; |
| 10 | + let path_to_walk = scrape_map_for_guard(&map).1; |
11 | 11 |
|
12 |
| - for (y, row) in map.iter().enumerate() { |
13 |
| - for (x, c) in row.iter().enumerate() { |
14 |
| - if *c != '^' || *c != 'v' || *c != '<' || *c != '>' { |
15 |
| - let mut map_variant = map.clone(); |
16 |
| - map_variant[y][x] = '#'; |
17 |
| - map_variants.push(map_variant); |
18 |
| - } |
| 12 | + let mut map_variants: Vec<Vec<Vec<char>>> = vec![]; |
| 13 | + for (x, y) in path_to_walk { |
| 14 | + let c = map[y as usize][x as usize]; |
| 15 | + if c != '^' || c != 'v' || c != '<' || c != '>' { |
| 16 | + let mut map_variant = map.clone(); |
| 17 | + map_variant[y as usize][x as usize] = '#'; |
| 18 | + map_variants.push(map_variant); |
19 | 19 | }
|
20 | 20 | }
|
21 | 21 |
|
22 | 22 | map_variants
|
23 | 23 | .iter()
|
24 |
| - .filter(|map_variant| scrape_map_for_guard(map_variant.to_vec()).1) |
| 24 | + .filter(|map_variant| scrape_map_for_guard(&map_variant.to_vec()).2) |
25 | 25 | .count() as i32
|
26 | 26 | }
|
27 | 27 |
|
28 |
| -fn scrape_map_for_guard(map: Vec<Vec<char>>) -> (i32, bool) { |
| 28 | +fn scrape_map_for_guard(map: &[Vec<char>]) -> (i32, HashSet<(i32, i32)>, bool) { |
29 | 29 | let mut direction: Direction = Direction::Up;
|
30 | 30 | let mut position: (i32, i32) = (0, 0);
|
31 | 31 | let mut dist_positions: HashMap<(i32, i32), i32> = HashMap::new();
|
| 32 | + let mut path_walked = HashSet::new(); |
32 | 33 | let mut infinite_loop = false;
|
33 | 34 |
|
34 | 35 | for (y, row) in map.iter().enumerate() {
|
@@ -104,9 +105,10 @@ fn scrape_map_for_guard(map: Vec<Vec<char>>) -> (i32, bool) {
|
104 | 105 | }
|
105 | 106 |
|
106 | 107 | position = new_position;
|
| 108 | + path_walked.insert(position); |
107 | 109 | }
|
108 | 110 |
|
109 |
| - ((dist_positions.len() + 1) as i32, infinite_loop) |
| 111 | + ((dist_positions.len() + 1) as i32, path_walked, infinite_loop) |
110 | 112 | }
|
111 | 113 |
|
112 | 114 | fn parse_map(input: &str) -> Vec<Vec<char>> {
|
|
0 commit comments