39 lines
1.3 KiB
Rust
39 lines
1.3 KiB
Rust
|
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);
|
||
|
}
|