From 57b0474d09acd15c479403e3d9908bc2307d3b64 Mon Sep 17 00:00:00 2001 From: Lars Martens Date: Thu, 4 Dec 2025 08:17:31 +0100 Subject: [PATCH] Solve 04 --- src/bin/04.rs | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/bin/04.rs diff --git a/src/bin/04.rs b/src/bin/04.rs new file mode 100644 index 0000000..3f0ce5a --- /dev/null +++ b/src/bin/04.rs @@ -0,0 +1,75 @@ +use aoc::*; +use glam::IVec2; +use std::collections::HashSet; + +const INPUT: &str = include_str!("../../input/04"); + +fn main() { + println!("Part 1: {}", part1(INPUT)); + println!("Part 2: {}", part2(INPUT)); +} + +#[test] +fn example() { + assert_example!(part1, "04-test", 13); + assert_example!(part2, "04-test", 43); +} + +fn part1(input: &str) -> usize { + let mut rolls = parse_input(input); + remove_accessible(&mut rolls) +} + +fn part2(input: &str) -> usize { + let mut rolls = parse_input(input); + let mut sum = 0; + + loop { + let removed = remove_accessible(&mut rolls); + sum += removed; + if removed == 0 { + break; + } + } + + sum +} + +fn remove_accessible(rolls: &mut HashSet) -> usize { + let mut accessible = Vec::new(); + + for roll in rolls.iter().copied() { + let mut neighbors = 0; + for dir in DIRECTIONS8 { + let neighbor = roll + dir; + if rolls.contains(&neighbor) { + neighbors += 1; + } + } + if neighbors < 4 { + accessible.push(roll); + } + } + + let result = accessible.len(); + + for accessible in accessible { + rolls.remove(&accessible); + } + + result +} + +fn parse_input(input: &str) -> HashSet { + let mut result = HashSet::new(); + + for (y, line) in input.lines().enumerate() { + for (x, c) in line.chars().enumerate() { + if c == '@' { + result.insert(IVec2::new(x as i32, y as i32)); + } + } + } + + result +}