From: alex <> Date: Wed, 25 Dec 2024 15:24:14 +0000 (+0100) Subject: Day25 - part 1 X-Git-Url: https://aoc.elinar.fr/?a=commitdiff_plain;ds=sidebyside;p=aoc_2024 Day25 - part 1 --- diff --git a/src/day25.rs b/src/day25.rs new file mode 100644 index 0000000..d548139 --- /dev/null +++ b/src/day25.rs @@ -0,0 +1,143 @@ +use std::error::Error; +use std::path::Path; +use std::collections::HashMap; + +const WIDTH: u8 = 5; +const HEIGHT: u8 = 7; + +struct Puzzle { + locks: Vec>, + keys: Vec>, +} + +impl Puzzle { + pub fn new(input: &str) -> Self { + let mut locks: Vec> = Vec::new(); + let mut keys: Vec> = Vec::new(); + + input.split("\n\n").for_each(|b| { + let mut block: HashMap<(u8, u8), u8> = HashMap::new(); + b.lines().enumerate() + .for_each(|(row, line)| { + line.as_bytes().iter().enumerate() + .for_each(|(col, value)| { + block.insert((row as u8, col as u8), *value); + }); + }); + + let mut heights: Vec = Vec::new(); + (0..WIDTH).for_each(|i| { + heights.push( + block.iter().filter(|&((_, col), value)| { + *col == i && *value == b'#' + }) + .count() as u8 - 1 // remove the base row + ); + }); + + match *block.get(&(0,0)).unwrap() { + b'#' => locks.push(heights), + b'.' => keys.push(heights), + _ => unreachable!(), + } + + }); + + Self { locks, keys } + } + + fn unique_key_lock_pairs(&self) -> u32 { + let mut count: u32 = 0; + self.locks.iter().for_each(|lock| { + count += self.keys.iter().filter(|key| { + key.iter().zip(lock.iter()).all(|(k, l)| k + l + 1 < HEIGHT) + }) + .count() as u32; + }); + count + } +} + +fn run_part1(input: &str) -> Result> { + println!("Running {} - part 1", get_day()); + + let puzzle = Puzzle::new(input); + Ok(puzzle.unique_key_lock_pairs()) +} + +fn run_part2(input: &str) -> Result> { + println!("Running {} - part 2", get_day()); + + Ok(0) +} + +pub fn run(input: &str) -> Result<(), Box> { + let res = run_part1(input)?; + println!("{res}"); + + let res = run_part2(input)?; + println!("{res}"); + + Ok(()) +} + +fn get_day() -> String { + let filename = file!(); + Path::new(filename).file_stem().unwrap().to_str().unwrap().to_string() +} + +#[cfg(test)] +mod tests { + use super::*; + + static TEXT_INPUT: &str = "\ +##### +.#### +.#### +.#### +.#.#. +.#... +..... + +##### +##.## +.#.## +...## +...#. +...#. +..... + +..... +#.... +#.... +#...# +#.#.# +#.### +##### + +..... +..... +#.#.. +###.. +###.# +###.# +##### + +..... +..... +..... +#.... +#.#.. +#.#.# +#####"; + + #[test] + fn test_part1() { + assert_eq!(3, run_part1(TEXT_INPUT).unwrap()); + } + + #[test] + fn test_part2() { + assert_eq!(0, run_part2(TEXT_INPUT).unwrap()); + } +} diff --git a/src/main.rs b/src/main.rs index a7f650f..f4a8007 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,6 +27,7 @@ pub mod day20; pub mod day22; pub mod day23; pub mod day24; +pub mod day25; fn main() { let args: Vec = env::args().collect(); @@ -72,6 +73,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "day22" => day22::run(&input)?, "day23" => day23::run(&input)?, "day24" => day24::run(&input)?, + "day25" => day25::run(&input)?, _ => return Err(format!("unknown or unimplemented day \"{day}\"").into()), } Ok(())