2023 - Day 16
This commit is contained in:
parent
9004a8c891
commit
002c7ad007
110
2023/input/16/input
Normal file
110
2023/input/16/input
Normal file
|
@ -0,0 +1,110 @@
|
|||
\....../..-......-.\.........\.......................-....../......../....................................|...
|
||||
......\../../.....\-................../...........|................-../.............-./........|.|............
|
||||
..-...-..../..............................-..............\.........-../...........................-.\.......\.
|
||||
............./-..........|..............\/.................../........../............\.......|................
|
||||
....|.....\.../...|..............\/..|-.................-..........\.\........................\...............
|
||||
...........\...........-..|..../..\.-|........................-/.|/....../.........\.....|................/...
|
||||
./....-|./.......|......-...-............-.......-......................................../....-............\.
|
||||
....\...........|............-............-..\..|...|.........-..||.................\/...........|-|.|-.......
|
||||
-............................-....................|........-...............\..................\...............
|
||||
...............\......................-....../......|..||.|.-........................./......-............\...
|
||||
.-...|........-.......|.........|....|.....-.........|..|............................./.../\...-........\.....
|
||||
....................../...........-......-..--.|-...............-....................\......\.................
|
||||
-....................-......-......./.......\|./......./........|...........|..................|..............
|
||||
..-............../....................|.............-.......-.................-..................\......\.|...
|
||||
....................\...............................................|.....\................../..-/............
|
||||
...-.-/...\.//...|.............|........................\.............-|..|...........--..\........./...\.....
|
||||
....................................................................\..........-......................-/......
|
||||
..................................\......-.....-...........-.............-...........\...................|...-
|
||||
......................\........|../..............-.........../......-...|......../.\......./..||..............
|
||||
................................/......-................................./.........-......\./......|..........
|
||||
........../....../....\.\|......-..............................\.....................--......|.............\..
|
||||
..-.................-............../\............|.......................................\...|....\...........
|
||||
./................\.|....\.........................../................|..............-....-..../..............
|
||||
../...........\.\/./........\........-\...-/...........-............../........................|..............
|
||||
......\.||.....................|..................\..............|........../......\/........../.....-........
|
||||
..|/...........\.....|../.......\...........-.............|..............-........|...............-.....|.....
|
||||
....................../.....-..|.......-...-...|.....................|./...\.........-........................
|
||||
......................../........../\../.........-...\........./...............................|..\...........
|
||||
.......................|\............./...|...............\/-...............|........................../..\...
|
||||
..|....-.......\..................................\................................|......../.|..............-
|
||||
........../...\.\........-......|.\.|.....................-............/..\..........|.../...-.............../
|
||||
..\.-..............-............/..-..\..............\.........\....../...|........|........\....../..........
|
||||
.....................|........................../..|....|.-.../........................-.\../-................
|
||||
./..........-....|......|.|.................-....|........\......|............../.........................../.
|
||||
....-..................................................................................-............|..-....//
|
||||
......./...-.......................-..-.........-.............|........................../....................
|
||||
.-...................-.......................................|.......-.................../..\...............\|
|
||||
.........|.\......-.....\............./-....................../.........-..|....|......-......................
|
||||
......./............./..........-......-......\...................................../............/..\.........
|
||||
.....\......-................................/..........|.............\........\............/.................
|
||||
......../..............\.........................|..........\......-............\.....|.....\....|...\|....-..
|
||||
.....\.......\/................/...\.......|./......|............\./..........|/.....\\..\...\...|..-.........
|
||||
..................|.....................-..........\....................../...../..............|......../..../
|
||||
........./...........|....-..\.....................--..|......|...\|.......|...............|...-.||...........
|
||||
..............-.....\...|...|./...|..........-......../......./..........-...../..|........../................
|
||||
..|.../...................................|...................|......./..-.....-..............-...............
|
||||
...-.........../..................-..........|.........................\..-................//\............/...
|
||||
|...............\.........\.../.....................|.....-........................\...........-../.-......-..
|
||||
........//..........-......................-....\...-.......-./.../......../........./...........|.|..........
|
||||
...................\..../...../...|........--.....\../..........|...........................|.\...............
|
||||
.\......................-........|\.....\....|.........\...............|.......\...-...|.................-....
|
||||
.....................|......./..-........................../......-.........../........................../....
|
||||
--.............\..........\-..../..-........\....-..........|./....|.\.................-..--.....\../.........
|
||||
.......|........../|...................|.................\..-..........\../....|\.....|...-.......\..-........
|
||||
........../|.|.....\....................|\..\...........-............./.......|.\.............................
|
||||
...........|..........-..............|.....|-................/.........|..../.........................-.......
|
||||
......-..........................|............-.......|/...-....--/................/..-.........|.............
|
||||
......../.-.............|....\.../............................|.|.....|....../...............\............./..
|
||||
........./.......\..........\...........\.....\..|....-...../........./........................./..|..........
|
||||
...|...|........\.......-.......\..................\....................../............-...|.........\........
|
||||
.........-...........|.........\....................../..........-.....\|.\...................\...............
|
||||
.....|..........|................................../......................|............/.....|.........|..-|..
|
||||
.../.......\....//....../....\....../..........\........................./....................\....-.../......
|
||||
/.......\..\...........\................-|............/...-|.|...-..........\.................\.....|.../.....
|
||||
.....-\.........|....../.......\.............-..........................\...........................\.........
|
||||
.|.............|................\....\...........-................./............./............................
|
||||
./...|\...........-\....................\..............-....|....|..........-.........|.../.....-.....\.\.....
|
||||
....-...............|........-............./.....\....../..\.|.....|./.\......-...........\....../.\.......\..
|
||||
..........\.....\................../......|.\..../.\..-......-.........-............/....\...................\
|
||||
..\.........|.....\..........\............./...-....../....|.......-|\-............................../........
|
||||
..|...\/........\..-\.|.\......./.....|.........-..|........|......................|..........................
|
||||
............|..........................--.-....\..............-................................|...|..........
|
||||
.-............../.....................|........../.................-....../.-...........................\-....
|
||||
.-.........................-......|-./\.........................\.....|.................|......|..\.......\...
|
||||
.....\...|....-......................................-...............\...........\..\...\..-|.....\...........
|
||||
|...........|................|.........-............|....................|............-..-.............../....
|
||||
.................../.|...........\.......\....|......-..|.....................\...................|..\.....\..
|
||||
.|........-.../...|....../...|......|.|.|..-......\............../....|...........\|.......|.......\\.........
|
||||
.......|.....-..-.-./....-/\.|./.............|.../......\...|/............/........./...-..........|\.\.......
|
||||
..|.........-....\.........\.......\....-................|-..........................-.|............|.........
|
||||
......-..\......|..\.../......\|..........|............../........../............/..\........................|
|
||||
|/.|................../....|............../..........-........-............................|.\................
|
||||
........|.....|/................../....\....../....../...................--..............\/..\................
|
||||
.../-..........................|...-.........-.................\\.......-\.........\..|.....|.................
|
||||
-./...-.....-....................../.../........./........-........../.........-...........\..................
|
||||
.\../............|.\..........-.................................\.............../............../.........\./..
|
||||
...-.....-......-......../.\...\................\...........|.................................................
|
||||
...........-...//.....-/...-...........\|./......................\.........................|.-|...|...........
|
||||
....../.....................-.......|........|-..................\............-.....................|.........
|
||||
.....................\.\................../..|/......\........|.\..............|\..............\..-...........
|
||||
....\................|\......................./.....-...............................-......../....-...........
|
||||
...\....................-....|......|........-.\..|.......................\...\.|..............|............/.
|
||||
...................-/.....................................-..\............-............-.............-....\...
|
||||
.|....../.....\.....-.../......../..../..\.-...........\.../................|........\.................../....
|
||||
.......|........./........................\.....-........-...............\....../....|../....\......./........
|
||||
..........|.........../|......|......................-..............|./......................................\
|
||||
....................../...../..............|.||............./......-......\...................................
|
||||
\........|...-..................\./.................\.\.........-....\........../.../.-...\...................
|
||||
....-..........|.......-......../................................./.../....-.............-..........\-........
|
||||
..............................-.............\..\......................................-......../..............
|
||||
......./.\|......../...-........|.........|................/.........................-....|...\.........|.....
|
||||
......|..........-.......-............./........|..\...|.|..-.............................-.-...\.............
|
||||
.||...........-.......\...../.....................-././..../.............-................|../.............--.
|
||||
................\.-.....-\..........\.............\............/.........\.......-........\...................
|
||||
......./...........\........\./.|..............|......-...........\................\...../.\...../..........|.
|
||||
.-..-...|.....................-....../..............-.\|....\.......|..|....././.......|......................
|
||||
./...-..................../................/....-/..\............/..................................\.........
|
||||
....\.-..........\-......../............|...\.............|..................|.....\.................../......
|
||||
...........-/..\..-................-....|............/...-.|.......-.|........./.....-/......./...............
|
||||
..../...-.....\..............-..\.....\.|............./...|.\..................\...|.........\-./..|...../....
|
10
2023/input/16/test-1
Normal file
10
2023/input/16/test-1
Normal file
|
@ -0,0 +1,10 @@
|
|||
.|...\....
|
||||
|.-.\.....
|
||||
.....|-...
|
||||
........|.
|
||||
..........
|
||||
.........\
|
||||
..../.\\..
|
||||
.-.-/..|..
|
||||
.|....-|.\
|
||||
..//.|....
|
200
2023/src/bin/day16.rs
Normal file
200
2023/src/bin/day16.rs
Normal file
|
@ -0,0 +1,200 @@
|
|||
#![feature(test)]
|
||||
use std::collections::{HashMap, HashSet};
|
||||
|
||||
use anyhow::Result;
|
||||
use aoc::Solver;
|
||||
|
||||
// -- Runners --
|
||||
fn main() -> Result<()> {
|
||||
Day::solve()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn part1_test1() -> Result<()> {
|
||||
Day::test(Day::part1, "test-1", 46)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part1_solution() -> Result<()> {
|
||||
Day::test(Day::part1, "input", 8021)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2_test1() -> Result<()> {
|
||||
Day::test(Day::part2, "test-1", 51)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2_solution() -> Result<()> {
|
||||
Day::test(Day::part2, "input", 8216)
|
||||
}
|
||||
|
||||
// Benchmarks
|
||||
extern crate test;
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn part1_bench(b: &mut test::Bencher) {
|
||||
Day::benchmark(Day::part1, b)
|
||||
}
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn part2_bench(b: &mut test::Bencher) {
|
||||
Day::benchmark(Day::part2, b)
|
||||
}
|
||||
}
|
||||
|
||||
fn energize(
|
||||
mut position: (isize, isize),
|
||||
mut direction: (isize, isize),
|
||||
size: (isize, isize),
|
||||
map: &HashMap<(isize, isize), char>,
|
||||
energized: &mut HashSet<((isize, isize), (isize, isize))>,
|
||||
) {
|
||||
while position.0 >= 0 && position.0 < size.0 && position.1 >= 0 && position.1 < size.1 {
|
||||
if !energized.insert((position, direction)) {
|
||||
// We already proccessed this path before
|
||||
break;
|
||||
}
|
||||
|
||||
if let Some(c) = map.get(&position) {
|
||||
direction = match (c, direction) {
|
||||
('\\', (1, 0)) => (0, 1),
|
||||
('\\', (-1, 0)) => (0, -1),
|
||||
('\\', (0, 1)) => (1, 0),
|
||||
('\\', (0, -1)) => (-1, 0),
|
||||
('/', (1, 0)) => (0, -1),
|
||||
('/', (-1, 0)) => (0, 1),
|
||||
('/', (0, 1)) => (-1, 0),
|
||||
('/', (0, -1)) => (1, 0),
|
||||
('-', (1 | -1, 0)) => direction,
|
||||
('-', (0, 1 | -1)) => {
|
||||
energize((position.0 - 1, position.1), (-1, 0), size, map, energized);
|
||||
energize((position.0 + 1, position.1), (1, 0), size, map, energized);
|
||||
break;
|
||||
}
|
||||
('|', (1 | -1, 0)) => {
|
||||
energize((position.0, position.1 - 1), (0, -1), size, map, energized);
|
||||
energize((position.0, position.1 + 1), (0, 1), size, map, energized);
|
||||
break;
|
||||
}
|
||||
('|', (0, 1 | -1)) => direction,
|
||||
_ => unreachable!("Invalid state"),
|
||||
};
|
||||
}
|
||||
|
||||
position.0 += direction.0;
|
||||
position.1 += direction.1;
|
||||
}
|
||||
}
|
||||
|
||||
fn energized(
|
||||
start: (isize, isize),
|
||||
direction: (isize, isize),
|
||||
size: (isize, isize),
|
||||
map: &HashMap<(isize, isize), char>,
|
||||
) -> usize {
|
||||
let mut energized = HashSet::new();
|
||||
energize(start, direction, size, &map, &mut energized);
|
||||
|
||||
energized
|
||||
.iter()
|
||||
.map(|(position, _)| position)
|
||||
.collect::<HashSet<_>>()
|
||||
.len()
|
||||
}
|
||||
|
||||
// -- Solution --
|
||||
pub struct Day;
|
||||
impl aoc::Solver for Day {
|
||||
type Output1 = usize;
|
||||
type Output2 = usize;
|
||||
|
||||
fn day() -> u8 {
|
||||
16
|
||||
}
|
||||
|
||||
fn part1(input: &str) -> Self::Output1 {
|
||||
let mut width = 0;
|
||||
let mut height = 0;
|
||||
|
||||
let map = input
|
||||
.lines()
|
||||
.enumerate()
|
||||
.flat_map(|(y, line)| {
|
||||
let y = y as isize;
|
||||
if y + 1 > height {
|
||||
height = y + 1;
|
||||
}
|
||||
|
||||
line.chars()
|
||||
.enumerate()
|
||||
.filter_map(|(x, c)| {
|
||||
let x = x as isize;
|
||||
if x + 1 > width {
|
||||
width = x + 1;
|
||||
}
|
||||
match c {
|
||||
'.' => None,
|
||||
'\\' | '/' | '|' | '-' => Some(((x, y), c)),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
})
|
||||
.collect::<HashMap<_, _>>();
|
||||
|
||||
energized((0, 0), (1, 0), (width, height), &map)
|
||||
}
|
||||
|
||||
fn part2(input: &str) -> Self::Output2 {
|
||||
let mut width = 0;
|
||||
let mut height = 0;
|
||||
|
||||
let map = input
|
||||
.lines()
|
||||
.enumerate()
|
||||
.flat_map(|(y, line)| {
|
||||
let y = y as isize;
|
||||
if y + 1 > height {
|
||||
height = y + 1;
|
||||
}
|
||||
|
||||
line.chars()
|
||||
.enumerate()
|
||||
.filter_map(|(x, c)| {
|
||||
let x = x as isize;
|
||||
if x + 1 > width {
|
||||
width = x + 1;
|
||||
}
|
||||
match c {
|
||||
'.' => None,
|
||||
'\\' | '/' | '|' | '-' => Some(((x, y), c)),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
})
|
||||
.collect::<HashMap<_, _>>();
|
||||
|
||||
let mut max = 0;
|
||||
for x in 0..width {
|
||||
let a = energized((x, 0), (0, 1), (width, height), &map);
|
||||
let b = energized((x, height - 1), (0, -1), (width, height), &map);
|
||||
|
||||
max = std::cmp::max(max, std::cmp::max(a, b));
|
||||
}
|
||||
|
||||
for y in 0..height {
|
||||
let a = energized((0, y), (1, 0), (width, height), &map);
|
||||
let b = energized((width - 1, y), (-1, 0), (width, height), &map);
|
||||
|
||||
max = std::cmp::max(max, std::cmp::max(a, b));
|
||||
}
|
||||
|
||||
max
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user