day9 solution
parent
c43f19f2e3
commit
5b2760e9f7
|
@ -0,0 +1,75 @@
|
|||
use aoc_runner_derive::{aoc, aoc_generator};
|
||||
|
||||
type Seq = Vec<i64>;
|
||||
|
||||
fn all_zero(s: &Seq) -> bool {
|
||||
s.iter().find(|t| **t != 0).is_none()
|
||||
}
|
||||
|
||||
#[aoc_generator(day9)]
|
||||
fn parse(input: &str) -> Vec<Seq> {
|
||||
input
|
||||
.lines()
|
||||
.filter_map(|line| {
|
||||
if !line.is_empty() {
|
||||
let nums = line.split(" ").map(|n| n.parse::<i64>().unwrap()).collect();
|
||||
Some(nums)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn get_diffs(s: &Seq) -> Seq {
|
||||
let mut result: Seq = vec![];
|
||||
for index in 0..(s.len() - 1) {
|
||||
result.push(s[index + 1] - s[index]);
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
fn next_number(s: &Seq) -> i64 {
|
||||
if all_zero(s) {
|
||||
0
|
||||
} else {
|
||||
let d = get_diffs(s);
|
||||
s.last().unwrap() + next_number(&d)
|
||||
}
|
||||
}
|
||||
|
||||
#[aoc(day9, part1)]
|
||||
fn part1(input: &[Seq]) -> i64 {
|
||||
input.iter().map(|s| next_number(&s)).sum()
|
||||
}
|
||||
|
||||
fn previous_number(s: &Seq) -> i64 {
|
||||
if all_zero(s) {
|
||||
0
|
||||
} else {
|
||||
let d = get_diffs(s);
|
||||
s[0] - previous_number(&d)
|
||||
}
|
||||
}
|
||||
|
||||
#[aoc(day9, part2)]
|
||||
fn part2(input: &[Seq]) -> i64 {
|
||||
input.iter().map(|s| previous_number(&s)).sum()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
const SAMPLE_DATA: &'static str = r#"0 3 6 9 12 15
|
||||
1 3 6 10 15 21
|
||||
10 13 16 21 30 45
|
||||
"#;
|
||||
|
||||
#[test]
|
||||
fn sample_data() {
|
||||
let input = parse(&SAMPLE_DATA);
|
||||
assert_eq!(part1(&input), 114);
|
||||
assert_eq!(part2(&input), 2);
|
||||
}
|
||||
}
|
|
@ -8,5 +8,6 @@ mod day05;
|
|||
mod day06;
|
||||
mod day07;
|
||||
mod day08;
|
||||
mod day09;
|
||||
|
||||
aoc_lib! { year = 2023 }
|
||||
|
|
Loading…
Reference in New Issue