adventofcode2023/day9/src/main.rs

39 lines
1.3 KiB
Rust
Raw Normal View History

2023-12-09 08:40:32 -06:00
use std::fs::read_to_string;
fn get_numbers_in_line_iter<T: std::str::FromStr>(str: &str) -> impl Iterator<Item=T> + '_ {
str.split_whitespace().filter_map(|substr| substr.parse::<T>().ok())
}
fn main() {
let mut sum1 = 0;
let mut sum2 = 0;
let mut working_vec: Vec<i32> = Vec::new();
for line in read_to_string("input.txt").unwrap().lines() {
working_vec.extend(get_numbers_in_line_iter::<i32>(line));
let original_length = working_vec.len();
let mut sequence_length = working_vec.len() - 1;
while sequence_length > 0 {
let mut all_zeros = true;
working_vec.push(working_vec[0]);
for i in 0..sequence_length {
working_vec[i] = working_vec[i + 1] - working_vec[i];
if working_vec[i] != 0 {
all_zeros = false;
}
}
if all_zeros {
break;
}
sequence_length -= 1;
}
let extrapolated1 = working_vec[sequence_length..original_length].iter().sum::<i32>();
let extrapolated2 = working_vec[original_length..].iter().rev().fold(
0, |acc, x| x - acc);
sum1 += extrapolated1;
sum2 += extrapolated2;
working_vec.clear();
}
println!("Sum1: {}", sum1);
println!("Sum2: {}", sum2);
}