From 263f2389a9dfced4d4ab76f3d42dbce53cfa77b1 Mon Sep 17 00:00:00 2001 From: Adrian Groh Date: Wed, 25 Dec 2024 10:41:00 +0100 Subject: [PATCH] Add day25 --- day25/Cargo.lock | 7 +++++++ day25/Cargo.toml | 6 ++++++ day25/src/main.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 day25/Cargo.lock create mode 100644 day25/Cargo.toml create mode 100644 day25/src/main.rs diff --git a/day25/Cargo.lock b/day25/Cargo.lock new file mode 100644 index 0000000..6eb9cdb --- /dev/null +++ b/day25/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "day25" +version = "0.1.0" diff --git a/day25/Cargo.toml b/day25/Cargo.toml new file mode 100644 index 0000000..e5f4cc3 --- /dev/null +++ b/day25/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day25" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/day25/src/main.rs b/day25/src/main.rs new file mode 100644 index 0000000..df158b6 --- /dev/null +++ b/day25/src/main.rs @@ -0,0 +1,49 @@ +#[derive(Debug, Clone)] +struct ParsedInput { + keys: Vec<[u8; 5]>, + locks: Vec<[u8; 5]>, +} + +fn parse_key(grid: &[Vec]) -> [u8; 5] { + let mut res = [0; 5]; + for (l_idx, line) in grid.iter().skip(1).enumerate().rev().skip(1) { + for (c_idx, c) in line.iter().enumerate() { + if c == &'#' && res[c_idx] == 0 { + res[c_idx] = l_idx as u8 + 1; + } + } + } + res +} + +fn parse(input: &str) -> ParsedInput { + let mut keys = vec![]; + let mut locks = vec![]; + for block in input.split("\n\n") { + let mut grid: Vec> = block.lines().map(|l| l.chars().collect()).collect(); + if grid[0][0] == '#' { + locks.push(parse_key(&grid)); + } else { + grid.reverse(); + keys.push(parse_key(&grid)); + } + } + ParsedInput { keys, locks } +} + +fn overlaps(key: &[u8; 5], lock: &[u8; 5]) -> bool { + key.iter().zip(lock.iter()).any(|(k, l)| 5 - k < *l) +} + +fn part1(parsed_input: &ParsedInput) -> usize { + parsed_input + .locks + .iter() + .map(|l| parsed_input.keys.iter().filter(|k| !overlaps(k, l)).count()) + .sum() +} + +fn main() { + let input = parse(include_str!("../input.txt")); + println!("{}", part1(&input)); +}