From 3ab0f9711d613b156ac7635e94a1202bc7d87a69 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Tue, 15 Dec 2020 09:06:17 +0100 Subject: [PATCH] Implementation day 15 --- 2020/inputs/15.txt | 1 + 2020/src/day15.rs | 53 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 2020/inputs/15.txt diff --git a/2020/inputs/15.txt b/2020/inputs/15.txt new file mode 100644 index 0000000..86739eb --- /dev/null +++ b/2020/inputs/15.txt @@ -0,0 +1 @@ +1,0,18,10,19,6 diff --git a/2020/src/day15.rs b/2020/src/day15.rs index fbbf738..a90e653 100644 --- a/2020/src/day15.rs +++ b/2020/src/day15.rs @@ -1,12 +1,61 @@ use std::io::Read; +use crate::common::numbers_and_stuff; use crate::Solution; +fn nth_number(start: &[usize], n: usize) -> usize { + // Don't want to special case this + assert!(n >= start.len()); + + let mut history = vec![0; n]; + + let mut prev = 0; + + for (i, &n) in start.iter().enumerate() { + history[prev] = i; + prev = n; + } + + for i in start.len()..n { + let last_seen = history[prev]; + history[prev] = i; + + prev = if last_seen == 0 { 0 } else { i - last_seen }; + } + + prev +} + #[derive(Default)] pub struct Day15; impl Solution for Day15 { - fn part1(&mut self, _input: &mut dyn Read) -> String { - todo!() + fn part1(&mut self, input: &mut dyn Read) -> String { + let numbers: Vec = numbers_and_stuff(input); + + nth_number(&numbers, 2020).to_string() + } + + fn part2(&mut self, input: &mut dyn Read) -> String { + let numbers: Vec = numbers_and_stuff(input); + + nth_number(&numbers, 30000000).to_string() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_nth_number() { + assert_eq!(0, nth_number(&[0, 3, 6], 10)); + assert_eq!(436, nth_number(&[0, 3, 6], 2020)); + assert_eq!(1, nth_number(&[1, 3, 2], 2020)); + assert_eq!(10, nth_number(&[2, 1, 3], 2020)); + assert_eq!(27, nth_number(&[1, 2, 3], 2020)); + assert_eq!(78, nth_number(&[2, 3, 1], 2020)); + assert_eq!(438, nth_number(&[3, 2, 1], 2020)); + assert_eq!(1836, nth_number(&[3, 1, 2], 2020)); } }