AoC2020/src/bin/day9.rs

61 lines
1.6 KiB
Rust

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<dyn Error>> {
let file = File::open("inputs/day9.txt")?;
let lines = io::BufReader::new(file).lines().map(|l| l.unwrap());
let numbers: Vec<u64> = 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(())
}