day 9 solutions

Signed-off-by: Stephen Waits <swaits@amazon.com>
This commit is contained in:
Stephen Waits committed 2020-12-10 10:17:14 -08:00
1 parent c617dfb8e8
commit 214383a0f3
4 files changed
+1055

No files matched your search

+51
View File
@@ -0,0 +1,51 @@
// ==== day 9
use crate::utils;
use anyhow::{anyhow, Result};
fn is_bad(data: &Vec<i64>, n: usize, i: usize) -> Result<i64> {
let prev_n = &data[i - n..i];
let found =
utils::combinations(2, prev_n.len()).any(|c| data[i] == prev_n[c[0]] + prev_n[c[1]]);
if !found {
return Ok(data[i]);
} else {
Err(anyhow!("no result found"))
}
}
fn find_first_bad(data: &Vec<i64>, n: usize, start: usize) -> Result<i64> {
for i in start..data.len() {
let ret = is_bad(data, n, i);
if ret.is_ok() {
return ret;
}
}
Err(anyhow!("no result found"))
}
fn find_contiguous_set(data: &Vec<i64>, x: i64) -> Result<i64> {
for set_size in 2..data.len() - 1 {
for i in 0..data.len() - set_size {
if data[i..i + set_size].iter().sum::<i64>() == x {
// TODO: this can be optimized by using a rolling window, but for now this is fast enough
let min = data[i..i + set_size].iter().min().unwrap();
let max = data[i..i + set_size].iter().max().unwrap();
return Ok(min + max);
}
}
}
Err(anyhow!("no result found"))
}
pub fn run() -> Result<(i64, i64)> {
let data = utils::read_i64s("data/input-09.txt")?;
let answers = utils::read_i64s("data/output-09.txt")?;
let p1 = find_first_bad(&data, 25, 25)?;
let p2 = find_contiguous_set(&data, 756008079)?;
assert_eq!(p1, answers[0]);
assert_eq!(p2, answers[1]);
Ok((p1, p2))
}
+2
View File
@@ -8,6 +8,7 @@ mod day05;
mod day06;
mod day07;
mod day08;
mod day09;
mod utils;
// TODO
@@ -29,5 +30,6 @@ fn main() -> Result<()> {
println!("Day 06: {:?}", day06::run()?);
println!("Day 07: {:?}", day07::run()?);
println!("Day 08: {:?}", day08::run()?);
println!("Day 09: {:?}", day09::run()?);
Ok(())
}