day25
This commit is contained in:
parent
561f762bc9
commit
2a340c2e04
|
@ -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);
|
||||
// }
|
||||
}
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue