11use crate :: solutions:: Solution ;
22use itertools:: Itertools ;
3+ use std:: collections:: HashMap ;
34use std:: num:: ParseIntError ;
45use std:: str:: FromStr ;
56
@@ -17,18 +18,47 @@ impl Solution for Day14 {
1718 . to_string ( )
1819 }
1920
20- fn part_two ( & self , _input : & str ) -> String {
21- String :: from ( "0" )
21+ fn part_two ( & self , input : & str ) -> String {
22+ let reindeers = self . parse ( input) ;
23+ let points = self . points ( & reindeers, TIME ) ;
24+
25+ points
26+ . iter ( )
27+ . max_by_key ( |( _, distance) | * distance)
28+ . unwrap ( )
29+ . 1
30+ . to_string ( )
2231 }
2332}
2433
2534impl Day14 {
2635 fn parse ( & self , input : & str ) -> Vec < Reindeer > {
2736 input. lines ( ) . map ( |line| line. parse ( ) . unwrap ( ) ) . collect ( )
2837 }
38+
39+ fn points < ' a > ( & self , reindeers : & ' a [ Reindeer ] , time : u64 ) -> HashMap < & ' a Reindeer , u64 > {
40+ let mut points: HashMap < & Reindeer , u64 > = HashMap :: new ( ) ;
41+
42+ for reindeer in reindeers {
43+ points. insert ( reindeer, 0 ) ;
44+ }
45+
46+ for second in 1 ..=time {
47+ let leading = reindeers
48+ . iter ( )
49+ . map ( |reindeer| ( reindeer, reindeer. distance ( second) ) )
50+ . max_set_by_key ( |( _, distance) | * distance) ;
51+
52+ for ( lead_reindeer, _) in leading {
53+ * points. entry ( lead_reindeer) . or_default ( ) += 1 ;
54+ }
55+ }
56+
57+ points
58+ }
2959}
3060
31- #[ derive( Debug ) ]
61+ #[ derive( Debug , Eq , Hash , PartialEq , Copy , Clone ) ]
3262struct Reindeer {
3363 fly_speed : u64 ,
3464 fly_time : u64 ,
@@ -96,4 +126,33 @@ mod tests {
96126 assert_eq ! ( comet. distance( THOUSAND_SECONDS ) , 1120 ) ;
97127 assert_eq ! ( dancer. distance( THOUSAND_SECONDS ) , 1056 ) ;
98128 }
129+
130+ #[ test]
131+ fn points ( ) {
132+ let comet = Reindeer {
133+ fly_speed : 14 ,
134+ fly_time : 10 ,
135+ rest_time : 127 ,
136+ } ;
137+
138+ let dancer = Reindeer {
139+ fly_speed : 16 ,
140+ fly_time : 11 ,
141+ rest_time : 162 ,
142+ } ;
143+
144+ let reindeers = & [ comet, dancer] ;
145+
146+ const ONE_SECOND : u64 = 1 ;
147+
148+ let points = Day14 . points ( reindeers, ONE_SECOND ) ;
149+ assert_eq ! ( * points. get( & dancer) . unwrap( ) , 1 ) ;
150+ assert_eq ! ( * points. get( & comet) . unwrap( ) , 0 ) ;
151+
152+ const THOUSANDS_SECOND : u64 = 1000 ;
153+
154+ let points = Day14 . points ( reindeers, THOUSANDS_SECOND ) ;
155+ assert_eq ! ( * points. get( & dancer) . unwrap( ) , 689 ) ;
156+ assert_eq ! ( * points. get( & comet) . unwrap( ) , 312 ) ;
157+ }
99158}
0 commit comments