From 2deb1e1a03df7e1f5e30a718bf3d1b01dc9144e9 Mon Sep 17 00:00:00 2001 From: Mathis Date: Sun, 24 Dec 2023 14:27:26 +0100 Subject: [PATCH] 2023-16: Implement part one --- input/2023/day_16/input.txt | 110 ++++++++++++++++++ input/2023/day_16/input_test.txt | 10 ++ .../day_16_the_floor_will_be_lava/common.rs | 46 ++++++++ .../day_16_the_floor_will_be_lava/mod.rs | 25 ++++ .../day_16_the_floor_will_be_lava/part_one.rs | 110 ++++++++++++++++++ src/year_2023/mod.rs | 2 + 6 files changed, 303 insertions(+) create mode 100644 input/2023/day_16/input.txt create mode 100644 input/2023/day_16/input_test.txt create mode 100644 src/year_2023/day_16_the_floor_will_be_lava/common.rs create mode 100644 src/year_2023/day_16_the_floor_will_be_lava/mod.rs create mode 100644 src/year_2023/day_16_the_floor_will_be_lava/part_one.rs diff --git a/input/2023/day_16/input.txt b/input/2023/day_16/input.txt new file mode 100644 index 0000000..2b53475 --- /dev/null +++ b/input/2023/day_16/input.txt @@ -0,0 +1,110 @@ +\.................-....-.-.|....................|......./.|.\................|...........|....--.............. +............-...................|.............|..-.......-/..............-....\............................... +|.......//...........................................|...............-......../.....\....................\.... +....|......-.-.............-......\.....\......../..................../....................................... +..\..\../................../.............-............|....-.........................|......|...............|. +-..|........................./.................\.........\./.............\..|..-...-.............\............ +.\......||-..................../................-................./....|........................|............. +..............\./...........-.........../-................-.........\...\........../-.......|................. +....-..........-.-.....\......................../.......-..........-/.....................||................|. +./..........|/............................\./............................./....../........\...-|............\- +........\.............................-...../............---...........|...............|......\\.............. +........//....|.\......./...\.............|..............\............./...........-.|..-.............|....... +...................\...........-/..-......\...|........-.|................\-.......|........\................. +|.|....../|............\./..-........\..............................-.....................|....../............ +............-....................-..............-..-................|.//.............-.............-.......... +..........-.......-......|-................./........../...\........-.......................-..\.......\...... +................../....|............-....../................./.....................|.................-........ +...\..............--..|.....||.....\.............\../................................................-.-...../ +.........-......|....-.................-.......\-................./..|...................|\.....\.....|.|-.... +......................-......................-............/....................\...../...\..../............... +...../......-...............\...-....|......../.........\................................|.........../........ +........../.......\..............-...............\........-|....-......-.............|...........|........./.. +./...............\....../....../..../...................................................|.....|.|../......./.. +....|\........\-...../...................-.............\.\..................................././..........\... +....................................-..../......................-..///......-...|.|..........................| +.........-\.....-...........|........./..........-..\.....\./...................-........................-.... +....../.......././......--.....|.\..-...-....\..........................-....-...-..|.|.....|.......\-./...... +...-....................-................|.............-../........|../........-.............|\............... +...../...........-......../................|................|.....\.....-.............../...|....../\......... +./...\.....\..-./.........................|................................-....................-............. +.............\|.../....\\.....\..|...........\.....................|......|.|.....|.....-............\.\...... +........................|......-..........-.../......-........|...../.\|...-................................|. +.......\...-...\..........|.....\...................\.........|..........-/.........\...................../... +.-|.......|............./..|./....-.../...\............-......../..............-.......//...-...........||.\.. +..|..\./..-........\..|....-..\.........../..............................|..\..................../..|...../-.. +.|.........-.\...........................\..../......./....||............\..........|............-.\|......... +....................\..../|............................\.../..|........./...../............||........\....../. +....................../.....|...................|......|.................|..|.......|................|........ +.....................\.........-..../.........../../..-......\.................|.../....................../... +........\.-................/........\...../....../.|.\...|/../..........................................-..... +....................................|......./...../............-................-/..|.-....................\.. +..|.........................-....................../...|.....|.............../.........../.....|\............. +.......................................|.\.|.......................-.......|..............\............-./.... +..........//................\..|./................-.................-..../../|................................ +.|......................................./............/..-.......-.|.........................\|..|............ +............................/.-..................-./..../..............|-.........-|.......................... +.................-...|................\.........|\...............................\...........\...//........... +........\..|.|--.............|.......\.................|......|\./.........................\.|................ +.-|.............|\|.....\|././...|..\.............\..\...................\...........\...../.................. +..../..............-..|...|.........-.........\.....-...........-.....|...\.-....-../.................\....... +........\.|........\\.........-...............-.......-..................................../..........|....... +...............-...................\/...............\..-\...........|.-........-.\-.....\....\..../......-.... +.../-......./..............|.......|..//......-....................../.|....\......|..\.........../-\......... +.-....|./....-.../....../.....-..............\..-..\..-............\................|...|..........-.......|.. +|......../...................\..../....\......./..|.................\...............\.........\../.|......../. +../............/........|..|.......................................\../\...............\............/.......\. +........-.-...\........../.......-....-............./.............-......./................\..........-....... +.../-................/......|/........-......|..........|..-..............|/..........................-....... +......./............../...................|../...../................./../..........\../.....\....\............ +..............-..|../-........................|...\.../...-/..........\.......\......\.................-....-. +......................................-/.\........................../......-..\..\........\...............|..\ +.............-.........../-|........-........\....-.....\....../..\........................\......|.......\... +.././....................|\.../\.........\.|.............../..../...|......./.\...|.......\.........|......... +......................./........./-./...........................|/...\........-.../.................||........ +..............|./........\..............\.............................|/................../............|.-..|. +.........................-......../........./.....|....-..-.-..............-.-......../.......\...\./......... +.-............../../....\//......../...|......|......\..................-......\.....-....\|.........|........ +..............-.....................\.................\.|...-............................|......\............. +\\.....|...........\............|............................../............................................\. +.-........../|...\..............-...............................\...........\.....|......\..........\......... +.\............\.|....-........./....../../.....-..\........|...............-..................|............-.| +.....\......-.........-.........|....../..-....|.....\..../....|........-..................................... +..........\-..-..../\.....................\.........-...........|..../-.......................\....-.......... +...../............./..|..................../............../../.........|...............-../................... +.....|...../.....|......-.............................|...........-......................./............/...... +.....................||./.-.................-.........\.\..................-..............\...--.........\.... +.|......-......-.\.......-......\....\..\..|.........../......./.....................-..........|............. +.....\.....\............................--..................|..-........\....\...\.|.\.-...........\...\...... +./...........\.......\/......|........./..|................\-................/....\...................\.\..... +..|...............................-.........-.|/......|.....|........\........................................ +.......|............-............../............-......../..-...\|-...-..../...........-..........-..-/....... +............................-..\.......................................-.........................\..........-. +........................\.........|................||...-....\......\.....\.................\...\\....../..... +....\../.....-.......-.................-|...................-../.|-............|........-|......./../...\..... +..................................................\.......|......./..\./......../....|....-|.-................ +....../.........|.......|...|.......\.../|...............-.......-\..\......././..................|..\.|...../ +............|.....\...........-.............................../.....-.................-.../............/.../.. +...../.......\............................|.....\....\................/..................\......../........... +..................-....\.........\|................/|......../.-................|...\......................--. +......-..-.....................................-\.........|.../.....................|..|.-.....\...|....\....- +......-......-.................-......|..................................................|.................... +..\...............|......../........-......./.............../...........-..........|/.....///\.....-.......... +.........../..|.............../..........\|.........................\...|.....\||....\...|.|/.....-....../.... +...../...../.....-............................................|........|............|......................... +......-../\................../..............\............\.................../|...........|.............\..... +...........-..........................-....\..\..|.-..............................................\........|.. +/.--..//....\...............................-............|..././.............................................. +/...............|.........../..../......................\.....|............|...........|...................-.. +..-................\../|......../...................../...........\..|.|\../.................................. +....|...../.....-......\.........................-.....//...............|.........-.......|...-....--......... +....|..\.-..../....................|..........\............./...........\.../................................. +............................\...................................../.......................|...........\....... +.........../.....-.....................\..\.-..|............-...............\.........................-....... +......-.......-\.\......\..-.-........./...........\..........|........................\.....-.....\.......... +..............-....../.-............./........../..............\-....-.../...../.-............\......./.-..... +......|...................................................||..../...|\.....................-.../...\........|. +......|.//........................-...../...........-..\...|......|..................../........../........... +.....................................................|.........//...........|\.....\....................|.../. +............-..||...........|....../....................\...\................................../.......|...... +..\....\......./-\.\...........-\................|.........../................||.../.....-...........\........ \ No newline at end of file diff --git a/input/2023/day_16/input_test.txt b/input/2023/day_16/input_test.txt new file mode 100644 index 0000000..c78b2e7 --- /dev/null +++ b/input/2023/day_16/input_test.txt @@ -0,0 +1,10 @@ +.|...\.... +|.-.\..... +.....|-... +........|. +.......... +.........\ +..../.\\.. +.-.-/..|.. +.|....-|.\ +..//.|.... \ No newline at end of file diff --git a/src/year_2023/day_16_the_floor_will_be_lava/common.rs b/src/year_2023/day_16_the_floor_will_be_lava/common.rs new file mode 100644 index 0000000..6c138b7 --- /dev/null +++ b/src/year_2023/day_16_the_floor_will_be_lava/common.rs @@ -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>) { + 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>) { + for row in contraption { + for c in row { + if *c { + print!("#"); + } else { + print!("."); + } + } + println!(); + } +} \ No newline at end of file diff --git a/src/year_2023/day_16_the_floor_will_be_lava/mod.rs b/src/year_2023/day_16_the_floor_will_be_lava/mod.rs new file mode 100644 index 0000000..4336cd9 --- /dev/null +++ b/src/year_2023/day_16_the_floor_will_be_lava/mod.rs @@ -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") + } +} \ No newline at end of file diff --git a/src/year_2023/day_16_the_floor_will_be_lava/part_one.rs b/src/year_2023/day_16_the_floor_will_be_lava/part_one.rs new file mode 100644 index 0000000..964476f --- /dev/null +++ b/src/year_2023/day_16_the_floor_will_be_lava/part_one.rs @@ -0,0 +1,110 @@ +use std::collections::HashSet; + +use super::common::{Contraption, Direction}; + +pub fn part_one(input_lines: Vec) -> String { + + let mut contraption: Vec> = Vec::new(); + for line in input_lines { + let mut row: Vec = 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![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() +} \ No newline at end of file diff --git a/src/year_2023/mod.rs b/src/year_2023/mod.rs index 60e3fa1..3550bd7 100644 --- a/src/year_2023/mod.rs +++ b/src/year_2023/mod.rs @@ -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 = 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"), };