day7 fast

This commit is contained in:
Jan-Bulthuis 2024-12-07 15:48:34 +01:00
parent 6d557c35cf
commit a7416ed056
1 changed files with 20 additions and 25 deletions

View File

@ -23,19 +23,19 @@ fn parse(input: &str) -> Input {
fn part1(input: &Input) -> usize {
input
.iter()
.filter(|v| part1_test(v.1[0], v.0, &v.1[1..]))
.filter(|v| part1_test(v.1[0] as i64, v.0 as i64, &v.1[1..]))
.fold(0, |acc, v| acc + v.0 as usize)
}
fn part1_test(curr: u64, target: u64, numbers: &[u64]) -> bool {
if curr > target {
false
} else if numbers.is_empty() {
curr == target
fn part1_test(target: i64, remaining: i64, numbers: &[u64]) -> bool {
if numbers.is_empty() {
remaining == target
} else {
let num = numbers[0];
let rest = &numbers[1..];
part1_test(curr + num, target, rest) || part1_test(curr * num, target, rest)
let num = numbers[numbers.len() - 1] as i64;
let rest = &numbers[0..numbers.len() - 1];
let mul = remaining % num == 0 && part1_test(target, remaining / num, rest);
let add = part1_test(target, remaining - num, rest);
mul || add
}
}
@ -43,26 +43,21 @@ fn part1_test(curr: u64, target: u64, numbers: &[u64]) -> bool {
fn part2(input: &Input) -> usize {
input
.iter()
.filter(|v| part2_test(v.1[0], v.0, &v.1[1..]))
.filter(|v| part2_test(v.1[0] as i64, v.0 as i64, &v.1[1..]))
.fold(0, |acc, v| acc + v.0 as usize)
}
fn concat(a: u64, b: u64) -> u64 {
let digits = b.ilog10() + 1;
a * 10u64.pow(digits) + b
}
fn part2_test(curr: u64, target: u64, numbers: &[u64]) -> bool {
if curr > target {
false
} else if numbers.is_empty() {
curr == target
fn part2_test(target: i64, remaining: i64, numbers: &[u64]) -> bool {
if numbers.is_empty() {
remaining == target
} else {
let num = numbers[0];
let rest = &numbers[1..];
part2_test(curr + num, target, rest)
|| part2_test(curr * num, target, rest)
|| part2_test(concat(curr, num), target, rest)
let num = numbers[numbers.len() - 1] as i64;
let rest = &numbers[0..numbers.len() - 1];
let mul = remaining % num == 0 && part2_test(target, remaining / num, rest);
let pow = 10i64.pow(num.ilog10() + 1);
let con = remaining % pow == num && part2_test(target, remaining / pow, rest);
let add = part2_test(target, remaining - num, rest);
mul || con || add
}
}