2023-16: Implement part one
This commit is contained in:
parent
672d196e2a
commit
2deb1e1a03
|
@ -0,0 +1,110 @@
|
||||||
|
\.................-....-.-.|....................|......./.|.\................|...........|....--..............
|
||||||
|
............-...................|.............|..-.......-/..............-....\...............................
|
||||||
|
|.......//...........................................|...............-......../.....\....................\....
|
||||||
|
....|......-.-.............-......\.....\......../..................../.......................................
|
||||||
|
..\..\../................../.............-............|....-.........................|......|...............|.
|
||||||
|
-..|........................./.................\.........\./.............\..|..-...-.............\............
|
||||||
|
.\......||-..................../................-................./....|........................|.............
|
||||||
|
..............\./...........-.........../-................-.........\...\........../-.......|.................
|
||||||
|
....-..........-.-.....\......................../.......-..........-/.....................||................|.
|
||||||
|
./..........|/............................\./............................./....../........\...-|............\-
|
||||||
|
........\.............................-...../............---...........|...............|......\\..............
|
||||||
|
........//....|.\......./...\.............|..............\............./...........-.|..-.............|.......
|
||||||
|
...................\...........-/..-......\...|........-.|................\-.......|........\.................
|
||||||
|
|.|....../|............\./..-........\..............................-.....................|....../............
|
||||||
|
............-....................-..............-..-................|.//.............-.............-..........
|
||||||
|
..........-.......-......|-................./........../...\........-.......................-..\.......\......
|
||||||
|
................../....|............-....../................./.....................|.................-........
|
||||||
|
...\..............--..|.....||.....\.............\../................................................-.-...../
|
||||||
|
.........-......|....-.................-.......\-................./..|...................|\.....\.....|.|-....
|
||||||
|
......................-......................-............/....................\...../...\..../...............
|
||||||
|
...../......-...............\...-....|......../.........\................................|.........../........
|
||||||
|
........../.......\..............-...............\........-|....-......-.............|...........|........./..
|
||||||
|
./...............\....../....../..../...................................................|.....|.|../......./..
|
||||||
|
....|\........\-...../...................-.............\.\..................................././..........\...
|
||||||
|
....................................-..../......................-..///......-...|.|..........................|
|
||||||
|
.........-\.....-...........|........./..........-..\.....\./...................-........................-....
|
||||||
|
....../.......././......--.....|.\..-...-....\..........................-....-...-..|.|.....|.......\-./......
|
||||||
|
...-....................-................|.............-../........|../........-.............|\...............
|
||||||
|
...../...........-......../................|................|.....\.....-.............../...|....../\.........
|
||||||
|
./...\.....\..-./.........................|................................-....................-.............
|
||||||
|
.............\|.../....\\.....\..|...........\.....................|......|.|.....|.....-............\.\......
|
||||||
|
........................|......-..........-.../......-........|...../.\|...-................................|.
|
||||||
|
.......\...-...\..........|.....\...................\.........|..........-/.........\...................../...
|
||||||
|
.-|.......|............./..|./....-.../...\............-......../..............-.......//...-...........||.\..
|
||||||
|
..|..\./..-........\..|....-..\.........../..............................|..\..................../..|...../-..
|
||||||
|
.|.........-.\...........................\..../......./....||............\..........|............-.\|.........
|
||||||
|
....................\..../|............................\.../..|........./...../............||........\....../.
|
||||||
|
....................../.....|...................|......|.................|..|.......|................|........
|
||||||
|
.....................\.........-..../.........../../..-......\.................|.../....................../...
|
||||||
|
........\.-................/........\...../....../.|.\...|/../..........................................-.....
|
||||||
|
....................................|......./...../............-................-/..|.-....................\..
|
||||||
|
..|.........................-....................../...|.....|.............../.........../.....|\.............
|
||||||
|
.......................................|.\.|.......................-.......|..............\............-./....
|
||||||
|
..........//................\..|./................-.................-..../../|................................
|
||||||
|
.|......................................./............/..-.......-.|.........................\|..|............
|
||||||
|
............................/.-..................-./..../..............|-.........-|..........................
|
||||||
|
.................-...|................\.........|\...............................\...........\...//...........
|
||||||
|
........\..|.|--.............|.......\.................|......|\./.........................\.|................
|
||||||
|
.-|.............|\|.....\|././...|..\.............\..\...................\...........\...../..................
|
||||||
|
..../..............-..|...|.........-.........\.....-...........-.....|...\.-....-../.................\.......
|
||||||
|
........\.|........\\.........-...............-.......-..................................../..........|.......
|
||||||
|
...............-...................\/...............\..-\...........|.-........-.\-.....\....\..../......-....
|
||||||
|
.../-......./..............|.......|..//......-....................../.|....\......|..\.........../-\.........
|
||||||
|
.-....|./....-.../....../.....-..............\..-..\..-............\................|...|..........-.......|..
|
||||||
|
|......../...................\..../....\......./..|.................\...............\.........\../.|......../.
|
||||||
|
../............/........|..|.......................................\../\...............\............/.......\.
|
||||||
|
........-.-...\........../.......-....-............./.............-......./................\..........-.......
|
||||||
|
.../-................/......|/........-......|..........|..-..............|/..........................-.......
|
||||||
|
......./............../...................|../...../................./../..........\../.....\....\............
|
||||||
|
..............-..|../-........................|...\.../...-/..........\.......\......\.................-....-.
|
||||||
|
......................................-/.\........................../......-..\..\........\...............|..\
|
||||||
|
.............-.........../-|........-........\....-.....\....../..\........................\......|.......\...
|
||||||
|
.././....................|\.../\.........\.|.............../..../...|......./.\...|.......\.........|.........
|
||||||
|
......................./........./-./...........................|/...\........-.../.................||........
|
||||||
|
..............|./........\..............\.............................|/................../............|.-..|.
|
||||||
|
.........................-......../........./.....|....-..-.-..............-.-......../.......\...\./.........
|
||||||
|
.-............../../....\//......../...|......|......\..................-......\.....-....\|.........|........
|
||||||
|
..............-.....................\.................\.|...-............................|......\.............
|
||||||
|
\\.....|...........\............|............................../............................................\.
|
||||||
|
.-........../|...\..............-...............................\...........\.....|......\..........\.........
|
||||||
|
.\............\.|....-........./....../../.....-..\........|...............-..................|............-.|
|
||||||
|
.....\......-.........-.........|....../..-....|.....\..../....|........-.....................................
|
||||||
|
..........\-..-..../\.....................\.........-...........|..../-.......................\....-..........
|
||||||
|
...../............./..|..................../............../../.........|...............-../...................
|
||||||
|
.....|...../.....|......-.............................|...........-......................./............/......
|
||||||
|
.....................||./.-.................-.........\.\..................-..............\...--.........\....
|
||||||
|
.|......-......-.\.......-......\....\..\..|.........../......./.....................-..........|.............
|
||||||
|
.....\.....\............................--..................|..-........\....\...\.|.\.-...........\...\......
|
||||||
|
./...........\.......\/......|........./..|................\-................/....\...................\.\.....
|
||||||
|
..|...............................-.........-.|/......|.....|........\........................................
|
||||||
|
.......|............-............../............-......../..-...\|-...-..../...........-..........-..-/.......
|
||||||
|
............................-..\.......................................-.........................\..........-.
|
||||||
|
........................\.........|................||...-....\......\.....\.................\...\\....../.....
|
||||||
|
....\../.....-.......-.................-|...................-../.|-............|........-|......./../...\.....
|
||||||
|
..................................................\.......|......./..\./......../....|....-|.-................
|
||||||
|
....../.........|.......|...|.......\.../|...............-.......-\..\......././..................|..\.|...../
|
||||||
|
............|.....\...........-.............................../.....-.................-.../............/.../..
|
||||||
|
...../.......\............................|.....\....\................/..................\......../...........
|
||||||
|
..................-....\.........\|................/|......../.-................|...\......................--.
|
||||||
|
......-..-.....................................-\.........|.../.....................|..|.-.....\...|....\....-
|
||||||
|
......-......-.................-......|..................................................|....................
|
||||||
|
..\...............|......../........-......./.............../...........-..........|/.....///\.....-..........
|
||||||
|
.........../..|.............../..........\|.........................\...|.....\||....\...|.|/.....-....../....
|
||||||
|
...../...../.....-............................................|........|............|.........................
|
||||||
|
......-../\................../..............\............\.................../|...........|.............\.....
|
||||||
|
...........-..........................-....\..\..|.-..............................................\........|..
|
||||||
|
/.--..//....\...............................-............|..././..............................................
|
||||||
|
/...............|.........../..../......................\.....|............|...........|...................-..
|
||||||
|
..-................\../|......../...................../...........\..|.|\../..................................
|
||||||
|
....|...../.....-......\.........................-.....//...............|.........-.......|...-....--.........
|
||||||
|
....|..\.-..../....................|..........\............./...........\.../.................................
|
||||||
|
............................\...................................../.......................|...........\.......
|
||||||
|
.........../.....-.....................\..\.-..|............-...............\.........................-.......
|
||||||
|
......-.......-\.\......\..-.-........./...........\..........|........................\.....-.....\..........
|
||||||
|
..............-....../.-............./........../..............\-....-.../...../.-............\......./.-.....
|
||||||
|
......|...................................................||..../...|\.....................-.../...\........|.
|
||||||
|
......|.//........................-...../...........-..\...|......|..................../........../...........
|
||||||
|
.....................................................|.........//...........|\.....\....................|.../.
|
||||||
|
............-..||...........|....../....................\...\................................../.......|......
|
||||||
|
..\....\......./-\.\...........-\................|.........../................||.../.....-...........\........
|
|
@ -0,0 +1,10 @@
|
||||||
|
.|...\....
|
||||||
|
|.-.\.....
|
||||||
|
.....|-...
|
||||||
|
........|.
|
||||||
|
..........
|
||||||
|
.........\
|
||||||
|
..../.\\..
|
||||||
|
.-.-/..|..
|
||||||
|
.|....-|.\
|
||||||
|
..//.|....
|
|
@ -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!();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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")
|
||||||
|
}
|
||||||
|
}
|
|
@ -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()
|
||||||
|
}
|
|
@ -13,6 +13,7 @@ pub mod day_12_hot_springs;
|
||||||
pub mod day_13_point_of_incidence;
|
pub mod day_13_point_of_incidence;
|
||||||
pub mod day_14_parabolic_reflector_dish;
|
pub mod day_14_parabolic_reflector_dish;
|
||||||
pub mod day_15_lens_library;
|
pub mod day_15_lens_library;
|
||||||
|
pub mod day_16_the_floor_will_be_lava;
|
||||||
|
|
||||||
pub fn run(day: &str) {
|
pub fn run(day: &str) {
|
||||||
let solution: Box<dyn Solution> = match day {
|
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),
|
"13" => Box::new(day_13_point_of_incidence::DaySolution),
|
||||||
"14" => Box::new(day_14_parabolic_reflector_dish::DaySolution),
|
"14" => Box::new(day_14_parabolic_reflector_dish::DaySolution),
|
||||||
"15" => Box::new(day_15_lens_library::DaySolution),
|
"15" => Box::new(day_15_lens_library::DaySolution),
|
||||||
|
"16" => Box::new(day_16_the_floor_will_be_lava::DaySolution),
|
||||||
_ => panic!("Invalid day specified"),
|
_ => panic!("Invalid day specified"),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue