Skip to content

Commit bd98b9f

Browse files
committed
[2023] Add solution for day 16
1 parent ef1cbc5 commit bd98b9f

File tree

2 files changed

+174
-0
lines changed

2 files changed

+174
-0
lines changed

aoc2023/inputs/day16.input

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
\|.....-.....\....../.....-....................................../....-.............|.......|....|...\........
2+
...............|...|...........-............../......../..|.........|..../....-.-.|...........|..............|
3+
.........|....\......-..............................|.....\..........\........../.../...../..\...........|....
4+
...-................................................./.-...-..................../....../..|....|..............
5+
\...|...|-.............................................................................-.................--|..
6+
...............|.....|.......\..|.....-................................|.........../............/.........../.
7+
.\....\............./............|...........\...|.....................\.-.\......-............|...........\..
8+
./..........................\..\.........|.-...............................|........|..-....-............/....
9+
............/....................-........../.....................................-.................|.........
10+
..................................|/....-......................|............./...............\...............-
11+
............|||.....\....|....|.........-................\..............\.................-...............\...
12+
......-...........................-.......\.....................-..............-...|....\.....-...............
13+
./............/.-|.\/.......-./\........\..\-.............../....-.....-........././...........|............\.
14+
.-..-.............-\...............................|....\......||/.......|....../...|.................\.......
15+
..|/..............................|.|............../........-..........\/......./.......--...........|........
16+
...-/.....\........\...|.................................\.../.................\-......../...........\........
17+
................-...|............/........./\\.................../......../|.........../.........|-..\........
18+
............\............./\....................|//.......|-|...-/........\..............................-....
19+
..................|...../..................\..|.........\.............|...................|........\...-...|..
20+
........../................../............................./.........|.................\...............-\../..
21+
.../...........\....|.................\.........................................../.......................//..
22+
/..\..................................\....|.................|..-....|......................|.....|...........
23+
.....-.......\.........-.-.....|.................\-.............|........./................/.\-.........|.....
24+
.........-....-...................../..//...../....../..........|......./../.........--....-......\..../......
25+
.....\\............................./.../....../...../......./.........../..-..........|-.....................
26+
.............|.|........................../.......-......|..-..........|.............\..................../../
27+
.../...../..\.........|.........................\.....\....-...........-.....\....................\...........
28+
..................../........./.|....|............................../......-..../................./...|.......
29+
..........................|....|...\.............\..................-.....\-..................................
30+
......\...\......./..\.-.....-.......-...|...........-.........\.-....../...-.../................-............
31+
.....................\.........................|.............................-...\............-.../...........
32+
...../\...-../..|................/............../...........|/.-........-.................../.......-.....-...
33+
...../.......|...............................................................................|....-......\....
34+
-........................../....|.....\.................|......-/...................|...|/....................
35+
..|...\...............-.............\.........../...../\.....|...........-..-.\....../....../...........|.....
36+
....../...-..\...........\....../......|...\............../.................-...............|.\.-.............
37+
../........|......../....../..|..........................\......-.............\.|.\...|/...../|...............
38+
......|.......\-....\...|........-.........|.....|.....\--................-............\..................|...
39+
|......../.......-.\....\...........|...................|......|...../...|..|........\....\....../............
40+
......|..............-../..\..../................./.......\.......\...\......../...../........................
41+
.-........................|.../...|...........|.......\...........|.\........................-............/...
42+
............................../\..........-.|.//..............................|/.........\..................|.
43+
.........................../................/......................../..........|...................\./.......
44+
.....|....../...../............../.....-.|./\............|.....................|..............\...............
45+
.....\|.........\./.../.......|.\................../..........-............/......\...................-...|/..
46+
....--.........//.....-\........................\//.....-|......|./.............\...............|-.../......|.
47+
.\....................................../..........-..\....\...\...|..................-.......................
48+
../\............|....|\.|\................/............|.../...............................\......../.--......
49+
....................-............/....|.|....||.....................|..........|./...\...--...../....\....|...
50+
......-....|.................-.-.....|................|........../........\...|.............|/...........\....
51+
....................-...-................-./|./.............................-.............../.................
52+
........|.-.........../..../..||.......\........../................................/..........................
53+
.........|..-....-..-......./......|\......................-..........-...\...|....\.../..|..\........./......
54+
........................\............/...........\.-..........\.\..|\.../.....\...........|.....|..../....\...
55+
.......-.\.......................-.../.........................\/........\.\..|...............................
56+
................./..-.|................-..\.......|....................\.......................|.....-........
57+
./.-.....................|............./........||-......|......-../............-.....-.......|...-.|........-
58+
.........-.\../................/....--...-................-....-................/......./.....././-../\.......
59+
...|......\./.......\|....\....\....\.........../.....|..........|...................|................\....../
60+
...|............\-.........................-................................../.......\.-..........//.........
61+
..\....../...........................-...-....-.......-...............|..................../........./......|.
62+
.././............................/............|...............-........|...............|.........-......\./...
63+
.......-.....\............|.........-\..............-\-............/..\.../\.|..|..../........................
64+
............|..-....\................................-...|-..-/...................-......./\............./....
65+
........\...................\.|...|......................|.........../...\-..\...\..........................\.
66+
........\......-.....|...-............./.......-...............\...-..-..........-.-................-......\..
67+
..|..........\..............-.-..............\........../................/....................................
68+
.....................\................../.........../..-...................-...\...................|.\..-.....
69+
...........|.................|../....\........|...\-./...............|...........\...........\..............-.
70+
...................................................................\............|..........................-..
71+
............|..............\....|................|............-.....|....|.................\.........|..|.....
72+
........................|......\..............-.../............-.|/.-........................\................
73+
.......................|......../....../........-............-......./....................|....../............
74+
.........-............\...........|....................\.......\.................\.\...../../-..............-.
75+
.\.......\....-/...............-.......................-............................|.|......\....-.......\|..
76+
....\..\..........................\/.\...|.............-.|..................../.......-.\/....|..............\
77+
........................../.........|..-\...-......-....\.../.........-.../....-.......|...-............\.-...
78+
.....\.........\......|........../.../.............|.....\../..|...........\.......................-......\...
79+
|.........|....|../....\..................................\...../.........\............................\.\.../
80+
-...../...\.............-...//...............\........\...|.-.....................\....|.....\...--...........
81+
....|...-..-...|\.....-\..........|..............|........................-/.....-............./..............
82+
.-.........................\../.......|............|..|.|..|.|....../.....|-../\.............\.../.\......\...
83+
................\.........|...\...|....|..........|..........\................................-...............
84+
.........../-\.....-/.....|.\./........-................/.-.....\...........\..........\......................
85+
../..|\...|./............................../.|.......|....\...............|.................\................-
86+
...-...............|.....|...-.........-.|........\.....-...........\...............-......-.|.\..............
87+
................/.-.-.........................\.-..|.\................................................|....../
88+
....................-..|...........|.......|.........-.\....................................-....../....-.....
89+
.....................-..........................-.............................\.\....|...-...\...|..|.........
90+
./\........-..................................|................|..........................|...\|......\.......
91+
...\.......-..........-......................|...........................-...|................................
92+
..................................././.....|....|........\|.....|..-...............\\.................-.......
93+
.-.....././.......|...................-...................-................................................../
94+
..-..|......../.....|...................\..../....................................|..\...-\................/..
95+
..................|.........................../......\..-....\............|-/..-................\|../...\...-.
96+
............../-..-..../............................../........|.......................................\./.|..
97+
....\......\....|....................-....|........................-\...|........\......................\.....
98+
.........|...........|.............................-..................\.\............/.../....................
99+
.|..-.......................|...............|..-............../.\................./.....\......-..|...........
100+
..-.../.......................................-/.........|........-.............-......\........./...\../.....
101+
......................\/...............|................\../............-.........|......\....................
102+
...........-|.................../...../\..../........|.....-............................/-.|..\\.../..........
103+
.........\.......|......../......./.......\..|.....-..............|................................|..........
104+
....................................|........|/.......-.......|.........|//...................................
105+
...........|......\...../../....................\..\......................./..........-......-.....|..........
106+
../................./..-.........................-..........\-|......./.....-.\.........\.....................
107+
..............................\.......|....\.....................................................-....\....|..
108+
.........-\...............\...../\......-.....\................./........................-....\...............
109+
.|............................................-..../../\......................................./....\........\
110+
-........-...........|............./..........-...............................-.......-..../..................

