@@ -6,6 +6,8 @@ use std::str::FromStr;
66
77const TIME : u64 = 2503 ;
88
9+ type PointsMap < ' a > = HashMap < & ' a Reindeer , u64 > ;
10+
911pub struct Day14 ;
1012
1113impl Solution for Day14 {
@@ -20,9 +22,8 @@ impl Solution for Day14 {
2022
2123 fn part_two ( & self , input : & str ) -> String {
2224 let reindeers = self . parse ( input) ;
23- let points = self . points ( & reindeers, TIME ) ;
2425
25- points
26+ self . points ( & reindeers , TIME )
2627 . iter ( )
2728 . max_by_key ( |( _, distance) | * distance)
2829 . unwrap ( )
@@ -36,8 +37,8 @@ impl Day14 {
3637 input. lines ( ) . map ( |line| line. parse ( ) . unwrap ( ) ) . collect ( )
3738 }
3839
39- fn points < ' a > ( & self , reindeers : & ' a [ Reindeer ] , time : u64 ) -> HashMap < & ' a Reindeer , u64 > {
40- let mut points: HashMap < & Reindeer , u64 > = HashMap :: new ( ) ;
40+ fn points < ' a > ( & self , reindeers : & ' a [ Reindeer ] , time : u64 ) -> PointsMap < ' a > {
41+ let mut points: PointsMap = HashMap :: new ( ) ;
4142
4243 for reindeer in reindeers {
4344 points. insert ( reindeer, 0 ) ;
@@ -67,14 +68,13 @@ struct Reindeer {
6768
6869impl Reindeer {
6970 fn distance ( & self , time : u64 ) -> u64 {
70- let segment_time = self . fly_time + self . rest_time ;
71- let full_segments_in_time = time / segment_time;
72- let base_distance = self . fly_speed * self . fly_time * full_segments_in_time;
73- let missing_time = time - full_segments_in_time * segment_time;
71+ let cycle_time = self . fly_time + self . rest_time ;
72+ let full_cycles = time / cycle_time;
7473
75- let run_time = missing_time. min ( self . fly_time ) ;
74+ let remaining = time % cycle_time;
75+ let fly_time = full_cycles * self . fly_time + remaining. min ( self . fly_time ) ;
7676
77- base_distance + self . fly_speed * run_time
77+ self . fly_speed * fly_time
7878 }
7979}
8080
0 commit comments