day7 fast
This commit is contained in:
parent
6d557c35cf
commit
a7416ed056
|
@ -23,19 +23,19 @@ fn parse(input: &str) -> Input {
|
||||||
fn part1(input: &Input) -> usize {
|
fn part1(input: &Input) -> usize {
|
||||||
input
|
input
|
||||||
.iter()
|
.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)
|
.fold(0, |acc, v| acc + v.0 as usize)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn part1_test(curr: u64, target: u64, numbers: &[u64]) -> bool {
|
fn part1_test(target: i64, remaining: i64, numbers: &[u64]) -> bool {
|
||||||
if curr > target {
|
if numbers.is_empty() {
|
||||||
false
|
remaining == target
|
||||||
} else if numbers.is_empty() {
|
|
||||||
curr == target
|
|
||||||
} else {
|
} else {
|
||||||
let num = numbers[0];
|
let num = numbers[numbers.len() - 1] as i64;
|
||||||
let rest = &numbers[1..];
|
let rest = &numbers[0..numbers.len() - 1];
|
||||||
part1_test(curr + num, target, rest) || part1_test(curr * num, target, rest)
|
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 {
|
fn part2(input: &Input) -> usize {
|
||||||
input
|
input
|
||||||
.iter()
|
.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)
|
.fold(0, |acc, v| acc + v.0 as usize)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn concat(a: u64, b: u64) -> u64 {
|
fn part2_test(target: i64, remaining: i64, numbers: &[u64]) -> bool {
|
||||||
let digits = b.ilog10() + 1;
|
if numbers.is_empty() {
|
||||||
a * 10u64.pow(digits) + b
|
remaining == target
|
||||||
}
|
|
||||||
|
|
||||||
fn part2_test(curr: u64, target: u64, numbers: &[u64]) -> bool {
|
|
||||||
if curr > target {
|
|
||||||
false
|
|
||||||
} else if numbers.is_empty() {
|
|
||||||
curr == target
|
|
||||||
} else {
|
} else {
|
||||||
let num = numbers[0];
|
let num = numbers[numbers.len() - 1] as i64;
|
||||||
let rest = &numbers[1..];
|
let rest = &numbers[0..numbers.len() - 1];
|
||||||
part2_test(curr + num, target, rest)
|
let mul = remaining % num == 0 && part2_test(target, remaining / num, rest);
|
||||||
|| part2_test(curr * num, target, rest)
|
let pow = 10i64.pow(num.ilog10() + 1);
|
||||||
|| part2_test(concat(curr, num), target, rest)
|
let con = remaining % pow == num && part2_test(target, remaining / pow, rest);
|
||||||
|
let add = part2_test(target, remaining - num, rest);
|
||||||
|
mul || con || add
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue