package Ġad vent . of . code . day 0 8 Ċ Ċ import Ġad vent . of . code . to URL Ċ import Ġjava . io . File Ċ Ċ class ĠDay 0 8 Ġ{ ĊĠĠĠĠĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġhand held Hal ting Part 2 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaccumulator Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstructions Ġ= ĠFile (" day 0 8 / input - day 0 8 . txt ". to URL ()). read Lines (). map Ġ{ Ġit . to Instruction () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisited Ġ= Ġmutable Set Of < Int >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswitched Instructions Ġ= Ġmutable Set Of < Int >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġswitched Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop @ while Ġ( index Ġ< Ġinstructions . size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( visited ( visited , Ġindex )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitched Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited . add ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstruction Ġ= Ġinstructions [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( instruction . operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . J MP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( can Switch ( sw itched , Ġswitched Instructions , Ġindex )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= Ġinstruction . argument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitched Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitched Instructions . add ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . ACC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator Ġ+= Ġinstruction . argument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . NOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( can Switch ( sw itched , Ġswitched Instructions , Ġindex , Ġvisited , Ġinstruction )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitched Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitched Instructions . add ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= Ġinstruction . argument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaccumulator . also Ġ{ Ġprintln (" accumulator : Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġhand held Hal ting Part 1 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaccumulator Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstructions Ġ= ĠFile (" day 0 8 / input - day 0 8 . txt ". to URL ()). read Lines (). map Ġ{ Ġit . to Instruction () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisited Ġ= Ġmutable Set Of < Int >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop @ while Ġ( index Ġ< Ġinstructions . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sw itched ( visited , Ġindex )) Ġreturn Ġaccumulator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited . add ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstruction Ġ= Ġinstructions [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( instruction . operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . J MP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= Ġinstruction . argument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . ACC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator Ġ+= Ġinstruction . argument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . NOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaccumulator . also Ġ{ Ġprintln (" accumulator : Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġswitched ( sw itched Instructions : ĠSet < Int >, Ġindex : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitched Instructions . contains ( index ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġvisited ( visited : ĠSet < Int >, Ġindex : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited . contains ( index ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġvisited ( visited : ĠSet < Int >, Ġindex : ĠInt , Ġinstruction : ĠInstruction ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitched ( visited , Ġindex Ġ+ Ġinstruction . argument ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcan Switch ( sw itched : ĠBoolean , Ġswitched Instructions : ĠSet < Int >, Ġindex : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitched Ġ|| Ġswitched ( sw itched Instructions , Ġindex ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcan Switch ( sw itched : ĠBoolean , Ġswitched Instructions : ĠSet < Int >, Ġindex : ĠInt , Ġvisited : ĠSet < Int >, Ġinstruction : ĠInstruction ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! sw itched Ġ&& Ġ! sw itched ( sw itched Instructions , Ġindex ) Ġ&& Ġ! visited ( visited , Ġindex , Ġinstruction ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ( hand held Hal ting Part 1 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( hand held Hal ting Part 2 ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠInstruction ( val Ġoperation : ĠOperation , Ġval Ġargument : ĠInt ) ĊĊĠĠĠ Ġenum Ġclass ĠOperation Ġ{ ĊĠĠĠĠĠĠĠ ĠACC , ĊĠĠĠĠĠĠĠ ĠJMP , ĊĠĠĠĠĠĠĠ ĠN OP ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠString . to Instruction (): ĠDay 0 8 . Instruction Ġ{ ĊĠĠĠ Ġval Ġsplit Ġ= Ġthis . split (" Ġ") ĊĠĠĠ Ġreturn ĠDay 0 8 . Instruction ( Day 0 8 . Operation . valueOf ( split [ 0 ]. toUpperCase ()), Ġsplit [ 1 ]. toInt ()) Ċ } Ċ