diff --git a/AoC_2025/src/days/day04.rs b/AoC_2025/src/days/day04.rs new file mode 100644 index 0000000..9d60026 --- /dev/null +++ b/AoC_2025/src/days/day04.rs @@ -0,0 +1,66 @@ +use crate::days::Solution; +use std::cmp::{max, min}; + +pub struct Day04; + +impl Solution for Day04 { + type Input = Vec>; + + fn parse(&self, data: &str) -> Self::Input { + data.split("\n") + .filter(|s| !s.is_empty()) + .map(|s| s.chars().map(|c| c == '@').collect()) + .collect() + } + + fn part1(&self, input: &Self::Input) -> usize { + input + .iter() + .enumerate() + .map(|(x, l)| { + l.iter() + .enumerate() + .filter(move |(y, v)| { + **v && neighbors((x, *y), input.len()) + .iter() + .filter(|(nx, ny)| input[*nx][*ny]) + .count() + < 4 + }) + .count() + }) + .sum() + } + + fn part2(&self, input: &Self::Input) -> usize { + 0 + } +} + +fn coord_in_range((x, y): (i32, i32), size: usize) -> (usize, usize) { + ( + min(max(x, 0) as usize, size - 1), + min(max(y, 0) as usize, size - 1), + ) +} + +fn neighbors((x, y): (usize, usize), size: usize) -> Vec<(usize, usize)> { + (0..=2) + .map(|i| i as i32 - 1) + .flat_map(|dx| { + (0..=2) + .map(|i| i as i32 - 1) + .filter_map(|dy| { + if dx != 0 || dy != 0 { + Some(coord_in_range((x as i32 + dx, y as i32 + dy), size)) + } else { + None + } + }) + .filter(|n| *n != (x, y)) + .collect::>() + }) + .collect::>() + .into_iter() + .collect::>() +} diff --git a/AoC_2025/src/days/mod.rs b/AoC_2025/src/days/mod.rs index 3b80959..0d5fd87 100644 --- a/AoC_2025/src/days/mod.rs +++ b/AoC_2025/src/days/mod.rs @@ -1,6 +1,7 @@ pub mod day01; pub mod day02; pub mod day03; +pub mod day04; pub trait Solution { type Input; diff --git a/AoC_2025/src/main.rs b/AoC_2025/src/main.rs index 01667eb..3c957b5 100644 --- a/AoC_2025/src/main.rs +++ b/AoC_2025/src/main.rs @@ -36,6 +36,7 @@ fn main() { 1 => run(cli.day, days::day01::Day01), 2 => run(cli.day, days::day02::Day02), 3 => run(cli.day, days::day03::Day03), + 4 => run(cli.day, days::day04::Day04), _ => { eprintln!("Day {:02} is not implemented yet!", cli.day); process::exit(1);