use aoc_runner_derive::{aoc, aoc_generator}; use grid::Grid; #[aoc_generator(day4)] fn parse(input: &str) -> Grid { input.parse().unwrap() } #[aoc(day4, part1)] fn part1(input: &Grid) -> u64 { (0..input.height() * input.width()) .filter(|i| *input.get(&input.coord(*i as i64).unwrap()).unwrap() == b'@') .map(|i| input.neighbours_count(input.coord(i as i64).unwrap(), |c| *c == b'@')) .filter(|n| *n < 4) .count() as u64 } #[aoc(day4, part2)] fn part2(input: &Grid) -> u64 { input.width() as u64 } #[cfg(test)] mod tests { use super::*; const EXAMPLE: &str = "..@@.@@@@. @@@.@.@.@@ @@@@@.@.@@ @.@@@@..@. @@.@@@@.@@ .@@@@@@@.@ .@.@.@.@@@ @.@@@.@@@@ .@@@@@@@@. @.@.@@@.@."; #[test] fn part1_example() { assert_eq!(part1(&parse(EXAMPLE)), 13); } #[test] fn part2_example() { assert_eq!(part2(&parse(EXAMPLE)), 0); } }