package Ġcom . dam bra . ad vent of code 2 0 1 8 . day 1 9 Ċ Ċ import Ġcom . dam bra . ad vent of code 2 0 1 8 . day 1 6 . E lf sembly Instruction Ċ import Ġcom . dam bra . ad vent of code 2 0 1 8 . day 1 6 . Instruction . Companion . from Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġcom . dam bra . ad vent of code 2 0 1 8 . day 1 6 . Instruction Ċ import Ġcom . dam bra . ad vent of code 2 0 1 8 . day 1 6 . Operation Ċ import Ġcom . dam bra . ad vent of code 2 0 1 8 . day 1 6 . Operation Matcher Ċ Ċ internal Ġclass ĠElf sembly Jump s Ġ{ ĊĠĠĠ Ġprivate Ġval Ġpuzzle Input Ġ= Ġ""" Ċ # ip Ġ 5 Ċ addi Ġ 5 Ġ 1 6 Ġ 5 Ċ set i Ġ 1 Ġ 1 Ġ 2 Ċ set i Ġ 1 Ġ 8 Ġ 1 Ċ mul r Ġ 2 Ġ 1 Ġ 3 Ċ eq rr Ġ 3 Ġ 4 Ġ 3 Ċ addr Ġ 3 Ġ 5 Ġ 5 Ċ addi Ġ 5 Ġ 1 Ġ 5 Ċ addr Ġ 2 Ġ 0 Ġ 0 Ċ addi Ġ 1 Ġ 1 Ġ 1 Ċ g tr r Ġ 1 Ġ 4 Ġ 3 Ċ addr Ġ 5 Ġ 3 Ġ 5 Ċ set i Ġ 2 Ġ 6 Ġ 5 Ċ addi Ġ 2 Ġ 1 Ġ 2 Ċ g tr r Ġ 2 Ġ 4 Ġ 3 Ċ addr Ġ 3 Ġ 5 Ġ 5 Ċ set i Ġ 1 Ġ 2 Ġ 5 Ċ mul r Ġ 5 Ġ 5 Ġ 5 Ċ addi Ġ 4 Ġ 2 Ġ 4 Ċ mul r Ġ 4 Ġ 4 Ġ 4 Ċ mul r Ġ 5 Ġ 4 Ġ 4 Ċ mul i Ġ 4 Ġ 1 1 Ġ 4 Ċ addi Ġ 3 Ġ 2 Ġ 3 Ċ mul r Ġ 3 Ġ 5 Ġ 3 Ċ addi Ġ 3 Ġ 1 3 Ġ 3 Ċ addr Ġ 4 Ġ 3 Ġ 4 Ċ addr Ġ 5 Ġ 0 Ġ 5 Ċ set i Ġ 0 Ġ 8 Ġ 5 Ċ se tr Ġ 5 Ġ 5 Ġ 3 Ċ mul r Ġ 3 Ġ 5 Ġ 3 Ċ addr Ġ 5 Ġ 3 Ġ 3 Ċ mul r Ġ 5 Ġ 3 Ġ 3 Ċ mul i Ġ 3 Ġ 1 4 Ġ 3 Ċ mul r Ġ 3 Ġ 5 Ġ 3 Ċ addr Ġ 4 Ġ 3 Ġ 4 Ċ set i Ġ 0 Ġ 9 Ġ 0 Ċ set i Ġ 0 Ġ 9 Ġ 5 ĊĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġprivate Ġval Ġexample Input Ġ= Ġ""" Ċ # ip Ġ 0 Ċ set i Ġ 5 Ġ 0 Ġ 1 Ċ set i Ġ 6 Ġ 0 Ġ 2 Ċ addi Ġ 0 Ġ 1 Ġ 0 Ċ addr Ġ 1 Ġ 2 Ġ 3 Ċ se tr Ġ 1 Ġ 0 Ġ 0 Ċ set i Ġ 8 Ġ 0 Ġ 4 Ċ set i Ġ 9 Ġ 0 Ġ 5 ĊĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` example Ġinput Ġhal ts Ġwith Ġ 6 Ġin Ġregister Ġ 0 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjp Ġ= ĠJump ing Program ( exampleInput ) ĊĠĠĠĠĠĠĠ Ġval Ġfinal Registers Ġ= Ġjp . until Hal ts () ĊĠĠĠĠĠĠĠ ĠassertThat ( final Registers [ 0 ]). isEqualTo ( 6 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` pu zzle Ġinput Ġhal ts Ġwith Ġsomething Ġin Ġregister Ġ 0 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjp Ġ= ĠJump ing Program ( pu zzle Input ) ĊĠĠĠĠĠĠĠ Ġval Ġfinal Registers Ġ= Ġjp . until Hal ts () ĊĠĠĠĠĠĠĠ ĠassertThat ( final Registers [ 0 ]). isEqualTo ( 9 6 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` pu zzle Ġinput Ġhal ts Ġwith Ġsomething Ġin Ġregister Ġ 0 Ġfor Ġpart Ġ 2 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjp Ġ= ĠJump ing Program ( pu zzle Input , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġfinal Registers Ġ= Ġjp . until Hal ts () ĊĠĠĠĠĠĠĠ ĠassertThat ( final Registers [ 0 ]). isEqualTo ( 6 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠDe coded Instruction ( ĊĠĠĠ Ġval Ġoperation : ĠOperation , ĊĠĠĠ Ġoverride Ġval Ġinput One : ĠInt , ĊĠĠĠ Ġoverride Ġval Ġinput Two : ĠInt , ĊĠĠĠ Ġoverride Ġval Ġoutput : ĠInt Ċ ) Ġ: ĊĠĠĠ ĠElf sembly Instruction Ġ{ ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom ( s : ĠString ): ĠDe coded Instruction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġs . split (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopcode Ġ= Ġparts [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= ĠOperation Matcher . operations [ opcode ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( b , Ġc , Ġd ) Ġ= Ġparts . drop ( 1 ). map Ġ{ Ġit . toInt () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDe coded Instruction ( operation , Ġb , Ġc , Ġd ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠJump ing Program ( private Ġval Ġprogram : ĠString , Ġprivate Ġval Ġregister Zero Starting Value : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠ Ġfun Ġuntil Hal ts (): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġregisters Ġ= Ġmutable ListOf ( register Zero Starting Value , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġprogram . split ("\ n ") ĊĠĠĠĠĠĠĠ Ġval Ġinstruction Pointer Index Ġ= Ġlines . first (). split (" Ġ"). last (). trim (). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġinstructions Ġ= Ġlines . drop ( 1 ). map ( Decoded Instruction . Companion :: from ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġinstruction Pointer : ĠInt Ġ= Ġregisters [ instruction Pointer Index ] ĊĠĠĠĠĠĠĠ Ġwhile Ġ( instruction Pointer Ġ< Ġinstructions . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregisters [ instruction Pointer Index ] Ġ= Ġinstruction Pointer ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġinstructions [ instruction Pointer ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregisters Ġ= Ġnext . operation . apply To ( next , Ġregisters ). to Mutable List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction Pointer Ġ= Ġregisters [ instruction Pointer Index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction Pointer Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġregisters ĊĠĠĠ Ġ} Ċ Ċ } Ċ