2020-12-09 15:57:29 +00:00
|
|
|
use aoc_runner_derive::{aoc, aoc_generator};
|
|
|
|
|
|
|
|
#[aoc_generator(day9)]
|
2020-12-11 00:33:19 +00:00
|
|
|
#[inline(always)]
|
2020-12-09 15:57:29 +00:00
|
|
|
pub fn input_generator(input: &str) -> Vec<usize> {
|
|
|
|
input
|
|
|
|
.lines()
|
|
|
|
.map(|l| l.trim().parse())
|
|
|
|
.collect::<Result<Vec<usize>, _>>()
|
|
|
|
.unwrap()
|
|
|
|
}
|
|
|
|
|
|
|
|
#[aoc(day9, part1)]
|
2020-12-11 00:33:19 +00:00
|
|
|
#[inline(always)]
|
2020-12-09 15:57:29 +00:00
|
|
|
pub fn solve_part1(input: &Vec<usize>) -> usize {
|
|
|
|
for (n, win) in input.as_slice().windows(25).enumerate() {
|
|
|
|
let n = n + 25;
|
|
|
|
if n >= input.len() {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
let c = input[n];
|
|
|
|
let mut valid = false;
|
|
|
|
for (i1, n1) in win.iter().enumerate() {
|
|
|
|
for (i2, n2) in win.iter().enumerate() {
|
|
|
|
if i1 == i2 {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if n1 + n2 == c {
|
|
|
|
valid = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if !valid {
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic!("No match found!");
|
|
|
|
}
|
|
|
|
|
2020-12-11 00:33:19 +00:00
|
|
|
#[aoc(day9, part2, bruteforce)]
|
|
|
|
#[inline(always)]
|
2020-12-09 15:57:29 +00:00
|
|
|
pub fn solve_part2(input: &Vec<usize>) -> usize {
|
|
|
|
let inv_num = solve_part1(input);
|
|
|
|
for start in 0..input.len() {
|
|
|
|
for length in 2..(input.len() - start) {
|
|
|
|
let s: Vec<usize> = input.iter().skip(start).take(length).cloned().collect();
|
|
|
|
if s.iter().sum::<usize>() == inv_num {
|
|
|
|
return s.iter().max().unwrap() + s.iter().min().unwrap();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic!("No match found!");
|
|
|
|
}
|
2020-12-09 18:15:11 +00:00
|
|
|
|
2020-12-11 00:33:19 +00:00
|
|
|
#[aoc(day9, part2, faster)]
|
|
|
|
#[inline(always)]
|
2020-12-09 18:15:11 +00:00
|
|
|
pub fn solve_part2_fast(input: &Vec<usize>) -> usize {
|
|
|
|
let target_num = solve_part1(input);
|
|
|
|
for i in 2..=input.len() {
|
2020-12-11 00:33:19 +00:00
|
|
|
if let Some(w) = input.windows(i).find(|w| target_num == w.iter().sum()) {
|
|
|
|
return w.iter().max().unwrap() + w.iter().min().unwrap();
|
2020-12-09 18:15:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
panic!("No match found!");
|
|
|
|
}
|