day 16 part 1

This commit is contained in:
Dominic 2023-12-16 20:38:35 +01:00
parent ffb9985fd3
commit d03a079a05
Signed by: msrd0
GPG key ID: DCC8C247452E98F9
2 changed files with 275 additions and 0 deletions

110
inputs/day16.txt Normal file
View file

@ -0,0 +1,110 @@
\..|...................|........\..............\.................-......./........./...\..........-......./...
........../...-/......\.|............../.................\...........\........-.........|.....\.-.|...........
...............-...........|......|...|......../.......\............../.................................../...
..................................|............../..|.|.../............./..\\........|...|..............\..|..
...........................-...-...-.......................-.....-.-....\.......-............................/
........-...|.......|./../......................./.........................\.................../.....\........
\..\............-.\.........|../................................\....\......................./.............-..
|\...|....\................\...|........\-..............|............\.........\.\..|.|.......................
.....\.........\......|...-...............................-.............-../.../..--......\.....\.............
................|...........................|..........\...........././.................../............../....
.............................\......\.../..|................---................-......\....|...-............-.
..........|........./......\|...|.......|........\......\....-....\...-...../................/..-..../......-.
...|............./.................\../....|...\../.................|...|..|......|...........................
..................................-......../.....|............................................................
...................-.............|...-.........../...........................-..............-...............|.
..-.............../.............................-......-.....-.............|-...../....................../....
....||...../.........................................-...........................................--./-.......\
...................\..........-......./..............|\........................../.-.|..............-..-/...|.
.-............-............../..-........../.......................\...-...||........./.-.....-....../........
.......-.......-........................................../\\.......|......./../..\........\..-.........../../
....../../.......................\.........\-....\.|..................\......................./...-\..........
\.......-........\...-.....................\....-........./-...|......|.......-........................\...\..
...|\.................................../..../..........|......-......../-..|......./..........\../..|......-\
..........\...........................|..-........-/-......../....|...............................\.....|.....
..............\......-............................-.../........|........................./........-...........
.............-..\.//.....................-....-......|....../....-............................/..............|
\........../....|................./.....\......\.../.................|........\............../................
.....-........-/|.........\.....-./............|...\.|......|.......|...................\\.....\.............-
................|.-...-.....................|..........-....\....\......../...............................././
...........|.......\..............\......................................./........-..........................
...........................-..../............|............................|...........\.......................
....................|..........|..................../...........\.....|.........-............\.\...-..\.......
................................-......-......\.....-/......\...\................/................-...........
..|.....\..\......|../....................................................\\......-...../..../..............//
.........\.................\..\..-.-..................\.....\..\.....\..........-.............................
...................\............/..\............|.............../..\............................|\.\...../....
......|...............\.......|......|/........|....-.......|...........-.../.\....\.....|./.......|..........
....\/|................-.-..........|.................../..............|../-...|/..........|..................
..|........./-\.............|...|............|......\...................\..../.........|...............|.-....
...................-................\....|/....-...|......./....../..........-|............/......\../..\\....
...........................-..........................................-...|.|................\../...........-.
......../.....|.........-.......|........./-............|../.......|......-.-.-.......................-..|-...
.........|-...............|............./.....|........../..|........\..........|/.............../-...........
...\.....|..|...........\....-...\/.........................................|...................\......-.-....
.../...-...|.............|.....\...|.................................../..............\.................../...
..........-.........../....|.....|..-.........../.................................-..................\....\/..
....../..............\../......../.....-./....|../.\....-.................../............................../.\
......-.|..........................\...............|.......-...-....../.............//...\|................/..
................/.........|........................|......./..|......../-...........................\....|....
........../...|.........\...........-./......\\...........\......|-......|...\...............\................
../.........................|.................-/...........--.........\.../........................\.........\
........\..|...|.............../...................-.........|.................\..|......./.........-.....-|..
\.../.......|.............|-.../.................\...\..........\...|..........\....../......-................
............|.|....\..--............-/-..................../........................-../..\..-................
.....................................|.................../.................................|..../..-......\...
....|..............|..-.....|../.........................................|........\.................|.........
..............\..|...............\....||........../................................\................./.\......
.....................-../......./....../.................................-............\........../............
.....|.............../......-.\.|........-...................|.....-........\...-.............-....-.......-..
..../.....|..............\../..............................\........|....................|..............\.....
....\................-........\../......|..../......................-.....|............../.../........../.....
....-...........................-.............|...........\..|........|.......\././.....|./..........\........
/....................\..............\.............................-......................../\......../....-...
......\..................-............................................./.\...../.............\....-....\.\....
..................................\-............................/.......|........................-|...........
.................../.../.......|./............\.........\....-.-....-../\.........|........./...\.............
......./.../....|...../|......................|.....|.....|.........|...........\......-.\..................|.
..././...........................|.......\.|......-........./.................................................
........|.|.......................-....................././.......||...........|/....-....\.......|......\/...
.\.\.....|....\......-....|...|.....//........|..-.........-.................-........./......................
.|.....................\............-.................................|..../.............-....../.........../.
.|..\..../...............\..................../...\............................-....../................../.|..
./.\............................/.............-...../-................\.........\.............|...../.........
..........\...............................\............../.........\.....-/........./|........................
.............\..|....|..................................\.........|./......................\.........-........
../.....|-............|...\................|...-....-........./........|.-..........\.........................
........-............./...........--................../...............................|..|.\....\.............
\.............-\.........................-|......|/.........\............/...........-.../.\........\..\.../..
......................|........\....-../.............|......|.-...................................-|../...-...
.............|...|.....-...........|.....-...............|...\........................./..\....\..............
..............|.............-.........../....-..................................|......./........|............
...........|.-..../......................................\....-...\-......../........-..........-......-.....|
../...........-............-.../|...........-.-.............\.............................|.............-.....
.........../...-............../........./...................................../......-.......\\...............
........................./.||......|...../.......|....|..................-..........|......\..................
............/....-./..-...........|...-..........\....../...\/.......|\.....\....|........../..\.\............
.......................................-.../.......|............|........|...\..........\.....-...............
/..\|.............-...-.................................\........\...................\......|....-............
..................\............../........................./.........|..........\...\......\..........|......|
.../.................................................../...|............../....\...\...../........|.......-...
..................-.-..........................\.................-......................-..\.........-........
...................../\.....\.............\.............../................\.|............../........./.......
....................|../.\./......................................-.../.......\...............................
|........................-..............................................|...............................-.....
....\.\...........\......|.........\/|..|....|.....\............-...../.............................\\........
......\....|......\|.....-..................\........\.......................-............-.|..............|..
....|.....././.......................|......../...........-.|............./......-.|....../.....\......|....\.
.........\........|.......\..........|........./..................\.........................|................-
.....\..........\.....-......../...|-........../...\/|........................................................
.../.....................\../.........\.|.........-..........\...............................|...............\
.........-...........................................-.|...........\......//............../..|.\............/.
.-|../...../.........|............./..........................|..-.\......\............\................../...
../....../.................|..............\.........|.\......\...../.......\............\./.......|....../..\.
......../.-..-......\.........................\|...................................-....../...................
......................-....|........./\................|......\..-\....../.......\.................\/.-\......
............\...|...............|............./...........................................\....-.-............
\.........|.............................|............/.........-.....\........\|...-..-..\/.../......./.......
.............................\.|...............\....\..\-.....................\......-...../......\..../.....\
..\-......\.\........-........../........\...............\..................../....-....\.\.|.|...............
................|./........../.................................-.............|...................\............

