1
0

day 7 part 1

This commit is contained in:
2024-12-07 06:50:13 +01:00
parent 2392539b6e
commit 226a1fde49
3 changed files with 96 additions and 0 deletions

94
src/day07.rs Normal file
View File

@@ -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::<i64>().unwrap())
.collect_vec()
})
.filter(well_calibrated)
.map(|v| v[0])
.sum()
}
fn well_calibrated(list: &Vec<i64>) -> 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<Vec<char>> {
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);
}
}

View File

@@ -4,4 +4,5 @@ pub mod day03;
pub mod day04; pub mod day04;
pub mod day05; pub mod day05;
pub mod day06; pub mod day06;
pub mod day07;
pub mod utils; pub mod utils;

View File

@@ -11,6 +11,7 @@ fn main() {
(4, day04::day_main), (4, day04::day_main),
(5, day05::day_main), (5, day05::day_main),
(6, day06::day_main), (6, day06::day_main),
(7, day07::day_main),
]); ]);
let day: Option<u8> = args().nth(1).and_then(|a| a.parse().ok()); let day: Option<u8> = args().nth(1).and_then(|a| a.parse().ok());
let Some(day) = day else { let Some(day) = day else {