advent_of_code/2023/day9/rust/src/part_two.rs

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(())
}