From dc0c839f0c256a6c2f5e7702042bba9e54b2a9c8 Mon Sep 17 00:00:00 2001 From: alex <> Date: Sun, 7 Dec 2025 20:02:27 +0100 Subject: [PATCH] day07: part1 --- src/day07.rs | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 ++ 2 files changed, 86 insertions(+) create mode 100644 src/day07.rs diff --git a/src/day07.rs b/src/day07.rs new file mode 100644 index 0000000..6d10e24 --- /dev/null +++ b/src/day07.rs @@ -0,0 +1,84 @@ +use std::error::Error; +use std::collections::HashMap; + +struct Puzzle { + start: (usize, usize), + map: HashMap<(usize, usize), (char, bool)>, // bool to store if key has been visited already +} + +impl Puzzle { + fn new(input: &str) -> Self { + let mut start = (0, 0); + let mut map = HashMap::new(); + input.lines().enumerate() + .for_each(|(i, l)| { + l.chars().enumerate() + .for_each(|(j, c)| { + if c == 'S' { + start = (i, j); + } + map.insert((i, j), (c, false)); }); + }); + Puzzle { start, map } + } + + fn part1(&mut self) -> u64 { + let mut splitters = 0; + let mut beam: Vec<(usize, usize)> = Vec::new(); + beam.push((self.start.0 + 1, self.start.1)); + while let Some(pos) = beam.pop() { + if self.map.contains_key(&pos) { + let mut location = self.map.get_mut(&pos).unwrap(); + if location.1 { + continue; + } + location.1 = true; + match location.0 { + '.' => { beam.push((pos.0 + 1, pos.1)); }, + '^' => { + splitters += 1; + beam.push((pos.0, pos.1 - 1)); + beam.push((pos.0, pos.1 + 1)); + }, + _ => {}, + } + } + } + splitters + } +} + +pub fn run(input: &str) -> Result<(), Box> { + let mut p = Puzzle::new(input); + println!("part1: {}", p.part1()); + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + static TEST_INPUT: &str = "\ +.......S....... +............... +.......^....... +............... +......^.^...... +............... +.....^.^.^..... +............... +....^.^...^.... +............... +...^.^...^.^... +............... +..^...^.....^.. +............... +.^.^.^.^.^...^. +............... +"; + + #[test] + fn test_part1() { + assert_eq!(21, Puzzle::new(TEST_INPUT).part1()); + } +} diff --git a/src/main.rs b/src/main.rs index 1d043c3..8cb86b2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ pub mod day03; pub mod day04; pub mod day05; pub mod day06; +pub mod day07; fn main() { let args: Vec = env::args().collect(); @@ -31,6 +32,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "day04" => day04::run(&input)?, "day05" => day05::run(&input)?, "day06" => day06::run(&input)?, + "day07" => day07::run(&input)?, _ => return Err(format!("unknown or unimplemented day \"{day}\"").into()), } Ok(()) -- 2.39.5