56 lines
1.4 KiB
Rust
56 lines
1.4 KiB
Rust
use std::fs::File;
|
|
use std::io::{self, prelude::*, BufReader};
|
|
use std::collections::HashMap;
|
|
use regex::Regex;
|
|
|
|
|
|
fn find_numbers(line: &str) -> Vec<i64> {
|
|
let re = Regex::new(r"-?\d+").unwrap();
|
|
let matches: Vec<_> = re.find_iter(line).map(|m| m.as_str().parse::<i64>().unwrap()).collect();
|
|
return matches;
|
|
}
|
|
|
|
fn predict_next_num(numbers: Vec<i64>) -> i64 {
|
|
let mut answer = 0;
|
|
let mut differences: Vec<Vec<i64>> = vec![];
|
|
let mut looping = true;
|
|
let mut index = 0;
|
|
differences.push(numbers);
|
|
while looping {
|
|
differences.push(vec![]);
|
|
let mut sum = 0;
|
|
for i in 1..differences[index].len(){
|
|
let diff = differences[index][i]-differences[index][i-1];
|
|
differences[index+1].push(diff);
|
|
sum += diff.abs();
|
|
}
|
|
println!("{:?}", differences[index]);
|
|
looping = sum != 0;
|
|
index += 1;
|
|
}
|
|
for vector in (0..differences.len()).rev(){
|
|
answer = differences[vector][0] - answer;
|
|
}
|
|
println!("answer {} \n", answer);
|
|
|
|
return answer;
|
|
}
|
|
|
|
|
|
fn process_line(line: String) -> i64 {
|
|
let numbers = find_numbers(&line);
|
|
return predict_next_num(numbers);
|
|
}
|
|
|
|
fn main() -> io::Result<()> {
|
|
let mut sum = 0;
|
|
let file = File::open("../input.txt")?;
|
|
let reader = BufReader::new(file);
|
|
for line in reader.lines() {
|
|
sum += process_line(line?);
|
|
}
|
|
println!("{}", sum);
|
|
|
|
Ok(())
|
|
}
|