use std::fs::File; use std::io::{self, prelude::*, BufReader}; use std::collections::HashMap; use regex::Regex; fn find_numbers(line: &str) -> Vec { let re = Regex::new(r"-?\d+").unwrap(); let matches: Vec<_> = re.find_iter(line).map(|m| m.as_str().parse::().unwrap()).collect(); return matches; } fn predict_next_num(numbers: Vec) -> i64 { let mut answer = 0; let mut differences: Vec> = 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(()) }