package Ġme . pe ck b . a oc ._ 2 0 1 7 . calendar . day 0 8 Ċ Ċ import Ġjavax . inject . Inject Ċ Ċ import Ġme . pe ck b . a oc . generators . Input Generator . Input Generator Factory Ċ import Ġkotlin . Long . Companion . MIN _ VALUE Ċ import Ġkotlin . math . max Ċ Ċ class ĠDay 0 8 Ġ@ Inject Ġconstructor ( private Ġval Ġgenerator Factory : ĠInput Generator Factory ) Ġ{ ĊĠ Ġfun Ġpart One ( filename : ĠString ) Ġ= Ġgenerator Factory . for File ( filename ). read As (:: instruction ) Ġ{ Ġinput Ġ-> ĊĠĠĠ Ġval Ġ( registers , Ġ_) Ġ= Ġfollow Instructions ( input ) ĊĊĠĠĠ Ġregisters . max Of Ġ{ Ġit . value Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġpart Two ( filename : ĠString ) Ġ= Ġgenerator Factory . for File ( filename ). read As (:: instruction ) Ġ{ Ġinput Ġ-> ĊĠĠĠ Ġval Ġ(_, ĠmaxValue ) Ġ= Ġfollow Instructions ( input ) ĊĠĠĠ ĠmaxValue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfollow Instructions ( input : ĠSequence < Instruction >): ĠPair < Map < String , ĠLong >, ĠLong > Ġ{ ĊĠĠĠ Ġval Ġregisters Ġ= Ġmutable Map Of < String , ĠLong >(). with Default Ġ{ Ġ 0 L Ġ} ĊĊĠĠĠ Ġvar ĠmaxValue Ġ= ĠMIN _ VALUE ĊĊĠĠĠ Ġinput . forEach Ġ{ Ġinstruction Ġ-> ĊĠĠĠĠĠ Ġval Ġcondition Value Ġ= Ġregisters . getValue ( instruction . register For Condition ) ĊĠĠĠĠĠ Ġif Ġ( instruction . condition Check ( condition Value )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodifying Value Ġ= Ġregisters . getValue ( instruction . register To Modify ) ĊĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġinstruction . modify ing Operation ( modify ing Value ) ĊĠĠĠĠĠĠĠ ĠmaxValue Ġ= Ġmax ( max Value , ĠnewValue ) ĊĠĠĠĠĠĠĠ Ġregisters [ instruction . register To Modify ] Ġ= ĠnewValue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġregisters Ġto ĠmaxValue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġinstruction ( line : ĠString ): ĠInstruction Ġ{ ĊĠĠĠ Ġ// Ġc Ġdec Ġ- 1 0 Ġif Ġa Ġ>= Ġ 1 ĊĠĠĠ Ġval Ġparts Ġ= Ġline . split (" Ġ") ĊĠĠĠ Ġval Ġregister To Modify Ġ= Ġparts [ 0 ] ĊĠĠĠ Ġval Ġgeneric Operation : Ġ( Long , ĠLong ) Ġ-> ĠLong Ġ= Ġwhen ( parts [ 1 ]) Ġ{ ĊĠĠĠĠĠ Ġ" inc " Ġ-> ĠLong :: plus ĊĠĠĠĠĠ Ġ" dec " Ġ-> ĠLong :: minus ĊĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown ĠOperation : Ġ$ line ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmodifying Value Ġ= Ġparts [ 2 ]. to Long () ĊĠĠĠ Ġval Ġmodifying Operation Ġ= Ġ{ Ġvalue : ĠLong Ġ-> Ġgeneric Operation ( value , Ġmodifying Value ) Ġ} ĊĠĠĠ Ġval Ġregister For Condition Ġ= Ġparts [ 4 ] ĊĊĠĠĠ Ġval Ġcondition Value Ġ= Ġparts [ 6 ]. to Long () ĊĠĠĠ Ġval Ġcondition Check Ġ= Ġ{ Ġvalue : ĠLong Ġ-> ĊĠĠĠĠĠ Ġwhen Ġ( parts [ 5 ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġ"< " Ġ-> Ġvalue Ġ< Ġcondition Value ĊĠĠĠĠĠĠĠ Ġ"< =" Ġ-> Ġvalue Ġ<= Ġcondition Value ĊĠĠĠĠĠĠĠ Ġ" ==" Ġ-> Ġvalue Ġ== Ġcondition Value ĊĠĠĠĠĠĠĠ Ġ"! =" Ġ-> Ġvalue Ġ!= Ġcondition Value ĊĠĠĠĠĠĠĠ Ġ"> =" Ġ-> Ġvalue Ġ>= Ġcondition Value ĊĠĠĠĠĠĠĠ Ġ" >" Ġ-> Ġvalue Ġ> Ġcondition Value ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown ĠCondition : Ġ$ line ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠInstruction ( register To Modify , Ġmodifying Operation , Ġregister For Condition , Ġcondition Check ) ĊĠ Ġ} ĊĊĠ Ġdata Ġclass ĠInstruction ( ĊĠĠĠ Ġval Ġregister To Modify : ĠString , ĊĠĠĠ Ġval Ġmodifying Operation : Ġ( Long ) Ġ-> ĠLong , ĊĠĠĠ Ġval Ġregister For Condition : ĠString , ĊĠĠĠ Ġval Ġcondition Check : Ġ( Long ) Ġ-> ĠBoolean ĊĠ Ġ) Ċ } Ċ