From 226a1fde49ce942ea21bb54318cd405c47399120 Mon Sep 17 00:00:00 2001 From: Johannes Date: Sat, 7 Dec 2024 06:50:13 +0100 Subject: [PATCH] day 7 part 1 --- src/day07.rs | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 1 + 3 files changed, 96 insertions(+) create mode 100644 src/day07.rs diff --git a/src/day07.rs b/src/day07.rs new file mode 100644 index 0000000..0c78ed2 --- /dev/null +++ b/src/day07.rs @@ -0,0 +1,94 @@ +use std::fs::read_to_string; + +use itertools::Itertools; +use regex::Regex; + +pub fn day_main() { + let input = read_to_string("input/day07.txt").unwrap(); + let input = input.trim(); + println!(" part1: {}", part1(input)); + println!(" part2: {}", part2(input)); +} + +type RiddleResult = i64; + +fn part1(input: &str) -> RiddleResult { + let regex = Regex::new("(\\d+)").unwrap(); + input + .lines() + .map(|line| { + regex + .find_iter(line) + .map(|capture| capture.as_str().parse::().unwrap()) + .collect_vec() + }) + .filter(well_calibrated) + .map(|v| v[0]) + .sum() +} + +fn well_calibrated(list: &Vec) -> bool { + let expected = list[0]; + let operands = list.iter().skip(1).copied().collect_vec(); + let operators = ops(operands.len() - 1); + for ops in operators.into_iter() { + // dbg!(&ops); + let v = ops + .into_iter() + .zip(operands.iter().skip(1)) + .fold(operands[0], |acc, (op, val)| match op { + '*' => acc * val, + '+' => acc + val, + _ => panic!(), + }); + if v == expected { + return true; + } + } + false +} + +fn ops(n: usize) -> Vec> { + if n == 1 { + return vec![vec!['+'], vec!['*']]; + } + let v = ops(n - 1); + v.into_iter() + .flat_map(|vector| { + let mut v1 = vector.clone(); + let mut v2 = vector; + v1.push('+'); + v2.push('*'); + [v1, v2] + }) + .collect_vec() +} + +fn part2(_input: &str) -> RiddleResult { + 0 +} + +#[cfg(test)] +mod test { + use super::{part1, part2}; + + const TEST_INPUT: &str = r"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 test1() { + assert_eq!(part1(TEST_INPUT), 3749); + } + + #[test] + fn test2() { + assert_eq!(part2(TEST_INPUT), 0); + } +} diff --git a/src/lib.rs b/src/lib.rs index 7c6022d..e34887c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,4 +4,5 @@ pub mod day03; pub mod day04; pub mod day05; pub mod day06; +pub mod day07; pub mod utils; diff --git a/src/main.rs b/src/main.rs index b76a02a..b721434 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ fn main() { (4, day04::day_main), (5, day05::day_main), (6, day06::day_main), + (7, day07::day_main), ]); let day: Option = args().nth(1).and_then(|a| a.parse().ok()); let Some(day) = day else {