package Ġch j ae g gi Ċ Ċ enum Ġclass ĠComputer Status Ġ{ ĊĠĠĠ ĠOK , ĠINF _ LOOP , ĠFAIL Ċ } Ċ Ċ class ĠDay 8 ( private Ġval Ġinput : ĠList < String >) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġaccumulator Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġsolve Part 1 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġp ocket Computer ( input ) ĊĠĠĠĠĠĠĠ Ġreturn Ġaccumulator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsolve Part 2 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnop J mp List Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠ Ġinput . forEach Indexed Ġ{ Ġidx , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . contains (" nop ") Ġ|| Ġitem . contains (" jmp ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnop J mp List Ġ+= Ġidx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnop J mp List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġmutable ListOf < String >(). apply Ġ{ Ġadd All ( input ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input [ it ]. contains (" jmp ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode [ it ] Ġ= Ġcode [ it ]. replace (" jmp ", Ġ" nop ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode [ it ] Ġ= Ġcode [ it ]. replace (" nop ", Ġ" jmp ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( po cket Computer ( code ) Ġ== ĠComputer Status . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaccumulator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġp ocket Computer ( code : ĠList < String >): ĠComputer Status Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġreset Ġcomputer ĊĠĠĠĠĠĠĠ Ġval Ġexecuted Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠ Ġvar Ġinstruction Pointer Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġaccumulator Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( instruction Pointer Ġ! in Ġexecuted Ġ&& Ġinstruction Pointer Ġ< Ġcode . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= Ġcode [ instruction Pointer ]. substring Before (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Ġ= Ġcode [ instruction Pointer ]. substring After (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecuted . add ( instruction Pointer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" acc " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator Ġ+= Ġparameter . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction Pointer ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" nop " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction Pointer ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" jmp " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction Pointer Ġ+= Ġparameter . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( instruction Pointer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode . size Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComputer Status . OK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġexecuted Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComputer Status . INF _ LOOP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComputer Status . FAIL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }