diff --git a/src/day15.rs b/src/day15.rs new file mode 100644 index 0000000..1262d3f --- /dev/null +++ b/src/day15.rs @@ -0,0 +1,60 @@ +use std::collections::HashMap; + +use aoc_runner_derive::{aoc, aoc_generator}; +use itertools::Itertools; + + +#[aoc_generator(day15)] +fn parse(input: &str) -> Vec { + input.split(',').map(str::parse::).map(Result::unwrap).collect_vec() +} + +#[aoc(day15, part1)] +fn part1(input: &Vec) -> u64 { + let mut list = input.iter().take(input.len() - 1).cloned().enumerate().map(|(i,v)| (v,i)).collect::>(); + let mut cur = *input.last().unwrap(); + + for turn in input.len() - 1..2020 - 1 { + let mut next = 0; + if let Some(last_turn) = list.get_mut(&cur) { + next = (turn - *last_turn) as u64; + } + list.insert(cur, turn); + cur = next; + } + cur +} + +#[aoc(day15, part2)] +fn part2(input: &Vec) -> u64 { + let mut list = input.iter().take(input.len() - 1).cloned().enumerate().map(|(i,v)| (v,i)).collect::>(); + let mut cur = *input.last().unwrap(); + + for turn in input.len() - 1..30000000 - 1 { + let mut next = 0; + if let Some(last_turn) = list.get_mut(&cur) { + next = (turn - *last_turn) as u64; + } + list.insert(cur, turn); + cur = next; + } + cur +} + + +#[cfg(test)] +mod tests { + use super::*; + + const EX: &str = r"0,3,6"; + + #[test] + fn part1_example() { + assert_eq!(part1(&parse(EX)), 436); + } + + #[test] + fn part2_example() { + assert_eq!(part2(&parse(EX)), 175594); + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 695ff83..7ac4585 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +mod day15; mod day14; mod day13; mod day12;