diff --git a/years/2025/src/day_7.rs b/years/2025/src/day_7.rs index f799be8..3af4caa 100644 --- a/years/2025/src/day_7.rs +++ b/years/2025/src/day_7.rs @@ -1,17 +1,95 @@ +use std::collections::{HashMap, HashSet, VecDeque}; use advent_core::{Day, day_stuff, ex_for_day}; +use utils::{dir::Direction, pos::Position, tiles}; pub struct Day7; +tiles!(Tile, [ + 'S' => Start, + '^' => Splitter, + '.' => Empty, +]); + +type Grid = utils::grid::Grid; + impl Day for Day7 { + day_stuff!(7, "21", "40", Grid); + + fn part_1(input: Self::Input) -> Option { + let (start, _) = input.iter().find(|(_, t)| **t == Tile::Start).unwrap(); + let mut queue = VecDeque::::new(); + let mut seen = HashSet::::with_capacity(input.size().1); + + queue.push_back(start); + + let mut splits = 0; + + while let Some(pos) = queue.pop_front() { + if seen.contains(&pos) { + continue; + } + seen.insert(pos); + let next_pos = Position::new(pos.x, pos.y + 1); + match input.get(next_pos) { + Some(Tile::Splitter) => { + splits += 1; + queue.push_back(Position::new(pos.x + 1, pos.y)); + queue.push_back(Position::new(pos.x - 1, pos.y)); + } + Some(Tile::Empty) => { + queue.push_back(next_pos); + } + _ => {} + } + } + + Some(splits.to_string()) + } + + fn part_2(input: Self::Input) -> Option { + let (start, _) = input.iter().find(|(_, t)| **t == Tile::Start).unwrap(); + let mut queue = VecDeque::::new(); + let mut seen = HashMap::::new(); + + seen.insert(start, 1); + queue.push_front(start); + + let mut splits = 0; - day_stuff!(7, "", ""); + while let Some(pos) = queue.pop_front() { + let amnt = seen.get(&pos).copied().unwrap_or_default(); + let next_pos = pos.move_dir(Direction::South); + match input.get(next_pos) { + Some(Tile::Splitter) => { + for (next_pos, _) in next_pos.relatives(&[Direction::West, Direction::East]) { + if let Some(curr) = seen.get_mut(&next_pos) { + *curr += amnt; + } else { + seen.insert(next_pos, amnt); + queue.push_back(next_pos); + } + } + } + Some(Tile::Empty) => { + if let Some(curr) = seen.get_mut(&next_pos) { + *curr += amnt; + } else { + seen.insert(next_pos, amnt); + queue.push_back(next_pos); + } + } + None => { + splits += amnt; + } + _ => {} + } + } - fn part_1(_input: Self::Input) -> Option { - None + Some(splits.to_string()) } - fn part_2(_input: Self::Input) -> Option { - None + fn parse_input(input: &str) -> Self::Input { + Grid::parse(input) } } diff --git a/years/2025/src/examples/day_7/1.txt b/years/2025/src/examples/day_7/1.txt index e69de29..57a2466 100644 --- a/years/2025/src/examples/day_7/1.txt +++ b/years/2025/src/examples/day_7/1.txt @@ -0,0 +1,16 @@ +.......S....... +............... +.......^....... +............... +......^.^...... +............... +.....^.^.^..... +............... +....^.^...^.... +............... +...^.^...^.^... +............... +..^...^.....^.. +............... +.^.^.^.^.^...^. +............... diff --git a/years/2025/src/examples/day_7/2.txt b/years/2025/src/examples/day_7/2.txt index e69de29..57a2466 100644 --- a/years/2025/src/examples/day_7/2.txt +++ b/years/2025/src/examples/day_7/2.txt @@ -0,0 +1,16 @@ +.......S....... +............... +.......^....... +............... +......^.^...... +............... +.....^.^.^..... +............... +....^.^...^.... +............... +...^.^...^.^... +............... +..^...^.....^.. +............... +.^.^.^.^.^...^. +...............