This commit is contained in:
Jan-Bulthuis 2024-12-25 06:26:15 +01:00
parent 561f762bc9
commit 2a340c2e04
2 changed files with 157 additions and 4 deletions

152
aoc_2024/src/day25.rs Normal file
View File

@ -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<Code>, Vec<Code>);
#[aoc_generator(day25)]
fn parse(input: &str) -> Input {
let (keys, locks): (Vec<Option<Vec<Vec<Cell>>>>, Vec<Option<Vec<Vec<Cell>>>>) = 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<Vec<Cell>>| {
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("<EXAMPLE>")), 0);
// }
}

View File

@ -1,7 +1,3 @@
mod day24;
mod day23;
mod day22;
mod day21;
mod day1; mod day1;
mod day10; mod day10;
mod day11; mod day11;
@ -15,6 +11,11 @@ mod day18;
mod day19; mod day19;
mod day2; mod day2;
mod day20; mod day20;
mod day21;
mod day22;
mod day23;
mod day24;
mod day25;
mod day3; mod day3;
mod day4; mod day4;
mod day5; mod day5;