diff --git a/src/day14.rs b/src/day14.rs index e5f3df9..0f887d7 100644 --- a/src/day14.rs +++ b/src/day14.rs @@ -29,7 +29,38 @@ fn part1(input: &Vec<(usize, usize, usize)>) -> usize { .unwrap() } -// #[aoc(day14, part2)] -// fn part2(input: &str) -> String { -// todo!() -// } +#[aoc(day14, part2)] +fn part2(input: &Vec<(usize, usize, usize)>) -> usize { + play(input, 2503) +} + +fn play(input: &Vec<(usize, usize, usize)>, rounds: usize) -> usize { + let mut state = vec![(0usize, 0usize); input.len()]; + for time in 1..=rounds { + for i in 0..input.len() { + let (speed, fly, rest) = input[i]; + let rem = (time - 1) % (fly + rest); + let flying = rem < fly; + if flying { + state[i].0 += speed; + } + } + + let max_distance = state.iter().map(|it| it.0).max().unwrap(); + state.iter_mut().for_each(|it| if it.0 == max_distance { + it.1 += 1; + }); + } + state.into_iter().map(|it| it.1).max().unwrap() +} + +#[cfg(test)] +mod test { + use crate::day14::{parse, play}; + + #[test] + fn example2() { + assert_eq!(689, play(&parse("Comet can fly 14 km/s for 10 seconds, but then must rest for 127 seconds. +Dancer can fly 16 km/s for 11 seconds, but then must rest for 162 seconds."), 1000)) + } +}