use itertools::Itertools; use std::error::Error; use std::fs::File; use std::io::{self, BufRead}; use std::vec::Vec; const WIN_LEN: usize = 25; fn main() -> Result<(), Box> { let file = File::open("inputs/day9.txt")?; let lines = io::BufReader::new(file).lines().map(|l| l.unwrap()); let numbers: Vec = lines.map(|l| l.parse().unwrap()).collect(); let mut target = 0; for win in numbers.windows(WIN_LEN + 1) { target = win[WIN_LEN]; let canidates = &win[0..WIN_LEN]; let mut valid = false; for pair in canidates.iter().combinations(2) { //println!("{} + {} = {}", pair[0], pair[1], pair[0] + pair[1]); if pair[0] + pair[1] == target { valid = true; break; } } if !valid { break; } } println!("Invalid Number: {}", target); let invalid_pos = numbers.iter().position(|n| *n == target).unwrap(); println!("Target is at: {}", invalid_pos); 'sum_outer: for len in 2..invalid_pos { for win in numbers.windows(len) { let sum = win.iter().fold(0, |x, acc| x + acc); if sum == target { println!("Set: {:?}", win); let min = win .iter() .fold(*win.first().unwrap(), |x, acc| u64::min(x, *acc)); let max = win .iter() .fold(*win.first().unwrap(), |x, acc| u64::max(x, *acc)); println!("Answer: {}", min + max); break 'sum_outer; } } } Ok(()) }