summaryrefslogtreecommitdiffstats
path: root/src/2020/9/mod.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-12-09 01:37:42 -0500
committerJesse Luehrs <doy@tozt.net>2020-12-09 01:37:42 -0500
commitefe3a9856e6ed10338e558c70ab0d39fa8da2968 (patch)
treedb10db9c8b93c9155b49d3d5754c46a19817e5a3 /src/2020/9/mod.rs
parent57ab4ffec7aa770207306564ffcc50f5145160e1 (diff)
downloadadvent-of-code-efe3a9856e6ed10338e558c70ab0d39fa8da2968.tar.gz
advent-of-code-efe3a9856e6ed10338e558c70ab0d39fa8da2968.zip
day 9
Diffstat (limited to 'src/2020/9/mod.rs')
-rw-r--r--src/2020/9/mod.rs62
1 files changed, 62 insertions, 0 deletions
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<i64> {
+ 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<i64> {
+ 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
+}