From 8475ff1ea4356c94ceef868a25ad42d2d882d742 Mon Sep 17 00:00:00 2001 From: alex <> Date: Sat, 7 Dec 2024 09:23:41 +0100 Subject: [PATCH] Day07 - part 1 --- src/day07.rs | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 ++ 2 files changed, 94 insertions(+) create mode 100644 src/day07.rs diff --git a/src/day07.rs b/src/day07.rs new file mode 100644 index 0000000..1b1f41f --- /dev/null +++ b/src/day07.rs @@ -0,0 +1,92 @@ +use std::error::Error; +use std::path::Path; + +fn possible_values(operands: &[u64]) -> Vec { + let mut res: Vec = Vec::new(); + for o in operands { + if res.is_empty() { + res.push(*o); + } + else { + let tmp = res.clone(); + res = Vec::new(); + for t in tmp { + res.push(t + o); + res.push(t * o); + } + } + } + res +} + +fn run_part1(input: &str) -> Result> { + println!("Running {} - part 1", get_day()); + + let res = input.lines() + .map(|l| { + let (tot, ops) = l.split_once(":").unwrap(); + let ops = ops.trim().split(" ") + .map(|v| v.parse::().unwrap()) + .collect::>(); + (tot.parse::().unwrap(), ops) + }) + .map(|(tot, ops)| { + let values = possible_values(&ops); + if values.contains(&tot) { + tot + } + else { + 0 + } + }) + .sum(); + + 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 = "\ +190: 10 19 +3267: 81 40 27 +83: 17 5 +156: 15 6 +7290: 6 8 6 15 +161011: 16 10 13 +192: 17 8 14 +21037: 9 7 18 13 +292: 11 6 16 20"; + + #[test] + fn test_part1() { + assert_eq!(3749, 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 9d5ac55..a3058a0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ pub mod day03; pub mod day04; pub mod day05; pub mod day06; +pub mod day07; fn main() { let args: Vec = env::args().collect(); @@ -38,6 +39,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "day04" => day04::run(&input)?, "day05" => day05::run(&input)?, "day06" => day06::run(&input)?, + "day07" => day07::run(&input)?, _ => return Err(format!("unknown or unimplemented day \"{day}\"").into()), } Ok(()) -- 2.39.5