From efe3a9856e6ed10338e558c70ab0d39fa8da2968 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 9 Dec 2020 01:37:42 -0500 Subject: day 9 --- src/2020/9/mod.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/2020/9/mod.rs (limited to 'src/2020/9/mod.rs') diff --git a/src/2020/9/mod.rs b/src/2020/9/mod.rs new file mode 100644 index 0000000..ac7e14c --- /dev/null +++ b/src/2020/9/mod.rs @@ -0,0 +1,62 @@ +pub fn part1() -> anyhow::Result { + const WINDOW: usize = 25; + + let list = crate::util::read_ints("data/9.txt")?; + for i in 0..(list.len() - WINDOW) { + let set = &list[i..i + WINDOW]; + let n = list[i + WINDOW]; + if !valid(set, n) { + return Ok(n); + } + } + + Err(anyhow::anyhow!("failed to find invalid number")) +} + +pub fn part2() -> anyhow::Result { + const WINDOW: usize = 25; + + let list = crate::util::read_ints("data/9.txt")?; + let mut invalid = None; + for i in 0..(list.len() - WINDOW) { + let set = &list[i..i + WINDOW]; + let n = list[i + WINDOW]; + if !valid(set, n) { + invalid = Some(n); + } + } + if invalid.is_none() { + return Err(anyhow::anyhow!("failed to find invalid number")); + } + let invalid = invalid.unwrap(); + + for i in 0..list.len() { + for j in i..list.len() { + let seq = &list[i..=j]; + if invalid == seq.iter().sum() { + return Ok(seq.iter().copied().min().unwrap() + + seq.iter().copied().max().unwrap()); + } + } + } + + Err(anyhow::anyhow!( + "failed to find sequence summing to invalid number" + )) +} + +fn valid(set: &[i64], n: i64) -> bool { + for i in 0..set.len() { + for j in 0..set.len() { + if i == j { + continue; + } + let i = set[i]; + let j = set[j]; + if i + j == n { + return true; + } + } + } + false +} -- cgit v1.2.3-54-g00ecf