1
0
Fork 0
This commit is contained in:
Lars Martens 2025-12-04 08:17:31 +01:00
parent 90eeb5dc03
commit 57b0474d09
Signed by: haselkern
GPG key ID: B5CF1F363C179AD4

75
src/bin/04.rs Normal file
View file

@ -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<IVec2>) -> 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<IVec2> {
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
}