From 20242ad04cbd10342731133ed065d279b967686d Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 31 Jul 2025 19:47:57 +0200 Subject: [PATCH] day 25 --- src/day25.rs | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 1 + 3 files changed, 119 insertions(+) create mode 100644 src/day25.rs diff --git a/src/day25.rs b/src/day25.rs new file mode 100644 index 0000000..a84fa74 --- /dev/null +++ b/src/day25.rs @@ -0,0 +1,117 @@ +use std::fs::read_to_string; + +use itertools::Itertools; + +pub fn day_main() { + let input = read_to_string("input/day25.txt").unwrap(); + let input = input.trim(); + println!(" part1: {}", part1(input)); +} + +type RiddleResult = i64; + +fn part1(input: &str) -> RiddleResult { + let (locks, keys): (Vec<_>, Vec<_>) = input + .split("\n\n") + .map(|item| { + let block = item + .lines() + .map(|line| line.chars().collect_vec()) + .collect_vec(); + let lock = block[0].contains(&'#'); + let summary: (u8, u8, u8, u8, u8) = if lock { + // lock + (0..5) + .map(|x| { + (0..6) + .map(|y| block[y][x]) + .enumerate() + .find(|(_, it)| *it == '.') + .unwrap_or((6, '.')) + .0 as u8 + }) + .collect_tuple() + .unwrap() + } else { + (0..5) + .map(|x| { + 7 - ((0..6) + .map(|y| block[y][x]) + .enumerate() + .find(|(_, it)| *it == '#') + .unwrap_or((6, '.')) + .0 as u8) + }) + .collect_tuple() + .unwrap() + }; + (lock, summary.0, summary.1, summary.2, summary.3, summary.4) + }) + .partition(|s| s.0); + + let mut matches = 0; + for lock in locks { + for &key in &keys { + if lock.1 + key.1 < 8 + && lock.2 + key.2 < 8 + && lock.3 + key.3 < 8 + && lock.4 + key.4 < 8 + && lock.5 + key.5 < 8 + { + matches += 1; + } + } + } + matches +} + +#[cfg(test)] +mod test { + use super::part1; + + const TEST_INPUT: &str = r"##### +.#### +.#### +.#### +.#.#. +.#... +..... + +##### +##.## +.#.## +...## +...#. +...#. +..... + +..... +#.... +#.... +#...# +#.#.# +#.### +##### + +..... +..... +#.#.. +###.. +###.# +###.# +##### + +..... +..... +..... +#.... +#.#.. +#.#.# +##### + "; + + #[test] + fn test1() { + assert_eq!(part1(TEST_INPUT), 3); + } +} diff --git a/src/lib.rs b/src/lib.rs index 6bec050..3e45b50 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,5 +19,6 @@ pub mod day19; pub mod day22; pub mod day23; pub mod day24; +pub mod day25; // PLACEHOLDER pub mod utils; diff --git a/src/main.rs b/src/main.rs index eae4df8..fc28a7b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,6 +27,7 @@ fn main() { (23, day23::day_main), (23, day23::day_main), (24, day24::day_main), + (25, day25::day_main), // PLACEHOLDER ]); let day: Option = args().nth(1).and_then(|a| a.parse().ok());