add 2023/16/1

This commit is contained in:
kageru 2023-12-18 16:43:13 +01:00
parent 5b581eeb73
commit 07972e3029
5 changed files with 230 additions and 3 deletions

110
2023/inputs/day16 Normal file
View File

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

View File

@ -1,7 +1,7 @@
#!/bin/sh
today=$(date +%d)
aocd > inputs/day$today
aocd "$today" > inputs/day$today
echo '#![feature(test)]
extern crate test;

117
2023/src/bin/day16.rs Normal file
View File

@ -0,0 +1,117 @@
#![feature(test, try_blocks)]
extern crate test;
use aoc2023::{
boilerplate,
common::*,
direction::Direction::{self, *},
};
use fnv::FnvHashSet;
use std::mem::transmute;
use Tile::*;
const DAY: usize = 16;
type Parsed<'a> = Vec<&'a [Tile]>;
#[repr(u8)]
#[allow(dead_code)]
#[derive(Debug, PartialEq, Eq)]
enum Tile {
Empty = b'.',
HSplit = b'|',
VSplit = b'-',
Angle1 = b'/',
Angle2 = b'\\',
}
fn parse_input(raw: &str) -> Parsed {
raw.lines().map(|l| unsafe { transmute(l) }).collect()
}
fn part1(grid: &Parsed) -> usize {
let mut points = FnvHashSet::default();
points.insert((0, 0));
let mut known = FnvHashSet::default();
// my real input starts with a mirror,
// and I don’t want to rewrite the code to not blindly make the first step.
energized(grid, &mut points, &mut known, 0, 0, if grid[0][0] == Empty { Right } else { Down });
points.len()
}
fn angle1(dir: Direction) -> Direction {
match dir {
Up => Right,
Right => Up,
Down => Left,
Left => Down,
}
}
fn angle2(dir: Direction) -> Direction {
match dir {
Up => Left,
Left => Up,
Down => Right,
Right => Down,
}
}
fn energized(
grid: &Parsed,
points: &mut FnvHashSet<(usize, usize)>,
known: &mut FnvHashSet<(usize, usize, Direction)>,
mut x: usize,
mut y: usize,
dir: Direction,
) {
if !known.insert((x, y, dir)) {
return;
}
if let Some(tile) = try {
y = y.checked_sub((dir == Up) as usize)? + (dir == Down) as usize;
x = x.checked_sub((dir == Left) as usize)? + (dir == Right) as usize;
grid.get(y)?.get(x)?
} {
points.insert((x, y));
match (tile, dir) {
(Empty, _) => {
energized(grid, points, known, x, y, dir);
}
(Angle1, _) => energized(grid, points, known, x, y, angle1(dir)),
(Angle2, _) => energized(grid, points, known, x, y, angle2(dir)),
(HSplit, Up | Down) => energized(grid, points, known, x, y, dir),
(HSplit, Left | Right) => {
energized(grid, points, known, x, y, Up);
energized(grid, points, known, x, y, Down);
}
(VSplit, Up | Down) => {
energized(grid, points, known, x, y, Right);
energized(grid, points, known, x, y, Left);
}
(VSplit, Left | Right) => energized(grid, points, known, x, y, dir),
}
}
}
fn part2(parsed: &Parsed) -> usize {
unimplemented!()
}
boilerplate! {
TEST_INPUT == r".|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|...."
for tests: {
part1: { TEST_INPUT => 46 },
part2: { TEST_INPUT => 0 },
},
bench1 == 7517,
bench2 == 0,
bench_parse: Vec::len => 110,
}

View File

@ -3,7 +3,7 @@ use std::{
fmt::Display,
iter::Step,
ops::{Add, Mul},
str::FromStr,
str::FromStr, mem::transmute,
};
pub fn read_file(day: usize) -> String {

View File

@ -7,7 +7,7 @@ use std::{
pub const ALL_DIRECTIONS: [Direction; 4] = [Direction::Up, Direction::Down, Direction::Left, Direction::Right];
#[repr(u8)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum Direction {
Right = 0,
Down = 1,