day 16 part 1
This commit is contained in:
parent
ffb9985fd3
commit
d03a079a05
2 changed files with 275 additions and 0 deletions
110
inputs/day16.txt
Normal file
110
inputs/day16.txt
Normal file
|
@ -0,0 +1,110 @@
|
|||
\..|...................|........\..............\.................-......./........./...\..........-......./...
|
||||
........../...-/......\.|............../.................\...........\........-.........|.....\.-.|...........
|
||||
...............-...........|......|...|......../.......\............../.................................../...
|
||||
..................................|............../..|.|.../............./..\\........|...|..............\..|..
|
||||
...........................-...-...-.......................-.....-.-....\.......-............................/
|
||||
........-...|.......|./../......................./.........................\.................../.....\........
|
||||
\..\............-.\.........|../................................\....\......................./.............-..
|
||||
|\...|....\................\...|........\-..............|............\.........\.\..|.|.......................
|
||||
.....\.........\......|...-...............................-.............-../.../..--......\.....\.............
|
||||
................|...........................|..........\...........././.................../............../....
|
||||
.............................\......\.../..|................---................-......\....|...-............-.
|
||||
..........|........./......\|...|.......|........\......\....-....\...-...../................/..-..../......-.
|
||||
...|............./.................\../....|...\../.................|...|..|......|...........................
|
||||
..................................-......../.....|............................................................
|
||||
...................-.............|...-.........../...........................-..............-...............|.
|
||||
..-.............../.............................-......-.....-.............|-...../....................../....
|
||||
....||...../.........................................-...........................................--./-.......\
|
||||
...................\..........-......./..............|\........................../.-.|..............-..-/...|.
|
||||
.-............-............../..-........../.......................\...-...||........./.-.....-....../........
|
||||
.......-.......-........................................../\\.......|......./../..\........\..-.........../../
|
||||
....../../.......................\.........\-....\.|..................\......................./...-\..........
|
||||
\.......-........\...-.....................\....-........./-...|......|.......-........................\...\..
|
||||
...|\.................................../..../..........|......-......../-..|......./..........\../..|......-\
|
||||
..........\...........................|..-........-/-......../....|...............................\.....|.....
|
||||
..............\......-............................-.../........|........................./........-...........
|
||||
.............-..\.//.....................-....-......|....../....-............................/..............|
|
||||
\........../....|................./.....\......\.../.................|........\............../................
|
||||
.....-........-/|.........\.....-./............|...\.|......|.......|...................\\.....\.............-
|
||||
................|.-...-.....................|..........-....\....\......../...............................././
|
||||
...........|.......\..............\......................................./........-..........................
|
||||
...........................-..../............|............................|...........\.......................
|
||||
....................|..........|..................../...........\.....|.........-............\.\...-..\.......
|
||||
................................-......-......\.....-/......\...\................/................-...........
|
||||
..|.....\..\......|../....................................................\\......-...../..../..............//
|
||||
.........\.................\..\..-.-..................\.....\..\.....\..........-.............................
|
||||
...................\............/..\............|.............../..\............................|\.\...../....
|
||||
......|...............\.......|......|/........|....-.......|...........-.../.\....\.....|./.......|..........
|
||||
....\/|................-.-..........|.................../..............|../-...|/..........|..................
|
||||
..|........./-\.............|...|............|......\...................\..../.........|...............|.-....
|
||||
...................-................\....|/....-...|......./....../..........-|............/......\../..\\....
|
||||
...........................-..........................................-...|.|................\../...........-.
|
||||
......../.....|.........-.......|........./-............|../.......|......-.-.-.......................-..|-...
|
||||
.........|-...............|............./.....|........../..|........\..........|/.............../-...........
|
||||
...\.....|..|...........\....-...\/.........................................|...................\......-.-....
|
||||
.../...-...|.............|.....\...|.................................../..............\.................../...
|
||||
..........-.........../....|.....|..-.........../.................................-..................\....\/..
|
||||
....../..............\../......../.....-./....|../.\....-.................../............................../.\
|
||||
......-.|..........................\...............|.......-...-....../.............//...\|................/..
|
||||
................/.........|........................|......./..|......../-...........................\....|....
|
||||
........../...|.........\...........-./......\\...........\......|-......|...\...............\................
|
||||
../.........................|.................-/...........--.........\.../........................\.........\
|
||||
........\..|...|.............../...................-.........|.................\..|......./.........-.....-|..
|
||||
\.../.......|.............|-.../.................\...\..........\...|..........\....../......-................
|
||||
............|.|....\..--............-/-..................../........................-../..\..-................
|
||||
.....................................|.................../.................................|..../..-......\...
|
||||
....|..............|..-.....|../.........................................|........\.................|.........
|
||||
..............\..|...............\....||........../................................\................./.\......
|
||||
.....................-../......./....../.................................-............\........../............
|
||||
.....|.............../......-.\.|........-...................|.....-........\...-.............-....-.......-..
|
||||
..../.....|..............\../..............................\........|....................|..............\.....
|
||||
....\................-........\../......|..../......................-.....|............../.../........../.....
|
||||
....-...........................-.............|...........\..|........|.......\././.....|./..........\........
|
||||
/....................\..............\.............................-......................../\......../....-...
|
||||
......\..................-............................................./.\...../.............\....-....\.\....
|
||||
..................................\-............................/.......|........................-|...........
|
||||
.................../.../.......|./............\.........\....-.-....-../\.........|........./...\.............
|
||||
......./.../....|...../|......................|.....|.....|.........|...........\......-.\..................|.
|
||||
..././...........................|.......\.|......-........./.................................................
|
||||
........|.|.......................-....................././.......||...........|/....-....\.......|......\/...
|
||||
.\.\.....|....\......-....|...|.....//........|..-.........-.................-........./......................
|
||||
.|.....................\............-.................................|..../.............-....../.........../.
|
||||
.|..\..../...............\..................../...\............................-....../................../.|..
|
||||
./.\............................/.............-...../-................\.........\.............|...../.........
|
||||
..........\...............................\............../.........\.....-/........./|........................
|
||||
.............\..|....|..................................\.........|./......................\.........-........
|
||||
../.....|-............|...\................|...-....-........./........|.-..........\.........................
|
||||
........-............./...........--................../...............................|..|.\....\.............
|
||||
\.............-\.........................-|......|/.........\............/...........-.../.\........\..\.../..
|
||||
......................|........\....-../.............|......|.-...................................-|../...-...
|
||||
.............|...|.....-...........|.....-...............|...\........................./..\....\..............
|
||||
..............|.............-.........../....-..................................|......./........|............
|
||||
...........|.-..../......................................\....-...\-......../........-..........-......-.....|
|
||||
../...........-............-.../|...........-.-.............\.............................|.............-.....
|
||||
.........../...-............../........./...................................../......-.......\\...............
|
||||
........................./.||......|...../.......|....|..................-..........|......\..................
|
||||
............/....-./..-...........|...-..........\....../...\/.......|\.....\....|........../..\.\............
|
||||
.......................................-.../.......|............|........|...\..........\.....-...............
|
||||
/..\|.............-...-.................................\........\...................\......|....-............
|
||||
..................\............../........................./.........|..........\...\......\..........|......|
|
||||
.../.................................................../...|............../....\...\...../........|.......-...
|
||||
..................-.-..........................\.................-......................-..\.........-........
|
||||
...................../\.....\.............\.............../................\.|............../........./.......
|
||||
....................|../.\./......................................-.../.......\...............................
|
||||
|........................-..............................................|...............................-.....
|
||||
....\.\...........\......|.........\/|..|....|.....\............-...../.............................\\........
|
||||
......\....|......\|.....-..................\........\.......................-............-.|..............|..
|
||||
....|.....././.......................|......../...........-.|............./......-.|....../.....\......|....\.
|
||||
.........\........|.......\..........|........./..................\.........................|................-
|
||||
.....\..........\.....-......../...|-........../...\/|........................................................
|
||||
.../.....................\../.........\.|.........-..........\...............................|...............\
|
||||
.........-...........................................-.|...........\......//............../..|.\............/.
|
||||
.-|../...../.........|............./..........................|..-.\......\............\................../...
|
||||
../....../.................|..............\.........|.\......\...../.......\............\./.......|....../..\.
|
||||
......../.-..-......\.........................\|...................................-....../...................
|
||||
......................-....|........./\................|......\..-\....../.......\.................\/.-\......
|
||||
............\...|...............|............./...........................................\....-.-............
|
||||
\.........|.............................|............/.........-.....\........\|...-..-..\/.../......./.......
|
||||
.............................\.|...............\....\..\-.....................\......-...../......\..../.....\
|
||||
..\-......\.\........-........../........\...............\..................../....-....\.\.|.|...............
|
||||
................|./........../.................................-.............|...................\............
|
165
src/bin/day16.rs
Normal file
165
src/bin/day16.rs
Normal 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(())
|
||||
}
|
Loading…
Reference in a new issue