165
src/bin/day16.rs Normal file
View file

@ -0,0 +1,165 @@
#![allow(clippy::enum_variant_names)]
#![forbid(elided_lifetimes_in_paths, unsafe_code)]
use aoc23::read;
use chumsky::prelude::*;
use std::collections::HashSet;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum Mirror {
NoMirror,
Forward,
Backward,
Horizontal,
Vertical
}
impl Mirror {
fn parser() -> impl Parser<char, Self, Error = Simple<char>> {
choice((
just('.').map(|_| Self::NoMirror),
just('/').map(|_| Self::Forward),
just('\\').map(|_| Self::Backward),
just('-').map(|_| Self::Horizontal),
just('|').map(|_| Self::Vertical)
))
}
}
fn parser() -> impl Parser<char, Vec<Vec<Mirror>>, Error = Simple<char>> {
Mirror::parser()
.repeated()
.then_ignore(just("\n"))
.repeated()
.then_ignore(end())
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
enum Direction {
Left,
Right,
Up,
Down
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
struct Beam {
row: usize,
col: usize,
dir: Direction
}
impl Beam {
fn step(mut self) -> Option<Self> {
use Direction::*;
match self.dir {
Left => {
self.col = self.col.checked_sub(1)?;
},
Right => {
self.col += 1;
},
Up => {
self.row = self.row.checked_sub(1)?;
},
Down => {
self.row += 1;
}
}
Some(self)
}
}
fn continue_beam(
grid: &[Vec<Mirror>],
energized: &mut HashSet<(usize, usize)>,
visited: &mut HashSet<Beam>,
beam: Beam,
_indent: usize
) {
if let Some(beam) = beam.step() {
if !visited.contains(&beam) {
follow_beam(grid, energized, visited, beam, _indent);
}
}
}
fn follow_beam(
grid: &[Vec<Mirror>],
energized: &mut HashSet<(usize, usize)>,
visited: &mut HashSet<Beam>,
mut beam: Beam,
_indent: usize
) {
use Direction::*;
use Mirror::*;
assert!(!visited.contains(&beam));
visited.insert(beam);
let mirror = grid.get(beam.row).and_then(|row| row.get(beam.col));
for _ in 0 .. _indent {
eprint!(" ");
}
eprintln!("\\- {beam:?}: {mirror:?}");
match (mirror, beam.dir) {
// we left the grid
(None, _) => return,
// we pass the beam through
(Some(NoMirror), _)
| (Some(Horizontal), Left)
| (Some(Horizontal), Right)
| (Some(Vertical), Up)
| (Some(Vertical), Down) => {},
// we reflect the beam (/)
(Some(Forward), Right) => beam.dir = Up,
(Some(Forward), Down) => beam.dir = Left,
(Some(Forward), Left) => beam.dir = Down,
(Some(Forward), Up) => beam.dir = Right,
// we reflect the beam (\)
(Some(Backward), Right) => beam.dir = Down,
(Some(Backward), Up) => beam.dir = Left,
(Some(Backward), Left) => beam.dir = Up,
(Some(Backward), Down) => beam.dir = Right,
// we split the beam
(Some(Horizontal), Up) | (Some(Horizontal), Down) => {
beam.dir = Left;
continue_beam(grid, energized, visited, beam, _indent + 1);
beam.dir = Right;
},
(Some(Vertical), Left) | (Some(Vertical), Right) => {
beam.dir = Up;
continue_beam(grid, energized, visited, beam, _indent + 1);
beam.dir = Down;
}
}
energized.insert((beam.row, beam.col));
continue_beam(grid, energized, visited, beam, _indent + 1);
for _ in 0 .. _indent {
eprint!(" ");
}
eprintln!(" -/ {beam:?}: {mirror:?}");
}
fn main() -> anyhow::Result<()> {
let grid = read("inputs/day16.txt", parser())?;
let mut energized = HashSet::new();
let mut visited = HashSet::new();
follow_beam(
&grid,
&mut energized,
&mut visited,
Beam {
row: 0,
col: 0,
dir: Direction::Right
},
0
);
println!("{}", energized.len());
Ok(())
}