summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/2020/9/mod.rs62
-rw-r--r--src/2020/mod.rs4
2 files changed, 66 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
+}
diff --git a/src/2020/mod.rs b/src/2020/mod.rs
index b8f6a20..77a5c38 100644
--- a/src/2020/mod.rs
+++ b/src/2020/mod.rs
@@ -14,6 +14,8 @@ mod day6;
mod day7;
#[path = "8/mod.rs"]
mod day8;
+#[path = "9/mod.rs"]
+mod day9;
pub fn run(day: u8, puzzle: u8) -> anyhow::Result<i64> {
match (day, puzzle) {
@@ -33,6 +35,8 @@ pub fn run(day: u8, puzzle: u8) -> anyhow::Result<i64> {
(7, 2) => day7::part2(),
(8, 1) => day8::part1(),
(8, 2) => day8::part2(),
+ (9, 1) => day9::part1(),
+ (9, 2) => day9::part2(),
_ => Err(anyhow::anyhow!("unknown puzzle {}-{}", day, puzzle)),
}
}