package Ġde . di k od am . ad vent of code 2 0 1 9 . utils Ċ Ċ import Ġde . di k od am . ad vent of code 2 0 1 9 . utils . Int code Computer . OpCode .* Ċ import Ġde . di k od am . ad vent of code 2 0 1 9 . utils . Int code Computer . Parameter Mode . IM MEDI ATE Ċ Ċ class ĠInt code Computer ( private Ġval Ġmemory : ĠInt Array ) Ġ{ ĊĊĠĠĠ Ġfun Ġrun ( input : ĠMutable List < Int >, Ġoutput : ĠMutable List < Int > Ġ= Ġmutable ListOf ()): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" starting ĠIC [ ${ hashCode ()} ]") ĊĊĠĠĠĠĠĠĠ Ġvar Ġip Ġ= Ġ 0 ĠĠĠĠĠ Ġ// Ġinstruction Ġpointer ĊĊĠĠĠĠĠĠĠ Ġvar Ġinput Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġinput Reader Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( input Index Ġ>= Ġinput . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput [ input Index ++] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstruction Ġ= Ġparse Instruction ( memory , Ġip ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" IC [ ${ hashCode ()} ] Ġevaluating Ġexpression Ġ${ instruction . opcode }${ instruction . modes . take ( 2 )} Ġat Ġ$ ip ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip Ġ= Ġinstruction ( memory , Ġip , Ġinput Reader , Ġoutput ) Ġ?: Ġreturn Ġoutput ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Instruction ( memory : ĠInt Array , Ġip : ĠInt ): ĠInstruction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinstruction Code Ġ= Ġmemory [ ip ] ĊĊĠĠĠĠĠĠĠ Ġval Ġmodes Ġ= Ġinstruction Code . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. pad Start ( 5 , Ġ' 0 ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. chunk ed ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠParameter Mode . parse ( it . toInt ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠInstruction ( OpCode . parse ( instruction Code Ġ% Ġ 1 0 0 ), Ġmodes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠOp Code ( val Ġlength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠADD ( 4 ), ĊĠĠĠĠĠĠĠ ĠM ULT ( 4 ), ĊĠĠĠĠĠĠĠ ĠIN ( 2 ), ĊĠĠĠĠĠĠĠ ĠOUT ( 2 ), ĊĠĠĠĠĠĠĠ ĠJIT ( 3 ), ĊĠĠĠĠĠĠĠ ĠJ IF ( 3 ), ĊĠĠĠĠĠĠĠ ĠLT ( 4 ), ĊĠĠĠĠĠĠĠ ĠE Q ( 4 ), ĊĠĠĠĠĠĠĠ ĠEND ( 1 ); ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġparse ( code : ĠInt ) Ġ= Ġwhen Ġ( code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠADD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠM ULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> ĠIN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> ĠOUT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 Ġ-> ĠJIT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 6 Ġ-> ĠJ IF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 7 Ġ-> ĠLT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 8 Ġ-> ĠE Q ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 Ġ-> ĠEND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" invalid Ġopcode : Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ 0 Ġis ĠPOSITION , Ġ 1 Ġis ĠIM MEDI ATE ĊĠĠĠ Ġprivate Ġenum Ġclass ĠParameter Mode Ġ{ ĊĊĠĠĠĠĠĠĠ ĠPOSITION , ĠIM MEDI ATE ; ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġparse ( code : ĠInt ) Ġ= Ġwhen Ġ( code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠPOSITION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠIM MEDI ATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" invalid Ġparameter Ġmode : Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠInstruction ( val Ġopcode : ĠOp Code , Ġval Ġmodes : ĠList < Parameter Mode >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemory : ĠInt Array , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput : Ġ() Ġ-> ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput : ĠMutable List < Int > ĊĠĠĠĠĠĠĠ Ġ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġget Param ( i : ĠInt ) Ġ= Ġif Ġ( modes [ i Ġ- Ġ 1 ] Ġ== ĠIM MEDI ATE ) Ġmemory [ ip Ġ+ Ġi ] Ġelse Ġmemory [ memory [ ip Ġ+ Ġi ]] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠADD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġget Param ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= Ġget Param ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 3 Ġ= Ġmemory [ ip Ġ+ Ġ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ p 3 ] Ġ= Ġp 1 Ġ+ Ġp 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Ġ+ Ġopcode . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM ULT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġget Param ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= Ġget Param ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 3 Ġ= Ġmemory [ ip Ġ+ Ġ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ p 3 ] Ġ= Ġp 1 Ġ* Ġp 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Ġ+ Ġopcode . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġmemory [ ip Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ p 1 ] Ġ= Ġinput () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Ġ+ Ġopcode . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOUT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġget Param ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( p 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Ġ+ Ġopcode . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJIT Ġ-> Ġif Ġ( getParam ( 1 ) Ġ!= Ġ 0 ) Ġget Param ( 2 ) Ġelse Ġip Ġ+ Ġopcode . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ IF Ġ-> Ġif Ġ( getParam ( 1 ) Ġ== Ġ 0 ) Ġget Param ( 2 ) Ġelse Ġip Ġ+ Ġopcode . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġget Param ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= Ġget Param ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 3 Ġ= Ġmemory [ ip Ġ+ Ġ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ p 3 ] Ġ= Ġif Ġ( p 1 Ġ< Ġp 2 ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Ġ+ Ġopcode . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE Q Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġget Param ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= Ġget Param ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 3 Ġ= Ġmemory [ ip Ġ+ Ġ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ p 3 ] Ġ= Ġif Ġ( p 1 Ġ== Ġp 2 ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Ġ+ Ġopcode . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEND Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