package Ġtools Ċ Ċ /** Ċ Ġ* Ġ@ author Ġver wo erd Ċ Ġ* Ġ@ since Ġ 7 - 1 2 - 2 0 1 9 Ċ Ġ*/ Ċ fun Ġread Input () Ġ= readLine () !!. split ("," ). map Ġ{ Ġit . toInt () Ġ}. to IntArray () Ċ Ċ fun Ġexecute Program ( orig : ĠInt Array , Ġinput : ĠList < Int >): ĠMutable List < Int > Ġ{ ĊĠ Ġval Ġcode Ġ= Ġorig . copyOf () ĊĠ Ġvar Ġpointer Ġ= Ġ 0 ĊĠ Ġvar Ġinput Pointer Ġ= 0 ĊĠ Ġval Ġoutput = Ġmutable ListOf < Int >() ĊĠ Ġloop @ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠ Ġval Ġcurrent Ġ= Ġcode [ pointer ] ĊĠĠĠ Ġval Ġstart Pointer Ġ= Ġpointer ĊĠĠĠ Ġvar Ġmode 3 Ġ= Ġcurrent Ġ/ Ġ 1 0 _ 0 0 0 Ġ% Ġ 1 0 ĊĠĠĠ Ġval Ġmode 2 Ġ= Ġcurrent Ġ/ Ġ 1 _ 0 0 0 Ġ% Ġ 1 0 ĊĠĠĠ Ġval Ġmode 1 Ġ= Ġcurrent Ġ/ Ġ 1 0 0 Ġ% Ġ 1 0 ĊĠĠĠ Ġval Ġopcode Ġ= Ġcurrent Ġ% Ġ 1 0 0 ĊĠĠĠ Ġwhen Ġ( opcode ) Ġ{ ĊĠĠĠĠĠĠ 1 Ġ-> ĠsetValue ( ĊĠĠĠĠĠĠĠ Ġcode , ĊĠĠĠĠĠĠĠ ĠgetValue ( code , Ġcode [ pointer Ġ+ Ġ 1 ], Ġmode 1 ) Ġ+ ĠgetValue ( code , Ġcode [ pointer Ġ+ Ġ 2 ], Ġmode 2 ), ĊĠĠĠĠĠĠĠ Ġcode [ pointer Ġ+ Ġ 3 ], ĊĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠ 2 Ġ-> ĠsetValue ( ĊĠĠĠĠĠĠĠ Ġcode , ĊĠĠĠĠĠĠĠ ĠgetValue ( code , Ġcode [ pointer Ġ+ Ġ 1 ], Ġmode 1 ) Ġ* ĠgetValue ( code , Ġcode [ pointer Ġ+ Ġ 2 ], Ġmode 2 ), ĊĠĠĠĠĠĠĠ Ġcode [ pointer Ġ+ Ġ 3 ], ĊĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠ 3 Ġ-> ĠsetValue ( code , Ġinput [ input Pointer ++ ], Ġcode [ pointer Ġ+ Ġ 1 ], Ġ 1 ) ĊĠĠĠĠĠĠ 4 Ġ-> Ġoutput . add ( getValue ( code , Ġcode [ pointer Ġ+ Ġ 1 ], Ġmode 1 )) ĊĠĠĠĠĠĠ 5 Ġ-> Ġif Ġ( getValue ( code , Ġcode [ pointer Ġ+ Ġ 1 ], Ġmode 1 ) Ġ!= Ġ 0 ) Ġpointer Ġ= ĠgetValue ( code , Ġcode [ pointer Ġ+ Ġ 2 ], Ġmode 2 ) ĊĠĠĠĠĠĠ 6 Ġ-> Ġif Ġ( getValue ( code , Ġcode [ pointer Ġ+ Ġ 1 ], Ġmode 1 ) Ġ== Ġ 0 ) Ġpointer Ġ= ĠgetValue ( code , Ġcode [ pointer Ġ+ Ġ 2 ], Ġmode 2 ) ĊĠĠĠĠĠĠ 7 Ġ-> ĠsetValue ( ĊĠĠĠĠĠĠĠ Ġcode , ĊĠĠĠĠĠĠĠ Ġbool ToInt ( getValue ( code , Ġcode [ pointer Ġ+ Ġ 1 ], Ġmode 1 ) Ġ< ĠgetValue ( code , Ġcode [ pointer Ġ+ Ġ 2 ], Ġmode 2 )), ĊĠĠĠĠĠĠĠ Ġcode [ pointer Ġ+ Ġ 3 ], ĊĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠ 8 Ġ-> ĠsetValue ( ĊĠĠĠĠĠĠĠ Ġcode , ĊĠĠĠĠĠĠĠ Ġbool ToInt ( getValue ( code , Ġcode [ pointer Ġ+ Ġ 1 ], Ġmode 1 ) Ġ== ĠgetValue ( code , Ġcode [ pointer Ġ+ Ġ 2 ], Ġmode 2 )), ĊĠĠĠĠĠĠĠ Ġcode [ pointer Ġ+ Ġ 3 ], ĊĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠ 9 9 Ġ-> Ġbreak @ loop ĊĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġopcode Ġ${ code [ pointer ]} ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( pointer Ġ== Ġstart Pointer ) Ġ{ ĊĠĠĠĠĠ Ġpointer Ġ+= Ġwhen Ġ( opcode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġin Ġ 1 .. 2 , Ġin Ġ 7 .. 8 Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠ Ġin Ġ 3 .. 4 Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠ Ġin Ġ 5 .. 6 Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġstep Ġ$ opcode ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġreturn Ġoutput Ċ } Ċ Ċ fun ĠgetValue ( code : ĠInt Array , Ġvalue : ĠInt , Ġmode : ĠInt ): ĠInt Ġ{ ĊĠ Ġreturn Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠ 0 Ġ-> Ġcode [ value ] ĊĠĠĠĠ 1 Ġ-> Ġvalue ĊĠĠĠ Ġelse Ġ-> Ġthrow Ġjava . lang . IllegalArgumentException (" Illegal Ġparameter Ġmode Ġ$ mode ") ĊĠ Ġ} Ċ } Ċ Ċ fun ĠsetValue ( code : ĠInt Array , Ġvalue : ĠInt , Ġaddress : ĠInt , Ġmode : ĠInt ) Ġ{ ĊĠ Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠ 0 Ġ-> Ġcode [ code [ address ]] Ġ= Ġvalue ĊĠĠĠĠ 1 Ġ-> Ġcode [ address ] Ġ= Ġvalue ĊĠ Ġ} Ċ } Ċ