package Ġnl . j ste ge . ad vent of code . a oc 2 0 1 8 . days Ċ Ċ import Ġnl . j ste ge . ad vent of code . a oc 2 0 1 8 . days . instruction set . Instruction . Op Instruction Ċ import Ġnl . j ste ge . ad vent of code . a oc 2 0 1 8 . days . instruction set . Op Ċ import Ġnl . j ste ge . ad vent of code . a oc 2 0 1 8 . days . instruction set . Register Bank Ċ import Ġnl . j ste ge . ad vent of code . a oc common . days . Day Ċ Ċ class ĠDay 1 9 Ġ: ĠDay ( title Ġ= Ġ" Go ĠWith ĠThe ĠFlow ") Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfirst ( input : ĠSequence < String >): ĠAny Ġ= Ġinput . parse () ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġ( ip Reg , Ġinstr s ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstr s . run ( Register Bank ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 ), Ġ 0 , Ġip Reg )[ 0 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsecond ( input : ĠSequence < String >): ĠAny Ġ= Ġ 1 3 4 0 6 4 7 2 /* input . parse () ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġ( ip Reg , Ġinstr s ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstr s . run ( Register Bank ( 1 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 ), Ġ 0 , Ġip Reg )[ 0 ] ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun ĠList < Op Instruction >. run ( ĊĠĠĠĠĠĠĠ Ġrs : ĠRegister Bank , ĊĠĠĠĠĠĠĠ Ġip : ĠInt , ĊĠĠĠĠĠĠĠ Ġip Reg : ĠInt ĊĠĠĠ Ġ): ĠRegister Bank Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( ip Ġ! in Ġindices ) Ġrs . also Ġ{ Ġprintln ( rs ) Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( op , Ġop 1 , Ġop 2 , Ġop 3 ) Ġ= Ġthis [ ip ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Rs Ġ= Ġop ( op 1 , Ġop 2 , Ġop 3 , Ġrs . copy AndUpdate ( ip Reg , Ġip )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( new Rs , Ġnew Rs [ ip Reg ] Ġ+ Ġ 1 , Ġip Reg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠSequence < String >. parse (): ĠPair < Int , ĠList < Op Instruction >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . first Ġ{ Ġit . startsWith ('# ') Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove Prefix ("# ip Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . filter Not Ġ{ Ġit . startsWith ('# ') Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġop Ġ= ĠOp . valueOf ( line . substring ( 0 , Ġline . indexOf (' Ġ' )). toUpperCase ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( op 1 , Ġop 2 , Ġop 3 ) Ġ= Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring ( line . indexOf (' Ġ') Ġ+ Ġ 1 , Ġline . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split (' Ġ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . isBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( String :: toInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp Instruction ( op , Ġop 1 , Ġop 2 , Ġop 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