Poging tot dag 7 aoc, hele rare bug in rust lijkt het wel bijna, krijg niet eens een lijst normaal gevouwen
This commit is contained in:
91
advent_of_code/2024/7/src/main.rs
Normal file
91
advent_of_code/2024/7/src/main.rs
Normal file
@@ -0,0 +1,91 @@
|
||||
use nom::{
|
||||
bytes::complete::tag,
|
||||
character::complete::{i32, multispace1},
|
||||
multi::separated_list1,
|
||||
sequence::separated_pair,
|
||||
IResult,
|
||||
};
|
||||
|
||||
fn parse(input: &str) -> IResult<&str, Vec<(i32, Vec<i32>)>> {
|
||||
let (input, result) = separated_list1(
|
||||
multispace1,
|
||||
separated_pair(i32, tag(": "), separated_list1(tag(" "), i32)),
|
||||
)(input)?;
|
||||
|
||||
Ok((input, result))
|
||||
}
|
||||
|
||||
fn check(original_target: i32, line: &[i32]) -> Option<i32> {
|
||||
//dbg!(original_target, &line);
|
||||
if line.iter().fold(1, |p, n| p * n) > original_target {
|
||||
return None;
|
||||
}
|
||||
|
||||
let mut target = original_target;
|
||||
let mut i = line.len() as i32 - 1;
|
||||
|
||||
while i >= 0 {
|
||||
let modulo = target % line[i as usize];
|
||||
|
||||
if modulo == 0 {
|
||||
target /= line[i as usize];
|
||||
|
||||
let plus_result = check(target - line[i as usize], &line[0..i as usize]);
|
||||
|
||||
if plus_result.is_some() {
|
||||
return plus_result;
|
||||
}
|
||||
} else {
|
||||
target -= line[i as usize];
|
||||
}
|
||||
|
||||
if target < 0 {
|
||||
return None;
|
||||
}
|
||||
|
||||
i -= 1;
|
||||
}
|
||||
|
||||
if target == 0 {
|
||||
Some(original_target)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn solve_1(input: &str) -> i32 {
|
||||
let (_, lines) = parse(input).unwrap();
|
||||
|
||||
lines.into_iter().fold(0, |result, line| {
|
||||
dbg!(&line);
|
||||
result + check(line.0, &line.1[..]).unwrap_or_default()
|
||||
})
|
||||
}
|
||||
|
||||
fn solve_2(input: &str) {}
|
||||
|
||||
fn main() {
|
||||
println!("Hello, this is Patrick!");
|
||||
|
||||
let input = include_str!("../input.txt");
|
||||
|
||||
let result_1 = solve_1(input);
|
||||
println!("The total calibration result is {}", result_1);
|
||||
|
||||
let result_2 = solve_2(input);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_1() {
|
||||
let test_input = include_str!("../test.txt");
|
||||
assert_eq!(solve_1(test_input), 3749);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_2() {}
|
||||
}
|
||||
Reference in New Issue
Block a user