Merge branch 'master' of http://git.z.xinu.tv/ggriffiniii/aoc into master

This commit is contained in:
Bill Thiede 2020-12-15 17:28:04 -08:00
commit 397b7950c6
3 changed files with 63 additions and 0 deletions

1
input/2020/day15.txt Normal file
View File

@ -0,0 +1 @@
1,12,0,20,8,16

61
src/day15.rs Normal file
View File

@ -0,0 +1,61 @@
use aoc_runner_derive::aoc;
use std::collections::{hash_map::Entry, HashMap};
fn spoken_word_n(mut spoken: HashMap<usize, usize>, 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<usize, usize> = 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<usize, usize> = 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);
}
}

View File

@ -4,6 +4,7 @@ pub mod day11;
pub mod day12; pub mod day12;
pub mod day13; pub mod day13;
pub mod day14; pub mod day14;
pub mod day15;
pub mod day2; pub mod day2;
pub mod day3; pub mod day3;
pub mod day4; pub mod day4;