@ file : Suppress (" Spell Checking Inspection ") Ċ Ċ package Ġad vent of code . util ĊĊ Ċ fun Ġparse To As sem B un ny ( string : ĠString ): ĠList < Instruction > Ġ= Ġstring . lines (). map (:: parse Instruction ) Ċ Ċ private Ġfun Ġparse Instruction ( string : ĠString ): ĠInstruction Ġ= Ġstring . split (" Ġ"). let Ġ{ ĊĠĠĠ Ġwhen Ġ( it [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" cpy " Ġ-> ĠC py ( parse RHS ( it [ 1 ]), Ġparse Register ( it [ 2 ])) ĊĠĠĠĠĠĠĠ Ġ" inc " Ġ-> ĠInc ( parse Register ( it [ 1 ])) ĊĠĠĠĠĠĠĠ Ġ" dec " Ġ-> ĠDec ( parse Register ( it [ 1 ])) ĊĠĠĠĠĠĠĠ Ġ" j nz " Ġ-> ĠJ nz ( parse RHS ( it [ 1 ]), Ġparse RHS ( it [ 2 ])) ĊĠĠĠĠĠĠĠ Ġ" tgl " Ġ-> ĠT gl ( parse RHS ( it [ 1 ])) ĊĠĠĠĠĠĠĠ Ġ" out " Ġ-> ĠOut ( parse RHS ( it [ 1 ])) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( string ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġparse RHS ( s : ĠString ): ĠRHS Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġs . toInt OrNull () Ġ!= Ġnull Ġ-> ĠLiteral ( s . toInt ()) ĊĠĠĠ Ġelse Ġ-> Ġparse Register ( s ) Ċ } Ċ Ċ private Ġfun Ġparse Register ( s : ĠString ): ĠRegister Value Ġ= Ġwhen Ġ( s ) Ġ{ ĊĠĠĠ Ġ" a " Ġ-> ĠRegister Value ( 0 ) ĊĠĠĠ Ġ" b " Ġ-> ĠRegister Value ( 1 ) ĊĠĠĠ Ġ" c " Ġ-> ĠRegister Value ( 2 ) ĊĠĠĠ Ġ" d " Ġ-> ĠRegister Value ( 3 ) ĊĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( s ) Ċ } Ċ Ċ data Ġclass ĠAs sem B un ny Context ( ĊĠĠĠ Ġval Ġregisters : ĠMutable List < Int >, ĊĠĠĠ Ġvar Ġpc : ĠInt , ĊĠĠĠ Ġval Ġinstruction List : ĠMutable List < Instruction > Ċ ) Ġ{ ĊĠĠĠ Ġval Ġsignal Ġ= Ġmutable ListOf < Int >() ĊĊĠĠĠ Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( pc Ġin Ġinstruction List . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction List [ pc ]. execute ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun ( steps : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( steps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pc Ġ! in Ġinstruction List . indices ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction List [ pc ]. execute ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ sealed Ġclass ĠInstruction Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġexecute ( context : ĠAs sem B un ny Context ) Ċ } Ċ Ċ data Ġclass ĠC py ( val Ġsource : ĠRHS , Ġval Ġtarget : ĠRegister Value ) Ġ: ĠInstruction () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġexecute ( context : ĠAs sem B un ny Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget . assign ( context , Ġsource . eval ( context )) ĊĠĠĠĠĠĠĠ Ġcontext . pc ++ ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠInc ( val Ġtarget : ĠRegister Value ) Ġ: ĠInstruction () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġexecute ( context : ĠAs sem B un ny Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget . assign ( context , Ġtarget . eval ( context ) Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġcontext . pc ++ ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠDec ( val Ġtarget : ĠRegister Value ) Ġ: ĠInstruction () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġexecute ( context : ĠAs sem B un ny Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget . assign ( context , Ġtarget . eval ( context ) Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġcontext . pc ++ ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠJ nz ( val Ġcondition : ĠRHS , Ġval Ġdistance : ĠRHS ) Ġ: ĠInstruction () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġexecute ( context : ĠAs sem B un ny Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( condition . eval ( context ) Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . pc ++ ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . pc Ġ+= Ġdistance . eval ( context ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠT gl ( private Ġval Ġdistance : ĠRHS ) Ġ: ĠInstruction () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġexecute ( context : ĠAs sem B un ny Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġcontext . pc Ġ+ Ġdistance . eval ( context ) ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġin Ġcontext . instruction List . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstruction Ġ= Ġcontext . instruction List [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . instruction List [ i ] Ġ= Ġtoggle ( instruction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontext . pc ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle ( t : ĠInstruction ): ĠInstruction Ġ= Ġwhen Ġ( t ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠInc Ġ-> ĠDec ( t . target ) ĊĠĠĠĠĠĠĠ Ġis ĠDec Ġ-> ĠInc ( t . target ) ĊĠĠĠĠĠĠĠ Ġis ĠT gl Ġ-> Ġif Ġ( t . distance Ġis ĠRegister Value ) ĠInc ( t . distance ) Ġelse ĠN op ĊĠĠĠĠĠĠĠ Ġis ĠN op Ġ-> ĠN op ĊĠĠĠĠĠĠĠ Ġis ĠC py Ġ-> ĠJ nz ( t . source , Ġt . target ) ĊĠĠĠĠĠĠĠ Ġis ĠJ nz Ġ-> Ġif Ġ( t . distance Ġis ĠRegister Value ) ĠC py ( t . condition , Ġt . distance ) Ġelse ĠN op 2 ( t . condition , Ġt . distance ) ĊĠĠĠĠĠĠĠ Ġis ĠN op 2 Ġ-> ĠJ nz ( t . a , Ġt . b ) ĊĠĠĠĠĠĠĠ Ġis ĠOut Ġ-> ĠOut ( t . a ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠN op Ġ: ĠInstruction () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġexecute ( context : ĠAs sem B un ny Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . pc ++ ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠN op 2 ( val Ġa : ĠRHS , Ġval Ġb : ĠRHS ) Ġ: ĠInstruction () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġexecute ( context : ĠAs sem B un ny Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . pc ++ ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠOut ( val Ġa : ĠRHS ) Ġ: ĠInstruction () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġexecute ( context : ĠAs sem B un ny Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . signal Ġ+= Ġa . eval ( context ) ĊĠĠĠĠĠĠĠ Ġcontext . pc ++ ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ interface ĠRHS Ġ{ ĊĠĠĠ Ġfun Ġeval ( context : ĠAs sem B un ny Context ): ĠInt Ċ } Ċ Ċ interface ĠL HS Ġ{ ĊĠĠĠ Ġfun Ġassign ( context : ĠAs sem B un ny Context , Ġvalue : ĠInt ) Ċ } Ċ Ċ data Ġclass ĠRegister Value ( private Ġval Ġregister : ĠInt ) Ġ: ĠL HS , ĠRHS Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġassign ( context : ĠAs sem B un ny Context , Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . registers [ register ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġeval ( context : ĠAs sem B un ny Context ): ĠInt Ġ= Ġcontext . registers [ register ] Ċ } Ċ Ċ data Ġclass ĠLiteral ( private Ġval Ġvalue : ĠInt ) Ġ: ĠRHS Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġeval ( context : ĠAs sem B un ny Context ): ĠInt Ġ= Ġvalue Ċ }