diff --git a/src/day12.rs b/src/day12.rs new file mode 100644 index 0000000..568ad06 --- /dev/null +++ b/src/day12.rs @@ -0,0 +1,70 @@ +use std::{collections::HashSet, fs::read_to_string}; + +use crate::utils::grid::{Coord, Grid}; + +pub fn day_main() { + let input = read_to_string("input/day12.txt").unwrap(); + let input = input.trim(); + println!(" part1: {}", part1(input)); + println!(" part2: {}", part2(input)); +} + +type RiddleResult = u64; + +const NEIGHBORS: &[Coord] = &[(1, 0), (0, 1), (-1, 0), (0, -1)]; + +fn part1(input: &str) -> RiddleResult { + let garden = Grid::parse(input); + let mut processed: HashSet = HashSet::new(); + let mut result = 0; + for (p, c) in garden.entries() { + if processed.contains(&p) { + continue; + } + let mut area = 0; + let mut fence = 0; + let mut further = vec![p]; + while let Some(current) = further.pop() { + if processed.contains(¤t) { + continue; + } + area += 1; + for next in NEIGHBORS.iter().map(|d| (current.0 + d.0, current.1 + d.1)) { + let next_c = garden.get(next); + if next_c.is_none() || next_c.unwrap() != c { + fence += 1; + } else { + further.push(next); + } + } + processed.insert(current); + } + result += area * fence; + } + result +} + +fn part2(_input: &str) -> RiddleResult { + 0 +} + +#[cfg(test)] +mod test { + use super::{part1, part2}; + + const TEST_INPUT: &str = r"AAAA +BBCD +BBCC +EEEC +"; + + #[test] + fn test1() { + assert_eq!(part1(TEST_INPUT), 140); + } + + #[test] + fn test2() { + assert_eq!(part2(TEST_INPUT), 0); + } +} diff --git a/src/lib.rs b/src/lib.rs index cb167e1..1fd7d50 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,5 +9,6 @@ pub mod day08; pub mod day09; pub mod day10; pub mod day11; +pub mod day12; // PLACEHOLDER pub mod utils; diff --git a/src/main.rs b/src/main.rs index 6a4cda3..71345d0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,7 @@ fn main() { (9, day09::day_main), (10, day10::day_main), (11, day11::day_main), + (12, day12::day_main), // PLACEHOLDER ]); let day: Option = args().nth(1).and_then(|a| a.parse().ok());