package Ġad vent of code 2 0 1 7 . pot as z Ċ Ċ import Ġkotlin . math . max Ċ Ċ sealed Ġclass ĠExpr < out ĠT >( val Ġreg : ĠString , Ġval Ġnumber : ĠInt , Ġval Ġop : Ġ( Int ) Ġ-> ĠT ) Ġ{ ĊĠĠĠ Ġfun Ġeval ( context : ĠMutable Map < String , ĠInt >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġop ( context . get OrDefault ( reg , Ġ 0 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ this . java Class . simple Name } ($ reg , Ġ$ number )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġoperation ( reg : ĠString , Ġtoken : ĠString , Ġnumber : ĠInt ): ĠExpr < Int > Ġ= Ġwhen Ġ( token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" inc " Ġ-> ĠInc ( reg , Ġnumber ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" dec " Ġ-> ĠDec ( reg , Ġnumber ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Unknown Ġoperation : Ġ$ token ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcondition ( reg : ĠString , Ġtoken : ĠString , Ġnumber : ĠInt ): ĠExpr < Boolean > Ġ= Ġwhen Ġ( token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ==" Ġ-> ĠEq ( reg , Ġnumber ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"! =" Ġ-> ĠN eq ( reg , Ġnumber ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< " Ġ-> ĠL t ( reg , Ġnumber ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< =" Ġ-> ĠL te ( reg , Ġnumber ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" >" Ġ-> ĠG t ( reg , Ġnumber ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"> =" Ġ-> ĠG te ( reg , Ġnumber ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Unknown Ġcondition : Ġ$ token ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠInc ( reg : ĠString , Ġnumber : ĠInt ): ĠExpr < Int >( reg , Ġnumber , Ġ{ Ġit Ġ+ Ġnumber Ġ}) Ċ class ĠDec ( reg : ĠString , Ġnumber : ĠInt ): ĠExpr < Int >( reg , Ġnumber , Ġ{ Ġit Ġ- Ġnumber Ġ}) Ċ Ċ class ĠEq ( reg : ĠString , Ġnumber : ĠInt ): ĠExpr < Boolean >( reg , Ġnumber , Ġ{ Ġit Ġ== Ġnumber Ġ}) Ċ class ĠN eq ( reg : ĠString , Ġnumber : ĠInt ): ĠExpr < Boolean >( reg , Ġnumber , Ġ{ Ġit Ġ!= Ġnumber }) Ċ class ĠL t ( reg : ĠString , Ġnumber : ĠInt ): ĠExpr < Boolean >( reg , Ġnumber , Ġ{ Ġit Ġ< Ġnumber }) Ċ class ĠL te ( reg : ĠString , Ġnumber : ĠInt ): ĠExpr < Boolean >( reg , Ġnumber , Ġ{ Ġit Ġ<= Ġnumber Ġ}) Ċ class ĠG t ( reg : ĠString , Ġnumber : ĠInt ): ĠExpr < Boolean >( reg , Ġnumber , Ġ{ Ġit Ġ> Ġnumber }) Ċ class ĠG te ( reg : ĠString , Ġnumber : ĠInt ): ĠExpr < Boolean >( reg , Ġnumber , Ġ{ Ġit Ġ>= Ġnumber }) Ċ Ċ object ĠP 0 8 Registers Ġ{ ĊĊĠĠĠ Ġ// Ġc Ġinc Ġ- 2 0 Ġif Ġc Ġ== Ġ 1 0 ĊĠĠĠ Ġval ĠP ATTERN Ġ= Ġ""" (\ w +)\ s ( inc | dec )\ s ([- 0 - 9 ]+ )\ s if \ s (\ w +)\ s ([ != <> ]+ )\ s ([- 0 - 9 ]+) """. to Regex () ĊĊĠĠĠ Ġdata Ġclass ĠInstruction ( val Ġop : ĠExpr < Int >, Ġval Ġcond : ĠExpr < Boolean >) ĊĊĠĠĠ Ġfun Ġparse Line ( line : ĠString ): ĠInstruction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠP ATTERN . match Ent ire ( line )?. group Values Ġ?: Ġthrow ĠRuntimeException (" Cannot Ġparse Ġline : Ġ$ line ") ĊĠĠĠĠĠĠĠ Ġreturn ĠInstruction ( Expr . operation ( tokens [ 1 ], Ġtokens [ 2 ], Ġtokens [ 3 ]. toInt ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr . condition ( tokens [ 4 ], Ġtokens [ 5 ], Ġtokens [ 6 ]. toInt ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsolve ( lines : ĠList < String >): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġmutable Map Of < String , ĠInt >() ĊĠĠĠĠĠĠĠ Ġvar Ġmax Ġ= ĠInt . MIN _ VALUE ĊĠĠĠĠĠĠĠ Ġlines . map Ġ{ Ġparse Line ( it ) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . cond . eval ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġit . op . eval ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext [ it . op . reg ] Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġmax ( max , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( context . values . max () Ġ?: Ġ 0 ) Ġto Ġmax ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsample Ġ= Ġread Lines (" sample 0 8 . txt ") ĊĠĠĠĠĠĠĠ Ġval Ġsample Solution Ġ= Ġsolve ( sample ) ĊĠĠĠĠĠĠĠ Ġprintln (" Sample Ġ-> Ġmax Ġregister Ġvalue : Ġ${ sample Solution . first }, Ġhighest Ġvalue : Ġ${ sample Solution . second }") ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġread Lines (" input 0 8 . txt ") ĊĠĠĠĠĠĠĠ Ġval Ġsolution Ġ= Ġsolve ( input ) ĊĠĠĠĠĠĠĠ Ġprintln (" Input Ġ-> Ġmax Ġregister Ġvalue : Ġ${ solution . first }, Ġhighest Ġvalue : Ġ${ solution . second }") ĊĠĠĠ Ġ} Ċ } Ċ