package Ġme . pe ck b . a oc ._ 2 0 1 5 . calendar . day 1 4 Ċ Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . await All Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġjavax . inject . Inject Ċ Ċ import Ġme . pe ck b . a oc . generators . Input Generator . Input Generator Factory Ċ Ċ class ĠDay 1 4 Ġ@ Inject Ġconstructor ( private Ġval Ġgenerator Factory : ĠInput Generator Factory ) Ġ{ ĊĠ Ġfun Ġpart One ( filename : ĠString ) Ġ= Ġgenerator Factory . for File ( filename ). read As (:: re inde er ) Ġ{ Ġinput Ġ-> ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġval Ġdistances : ĠList < Pair < Re inde er , ĠLong >> Ġ= Ġinput . map Ġ{ Ġre inde er Ġ-> ĊĠĠĠĠĠĠĠ Ġasync ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġre inde er Ġto Ġre inde er . at ( R ACE _ TIME _ SECONDS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. toList (). await All () ĊĊĠĠĠĠĠ Ġdistances . max By OrNull Ġ{ Ġit . second Ġ} ?. second ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġpart Two ( filename : ĠString ) Ġ= Ġgenerator Factory . for File ( filename ). read As (:: re inde er ) Ġ{ Ġinput Ġ-> ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġval Ġtimes At Every Second Ġ= Ġinput . map Ġ{ Ġre inde er Ġ-> ĊĠĠĠĠĠĠĠ Ġasync ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ( 1 .. R ACE _ TIME _ SECONDS ). map Ġ{ Ġtime Seconds Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre inde er Ġto Ġre inde er . at ( time Seconds ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. toList (). await All () ĊĊĠĠĠĠĠ Ġval Ġpoints Ġ= Ġmutable Map Of < String , ĠInt >() ĊĠĠĠĠĠ Ġrepeat ( R ACE _ TIME _ SECONDS ) Ġ{ Ġtime Seconds Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġf ur the st Re inde er At Time Ġ= Ġtimes At Every Second . max By OrNull Ġ{ Ġre inde er Times Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġre inde er Times [ time Seconds ]. second ĊĠĠĠĠĠĠĠ Ġ} ?. first () ĊĠĠĠĠĠĠĠ Ġf ur the st Re inde er At Time ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġpoints . merge ( it . first . name , Ġ 1 ) Ġ{ Ġtotal Points , Ġone Ġ-> Ġtotal Points Ġ+ Ġone } ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġpoints . max By OrNull Ġ{ Ġit . value Ġ} ?. value ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġre inde er ( line : ĠString ): ĠRe inde er Ġ{ ĊĠĠĠ Ġ// ĠCome t Ġcan Ġfly Ġ 1 4 Ġkm / s Ġfor Ġ 1 0 Ġseconds , Ġbut Ġthen Ġmust Ġrest Ġfor Ġ 1 2 7 Ġseconds . ĊĠĠĠ Ġval Ġ( non Rest Info , Ġrest Info ) Ġ= Ġline . split (" Ġseconds , Ġbut Ġthen Ġmust Ġrest Ġfor Ġ") ĊĠĠĠ Ġval Ġrest Time Seconds Ġ= Ġrest Info . substring Before (" Ġseconds .") ĊĠĠĠ Ġval Ġ( name And Speed , Ġfly Time Seconds ) Ġ= Ġnon Rest Info . split (" Ġkm / s Ġfor Ġ") ĊĠĠĠ Ġval Ġ( name , Ġspeed Km S ) Ġ= Ġname And Speed . split (" Ġ"). let Ġ{ ĊĠĠĠĠĠ Ġit . first () Ġto Ġit . last () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠRe inde er ( name , Ġspeed Km S . toInt (), Ġfly Time Seconds . toInt (), Ġrest Time Seconds . toInt ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġdata Ġclass ĠRe inde er ( val Ġname : ĠString , Ġprivate Ġval Ġspeed Km S : ĠInt , Ġprivate Ġval Ġfly Time Seconds : ĠInt , Ġprivate Ġval Ġrest Time Seconds : ĠInt ) Ġ{ ĊĠĠĠ Ġfun Ġat ( race Time Seconds : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠ Ġvar Ġtime Left Ġ= Ġrace Time Seconds ĊĠĠĠĠĠ Ġvar Ġrest ed Ġ= Ġtrue ĊĠĠĠĠĠ Ġvar Ġdistance Ġ= Ġ 0 L ĊĠĠĠĠĠ Ġwhile Ġ( time Left Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rest ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġtime S pend F lying Ġ= Ġif Ġ( time Left Ġ>= Ġfly Time Seconds ) Ġfly Time Seconds Ġelse Ġtime Left ĊĠĠĠĠĠĠĠĠĠ Ġtime Left Ġ-= Ġtime S pend F lying ĊĠĠĠĠĠĠĠĠĠ Ġdistance Ġ+= Ġtime S pend F lying Ġ* Ġspeed Km S ĊĠĠĠĠĠĠĠĠĠ Ġrest ed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġtime S pend Rest ing Ġ= Ġif Ġ( time Left Ġ>= Ġrest Time Seconds ) Ġrest Time Seconds Ġelse Ġtime Left ĊĠĠĠĠĠĠĠĠĠ Ġtime Left Ġ-= Ġtime S pend Rest ing ĊĠĠĠĠĠĠĠĠĠ Ġrest ed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġdistance ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠR ACE _ TIME _ SECONDS Ġ= Ġ 2 5 0 3 ĊĠ Ġ} Ċ } Ċ