From 43b26c727e4ca035e2a83320126e74d736455525 Mon Sep 17 00:00:00 2001 From: alex <> Date: Thu, 19 Dec 2024 12:39:48 +0100 Subject: [PATCH] Day19 - part 1 --- src/day19.rs | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 + 2 files changed, 106 insertions(+) create mode 100644 src/day19.rs diff --git a/src/day19.rs b/src/day19.rs new file mode 100644 index 0000000..710105d --- /dev/null +++ b/src/day19.rs @@ -0,0 +1,104 @@ +use std::error::Error; +use std::path::Path; +use std::collections::HashSet; + +fn is_valid_design(design: &str, patterns: &HashSet<&str>) -> bool { + + if design.is_empty() { + return true + } + + for i in 0..design.len() { + if patterns.contains(&design[0..=i]) && + is_valid_design(&design[(i+1)..design.len()], patterns) + { + return true + } + } + + false +} + +fn run_part1(input: &str) -> Result> { + println!("Running {} - part 1", get_day()); + + let (patterns, designs) = input.split_once("\n\n").unwrap(); + let patterns: HashSet<&str> = patterns.split(", ") + .collect(); + + let res = designs.lines() + .filter(|d| is_valid_design(d, &patterns)) + .count() as u32; + + Ok(res) +} + +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 = "\ +r, wr, b, g, bwu, rb, gb, br + +brwrr +bggr +gbbr +rrbgbr +ubwu +bwurrg +brgr +bbrgwb"; + + static TEXT_INPUT_1: &str = "\ +abcde + +abcde +abcdee"; + + static TEXT_INPUT_2: &str = "\ +a, b, c, d, e + +abcde +abcdee"; + + static TEXT_INPUT_3: &str = "\ +a, b, bc, d, ee + +abcde +abcdee +abcdeea"; + + #[test] + fn test_part1() { + assert_eq!(6, run_part1(TEXT_INPUT).unwrap()); + assert_eq!(1, run_part1(TEXT_INPUT_1).unwrap()); + assert_eq!(2, run_part1(TEXT_INPUT_2).unwrap()); + assert_eq!(2, run_part1(TEXT_INPUT_3).unwrap()); + } + + #[test] + fn test_part2() { + assert_eq!(0, run_part2(TEXT_INPUT).unwrap()); + } +} diff --git a/src/main.rs b/src/main.rs index 6e295f8..57cd4b5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,6 +22,7 @@ pub mod day15; pub mod day16; pub mod day17; pub mod day18; +pub mod day19; fn main() { let args: Vec = env::args().collect(); @@ -62,6 +63,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "day16" => day16::run(&input)?, "day17" => day17::run(&input)?, "day18" => day18::run(&input)?, + "day19" => day19::run(&input)?, _ => return Err(format!("unknown or unimplemented day \"{day}\"").into()), } Ok(()) -- 2.39.5