61 lines
1.6 KiB
Rust
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(())
|
|
}
|