From 4e0f8ed0e69a7b6a250e960ee22b9511a096cbc5 Mon Sep 17 00:00:00 2001 From: sepia Date: Fri, 27 Dec 2024 02:29:04 -0600 Subject: [PATCH] Day 25 (late) --- src/day25.rs | 23 +++++++++++++++++++++++ src/main.rs | 4 +++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/day25.rs diff --git a/src/day25.rs b/src/day25.rs new file mode 100644 index 0000000..e2527b3 --- /dev/null +++ b/src/day25.rs @@ -0,0 +1,23 @@ +use crate::util::maps::World; + +pub fn day25() { + let keys_and_locks: Vec> = crate::input(25) + .split("\n\n") + .map(|keylock| World::from_string(keylock).map(|&c| c == '#')) + .collect(); + let (locks, keys): (Vec>, Vec>) = + keys_and_locks.into_iter().partition(|key_or_lock| { + (0..key_or_lock.width()).all(|x| key_or_lock.get(x, 0) == Some(true)) + }); + + let combos: usize = locks + .iter() + .map(|lock| keys.iter().filter(|key| fits(key, lock)).count()) + .sum(); + println!("There are {combos} combinations of keys and locks that work."); +} + +fn fits(key: &World, lock: &World) -> bool { + !key.enumerate() + .any(|(x, y, c)| *c && lock.get(x, y) == Some(true)) +} diff --git a/src/main.rs b/src/main.rs index ac2726a..94c3f44 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,7 +32,9 @@ mod day21; mod day22; #[allow(dead_code)] mod day23; +#[allow(dead_code)] mod day24; +mod day25; #[allow(dead_code)] mod day3; #[allow(dead_code)] @@ -49,7 +51,7 @@ mod day8; mod day9; fn main() { - day24::day24(); + day25::day25(); } pub fn input(day: u8) -> String {