generated from janezicmatej/aoc-template
solution: day 7
This commit is contained in:
parent
00000090a2
commit
0000010070
|
@ -0,0 +1,9 @@
|
||||||
|
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
|
|
@ -0,0 +1,81 @@
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
fn calibrate_equation(
|
||||||
|
fns: &[fn(a: usize, b: usize) -> usize],
|
||||||
|
target: usize,
|
||||||
|
nums: &[usize],
|
||||||
|
acc: usize,
|
||||||
|
) -> bool {
|
||||||
|
if nums.is_empty() {
|
||||||
|
return target == acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if acc > target {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
fns.iter()
|
||||||
|
.any(|f| calibrate_equation(fns, target, &nums[1..], f(acc, nums[0])))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(input: &str) -> Vec<Vec<usize>> {
|
||||||
|
input
|
||||||
|
.lines()
|
||||||
|
.map(|l| {
|
||||||
|
l.split([' ', ':'])
|
||||||
|
.filter_map(|x| x.parse().ok())
|
||||||
|
.collect_vec()
|
||||||
|
})
|
||||||
|
.collect_vec()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sum(a: usize, b: usize) -> usize {
|
||||||
|
a + b
|
||||||
|
}
|
||||||
|
|
||||||
|
fn prod(a: usize, b: usize) -> usize {
|
||||||
|
a * b
|
||||||
|
}
|
||||||
|
|
||||||
|
fn concat(a: usize, b: usize) -> usize {
|
||||||
|
a * 10_usize.pow(b.ilog10() + 1) + b
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_one(input: &str) -> Option<usize> {
|
||||||
|
parse_input(input)
|
||||||
|
.into_iter()
|
||||||
|
.filter(|n| calibrate_equation(&[sum, prod], n[0], &n[2..], n[1]))
|
||||||
|
.map(|n| n[0])
|
||||||
|
.sum::<usize>()
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_two(input: &str) -> Option<usize> {
|
||||||
|
parse_input(input)
|
||||||
|
.into_iter()
|
||||||
|
.filter(|n| calibrate_equation(&[sum, prod, concat], n[0], &n[2..], n[1]))
|
||||||
|
.map(|n| n[0])
|
||||||
|
.sum::<usize>()
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
aoc::solution!(7);
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
#[test]
|
||||||
|
fn test_part_one() {
|
||||||
|
assert_eq!(
|
||||||
|
part_one(&aoc::template::read_file("examples", 7)),
|
||||||
|
Some(3749)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_part_two() {
|
||||||
|
assert_eq!(
|
||||||
|
part_two(&aoc::template::read_file("examples", 7)),
|
||||||
|
Some(11387)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue