package Ġa oc 2 0 1 6 Ċ Ċ import ĠDirection Ċ import ĠPos Ċ import Ġto Direction ĊĊ Ċ class ĠDay 1 ( input : ĠString ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcurrent Position Ġ= ĠPos ( 0 , Ġ 0 ) ĊĠĠĠ Ġprivate Ġvar Ġfacing Ġ= ĠDirection . Up ĊĠĠĠ Ġprivate Ġval Ġdirections Ġ= Ġdirections ( input ) ĊĠĠĠ Ġprivate Ġval Ġvisited Ġ= Ġmutable Set Of < Pos >() ĊĊĠĠĠ Ġprivate Ġfun Ġwalk ( directions : ĠList < Pair < Direction , ĠInt >>, Ġstop On Repeat : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( movement Ġin Ġdirections ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfacing Ġ= Ġfacing . turn ( movement . first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( movement . second ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= Ġcurrent Position . move ( facing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stop On Repeat Ġ&& Ġvisited . contains ( current Position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited . add ( current Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdirections ( input : ĠString ): ĠList < Pair < Direction , ĠInt >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġmutable ListOf < Pair < Direction , ĠInt >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( movement Ġin Ġinput . split (", Ġ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġmovement . first (). to Direction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Ġ= Ġmovement . drop ( 1 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret . add ( Pair ( dir , Ġdist )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsolve Part 1 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġwalk ( directions ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Position . distance To Origin ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsolve Part 2 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġwalk ( directions , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Position . distance To Origin ĊĠĠĠ Ġ} Ċ }