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 {