Up to Day 21 (excluding day 16)
This commit is contained in:
48
src/bin/day09.rs
Normal file
48
src/bin/day09.rs
Normal file
@@ -0,0 +1,48 @@
|
||||
use anyhow::{Context, Result};
|
||||
|
||||
fn extrapolate(sequence: &mut Vec<i64>) -> Option<(i64, i64)> {
|
||||
let diff = |seq: &mut Vec<i64>| {
|
||||
(0..seq.len() - 1).for_each(|i| seq[i] = seq[i + 1] - seq[i]);
|
||||
seq.pop();
|
||||
};
|
||||
|
||||
let mut fwd = 0;
|
||||
let mut bwd = 0;
|
||||
let mut f = 1;
|
||||
|
||||
while sequence.len() > 1 {
|
||||
fwd += sequence[sequence.len() - 1];
|
||||
bwd += f * sequence[0];
|
||||
diff(sequence);
|
||||
f *= -1;
|
||||
|
||||
if sequence.iter().all(|&num| num == 0) {
|
||||
return Some((bwd, fwd));
|
||||
}
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let filename = std::env::args()
|
||||
.nth(1)
|
||||
.context("./day09 <path to puzzle input>")?;
|
||||
let input = std::fs::read_to_string(filename)?;
|
||||
|
||||
let mut part1 = 0;
|
||||
let mut part2 = 0;
|
||||
|
||||
for line in input.lines() {
|
||||
let parse_i64 = |str: &str| str.parse::<i64>().unwrap();
|
||||
let mut initial: Vec<i64> = line.split_ascii_whitespace().map(parse_i64).collect();
|
||||
let (p2, p1) = extrapolate(&mut initial).context("malformed input")?;
|
||||
part1 += p1;
|
||||
part2 += p2;
|
||||
}
|
||||
|
||||
println!("1) {}", part1);
|
||||
println!("2) {}", part2);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user