diff --git a/aoc_2024/src/day25.rs b/aoc_2024/src/day25.rs new file mode 100644 index 0000000..3c46f61 --- /dev/null +++ b/aoc_2024/src/day25.rs @@ -0,0 +1,152 @@ +use aoc_runner_derive::{aoc, aoc_generator}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Cell { + Empty, + Filled, +} + +type Code = [usize; 5]; + +type Input = (Vec, Vec); + +#[aoc_generator(day25)] +fn parse(input: &str) -> Input { + let (keys, locks): (Vec>>>, Vec>>>) = input + .split("\n\n") + .map(|block| { + block + .lines() + .map(|line| { + line.chars() + .map(|c| match c { + '.' => Cell::Empty, + '#' => Cell::Filled, + _ => panic!("Invalid cell"), + }) + .collect() + }) + .collect() + }) + .map(|block: Vec>| { + if block[0][0] == Cell::Filled { + (None, Some(block)) + } else { + (Some(block), None) + } + }) + .unzip(); + + let keys = keys + .into_iter() + .flatten() + .map(|block| { + let mut buffer = [0; 5]; + for (y, row) in block.iter().enumerate() { + for x in 0..5 { + if row[x] == Cell::Empty { + buffer[x] = y; + } + } + } + buffer + }) + .collect(); + let locks = locks + .into_iter() + .flatten() + .map(|block| { + let mut buffer = [0; 5]; + for (y, row) in block.iter().enumerate() { + for x in 0..5 { + if row[x] == Cell::Filled { + buffer[x] = y; + } + } + } + buffer + }) + .collect(); + + (keys, locks) +} + +#[aoc(day25, part1)] +fn part1(input: &Input) -> usize { + let (keys, locks) = input; + + let mut valid_combinations = 0; + + for key in keys { + for lock in locks { + if (0..5).all(|i| key[i] >= lock[i]) { + valid_combinations += 1; + } + } + } + + valid_combinations +} + +// #[aoc(day25, part2)] +// fn part2(input: &Input) -> usize { +// todo!() +// } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn part1_example() { + assert_eq!( + part1(&parse( + "##### +.#### +.#### +.#### +.#.#. +.#... +..... + +##### +##.## +.#.## +...## +...#. +...#. +..... + +..... +#.... +#.... +#...# +#.#.# +#.### +##### + +..... +..... +#.#.. +###.. +###.# +###.# +##### + +..... +..... +..... +#.... +#.#.. +#.#.# +#####" + )), + 3 + ); + } + + // #[test] + // fn part2_example() { + // assert_eq!(part2(&parse("")), 0); + // } +} diff --git a/aoc_2024/src/lib.rs b/aoc_2024/src/lib.rs index c0a80e3..47fc1f9 100644 --- a/aoc_2024/src/lib.rs +++ b/aoc_2024/src/lib.rs @@ -1,7 +1,3 @@ -mod day24; -mod day23; -mod day22; -mod day21; mod day1; mod day10; mod day11; @@ -15,6 +11,11 @@ mod day18; mod day19; mod day2; mod day20; +mod day21; +mod day22; +mod day23; +mod day24; +mod day25; mod day3; mod day4; mod day5;