2023-16: Implement part one

This commit is contained in:
Mathis 2023-12-24 14:27:26 +01:00
parent 672d196e2a
commit 2deb1e1a03
6 changed files with 303 additions and 0 deletions

110
input/2023/day_16/input.txt Normal file
View File

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

View File

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

View File

@ -0,0 +1,46 @@
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum Contraption {
Empty,
MirrorLeft,
MirrorRight,
SplitterVert,
SplitterHoriz,
}
#[derive(Debug, PartialEq, Clone, Copy, Eq, Hash)]
pub enum Direction {
Up,
Down,
Left,
Right,
}
#[allow(dead_code)]
pub fn print_contraption(contraption: &Vec<Vec<Contraption>>) {
for row in contraption {
for c in row {
match c {
Contraption::Empty => print!("."),
Contraption::MirrorLeft => print!("\\"),
Contraption::MirrorRight => print!("/"),
Contraption::SplitterVert => print!("|"),
Contraption::SplitterHoriz => print!("-"),
}
}
println!();
}
}
#[allow(dead_code)]
pub fn print_energized(contraption: &Vec<Vec<bool>>) {
for row in contraption {
for c in row {
if *c {
print!("#");
} else {
print!(".");
}
}
println!();
}
}

View File

@ -0,0 +1,25 @@
pub mod part_one;
// pub mod part_two;
pub mod common;
use crate::utils::solution::Solution;
use crate::utils::input_reader;
pub struct DaySolution ;
impl Solution for DaySolution {
fn input_path(&self) -> &'static str {
"input/2023/day_16/input.txt"
}
fn part_one(&self) -> String {
input_reader::read_input_file(self.input_path(), part_one::part_one)
}
fn part_two(&self) -> String {
// input_reader::read_input_file(self.input_path(), part_two::part_two)
String::from("Not implemented")
}
}

View File

@ -0,0 +1,110 @@
use std::collections::HashSet;
use super::common::{Contraption, Direction};
pub fn part_one(input_lines: Vec<String>) -> String {
let mut contraption: Vec<Vec<Contraption>> = Vec::new();
for line in input_lines {
let mut row: Vec<Contraption> = Vec::new();
for c in line.chars() {
match c {
'.' => row.push(Contraption::Empty),
'\\' => row.push(Contraption::MirrorLeft),
'/' => row.push(Contraption::MirrorRight),
'|' => row.push(Contraption::SplitterVert),
'-' => row.push(Contraption::SplitterHoriz),
_ => panic!("Unknown character: {}", c),
}
}
contraption.push(row);
}
// print_contraption(&contraption);
let mut energized: Vec<Vec<bool>> = vec![vec![false; contraption[0].len()]; contraption.len()];
let mut memory: HashSet<(i32, i32, Direction)> = HashSet::new();
let mut stack: Vec<(i32, i32, Direction)> = Vec::new();
stack.push((0,0, Direction::Right));
while let Some((i, j, direction)) = stack.pop() {
if i >= contraption[0].len() as i32 || j >= contraption.len() as i32 || i < 0 || j < 0 {
continue;
}
if memory.contains(&(i, j, direction)) {
continue;
} else {
memory.insert((i, j, direction));
}
energized[i as usize][j as usize] = true;
let tile = &contraption[i as usize][j as usize];
// println!("{} {}: {:?} - {:?}", i, j, direction, tile);
match (tile, direction) {
(Contraption::Empty, Direction::Right) => {
stack.push((i, j+1, Direction::Right));
},
(Contraption::Empty, Direction::Left) => {
stack.push((i, j-1, Direction::Left));
},
(Contraption::Empty, Direction::Up) => {
stack.push((i-1, j, Direction::Up));
},
(Contraption::Empty, Direction::Down) => {
stack.push((i+1, j, Direction::Down));
},
(Contraption::MirrorLeft, Direction::Right) => {
stack.push((i+1, j, Direction::Down));
}
(Contraption::MirrorLeft, Direction::Left) => {
stack.push((i-1, j, Direction::Up));
},
(Contraption::MirrorLeft, Direction::Up) => {
stack.push((i, j-1, Direction::Left));
},
(Contraption::MirrorLeft, Direction::Down) => {
stack.push((i, j+1, Direction::Right));
},
(Contraption::MirrorRight, Direction::Right) => {
stack.push((i-1, j, Direction::Up));
},
(Contraption::MirrorRight, Direction::Left) => {
stack.push((i+1, j, Direction::Down));
},
(Contraption::MirrorRight, Direction::Up) => {
stack.push((i, j+1, Direction::Right));
},
(Contraption::MirrorRight, Direction::Down) => {
stack.push((i, j-1, Direction::Left));
},
(Contraption::SplitterVert, Direction::Right | Direction::Left) => {
stack.push((i-1, j, Direction::Up));
stack.push((i+1, j, Direction::Down));
},
(Contraption::SplitterVert, Direction::Down) => {
stack.push((i+1, j, Direction::Down));
},
(Contraption::SplitterVert, Direction::Up) => {
stack.push((i-1, j, Direction::Up));
},
(Contraption::SplitterHoriz, Direction::Up | Direction::Down) => {
stack.push((i, j-1, Direction::Left));
stack.push((i, j+1, Direction::Right));
},
(Contraption::SplitterHoriz, Direction::Left) => {
stack.push((i, j-1, Direction::Left));
},
(Contraption::SplitterHoriz, Direction::Right) => {
stack.push((i, j+1, Direction::Right));
}
}
}
// print_energized(&energized);
let energized_count = energized.iter().flatten().filter(|x| **x).count();
energized_count.to_string()
}

View File

@ -13,6 +13,7 @@ pub mod day_12_hot_springs;
pub mod day_13_point_of_incidence;
pub mod day_14_parabolic_reflector_dish;
pub mod day_15_lens_library;
pub mod day_16_the_floor_will_be_lava;
pub fn run(day: &str) {
let solution: Box<dyn Solution> = match day {
@ -29,6 +30,7 @@ pub fn run(day: &str) {
"13" => Box::new(day_13_point_of_incidence::DaySolution),
"14" => Box::new(day_14_parabolic_reflector_dish::DaySolution),
"15" => Box::new(day_15_lens_library::DaySolution),
"16" => Box::new(day_16_the_floor_will_be_lava::DaySolution),
_ => panic!("Invalid day specified"),
};