aoc2023/src/day16.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use std::{
2+
collections::{HashMap, HashSet, VecDeque},
3+
fs::File,
4+
io::{self, BufRead},
5+
};
6+
7+
fn main() {
8+
let file = File::open("aoc2023/inputs/day16.input").unwrap();
9+
let mut layout = HashMap::new();
10+
let mut width = 0;
11+
let mut height = 0;
12+
for (y, l) in io::BufReader::new(file)
13+
.lines()
14+
.map(|l| l.unwrap())
15+
.enumerate()
16+
{
17+
for (x, c) in l.chars().enumerate() {
18+
layout.insert((x, y), c);
19+
width = x as i32;
20+
}
21+
height = y as i32;
22+
}
23+
println!("part 1: {}", energized(((0, 0), (1, 0)), &layout));
24+
let mut max_energize = 0;
25+
let edges = (0..width)
26+
.flat_map(|x| vec![((x, 0), (0, 1)), ((x, height), (0, -1))])
27+
.chain((0..height).flat_map(|y| vec![((0, y), (1, 0)), ((width, y), (-1, 0))]));
28+
for edge in edges {
29+
max_energize = max_energize.max(energized(edge, &layout));
30+
}
31+
println!("part 2: {}", max_energize);
32+
}
33+
34+
fn energized(initial: ((i32, i32), (i32, i32)), layout: &HashMap<(usize, usize), char>) -> usize {
35+
let mut seen = HashSet::new();
36+
let mut to_visit = VecDeque::from(vec![initial]);
37+
while let Some(state @ ((x, y), (dx, dy))) = to_visit.pop_front() {
38+
let Some(tile) = layout.get(&(x as usize, y as usize)) else {
39+
continue;
40+
};
41+
if !seen.insert(state) {
42+
continue;
43+
}
44+
let new_dirs = match tile {
45+
'.' => vec![(dx, dy)],
46+
'/' => vec![(-dy, -dx)],
47+
'\\' => vec![(dy, dx)],
48+
'-' if dy == 0 => vec![(dx, dy)],
49+
'-' => vec![(1, 0), (-1, 0)],
50+
'|' if dx == 0 => vec![(dx, dy)],
51+
'|' => vec![(0, 1), (0, -1)],
52+
_ => continue,
53+
};
54+
to_visit.extend(
55+
new_dirs
56+
.into_iter()
57+
.map(|(dx, dy)| ((x + dx, y + dy), (dx, dy))),
58+
);
59+
}
60+
seen.into_iter()
61+
.map(|(pos, _)| pos)
62+
.collect::<HashSet<_>>()
63+
.len()
64+
}

0 commit comments

Comments
 (0)