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));
|
2023-12-10 09:43:12 -06:00
|
|
|
let mut extrapolated1 = 0;
|
|
|
|
let mut extrapolated2 = 0;
|
2023-12-09 08:40:32 -06:00
|
|
|
let mut sequence_length = working_vec.len() - 1;
|
|
|
|
while sequence_length > 0 {
|
|
|
|
let mut all_zeros = true;
|
2023-12-10 09:43:12 -06:00
|
|
|
// accumulate last element for task 1
|
|
|
|
extrapolated1 += working_vec[sequence_length];
|
|
|
|
// accumulate first element with subtraction for task 2
|
|
|
|
extrapolated2 = working_vec[0] - extrapolated2;
|
2023-12-09 08:40:32 -06:00
|
|
|
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;
|
|
|
|
}
|
2023-12-10 09:43:12 -06:00
|
|
|
// flip sign if there was an even amount of elements to account for processing it in reverse
|
|
|
|
if (working_vec.len() - sequence_length) % 2 == 0 {
|
|
|
|
extrapolated2 = -extrapolated2;
|
|
|
|
}
|
2023-12-09 08:40:32 -06:00
|
|
|
sum1 += extrapolated1;
|
|
|
|
sum2 += extrapolated2;
|
|
|
|
working_vec.clear();
|
|
|
|
}
|
|
|
|
println!("Sum1: {}", sum1);
|
|
|
|
println!("Sum2: {}", sum2);
|
|
|
|
}
|