diff options
Diffstat (limited to 'src/2020')
-rw-r--r-- | src/2020/9/mod.rs | 62 | ||||
-rw-r--r-- | src/2020/mod.rs | 4 |
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)), } } |