diff --git a/input/2020/day15.txt b/input/2020/day15.txt new file mode 100644 index 0000000..c5d4ead --- /dev/null +++ b/input/2020/day15.txt @@ -0,0 +1 @@ +1,12,0,20,8,16 diff --git a/src/day15.rs b/src/day15.rs new file mode 100644 index 0000000..ae65fd8 --- /dev/null +++ b/src/day15.rs @@ -0,0 +1,61 @@ +use aoc_runner_derive::aoc; + +use std::collections::{hash_map::Entry, HashMap}; + +fn spoken_word_n(mut spoken: HashMap, mut last_spoken: usize, n: usize) -> usize { + for turn in spoken.len() + 1..=n { + //dbg!(turn, last_spoken); + last_spoken = match spoken.entry(last_spoken) { + Entry::Occupied(mut occupied) => { + let difference = turn - 1 - *occupied.get(); + occupied.insert(turn - 1); + difference + } + Entry::Vacant(vacant) => { + vacant.insert(turn - 1); + 0 + } + } + } + last_spoken +} + +#[aoc(day15, part1)] +fn solve_d15_p1(input: &str) -> usize { + let mut last_spoken = None; + let spoken: HashMap = input + .split(',') + .enumerate() + .map(|(idx, spoken)| { + let spoken = spoken.parse().unwrap(); + last_spoken = Some(spoken); + (spoken, idx + 1) + }) + .collect(); + spoken_word_n(spoken, last_spoken.unwrap(), 2020) +} + +#[aoc(day15, part2)] +fn solve_d15_p2(input: &str) -> usize { + let mut last_spoken = None; + let spoken: HashMap = input + .split(',') + .enumerate() + .map(|(idx, spoken)| { + let spoken = spoken.parse().unwrap(); + last_spoken = Some(spoken); + (spoken, idx + 1) + }) + .collect(); + spoken_word_n(spoken, last_spoken.unwrap(), 30_000_000) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_part1() { + assert_eq!(solve_d15_p1("1,3,2"), 1); + } +} diff --git a/src/lib.rs b/src/lib.rs index ff3bf4a..4a87276 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ pub mod day11; pub mod day12; pub mod day13; pub mod day14; +pub mod day15; pub mod day2; pub mod day3; pub mod day4;