package Ġru . tim ak den . ad vent of code . year 2 0 1 6 . day 0 2 Ċ Ċ import Ġru . tim ak den . ad vent of code . Constants . Part Ċ import Ġru . tim ak den . ad vent of code . Constants . Part . PART _ ONE Ċ import Ġru . tim ak den . ad vent of code . Constants . Part . PART _ TWO Ċ import Ġru . tim ak den . ad vent of code . measure Ċ import Ġkotlin . time . Experimental Time Ċ Ċ @ Experimental Time Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġmeasure Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Part ĠOne : Ġ${ solve ( input , ĠPART _ ONE )} ") ĊĠĠĠĠĠĠĠ Ġprintln (" Part ĠTwo : Ġ${ solve ( input , ĠPART _ TWO )} ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġsolve ( input : ĠList < String >, Ġpart : ĠPart ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġpoint Ġ= Ġif Ġ( part Ġ== ĠPART _ ONE ) ĠPair ( 1 , Ġ 1 ) Ġelse ĠPair ( 2 , Ġ 0 ) ĊĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Char >() ĊĊĠĠĠ Ġinput . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġpoint Ġ= Ġgo To The Next Point ( point , Ġit , Ġpart ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( part Ġ== ĠPART _ ONE ) Ġlist . add ( key pad Part One [ point . first ][ point . second ]) ĊĠĠĠĠĠĠĠ Ġelse Ġlist . add ( key pad Part Two [ point . first ][ point . second ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġlist . join ToString ("") Ċ } Ċ Ċ private Ġval Ġkey pad Part One Ġ= ĠarrayOf ( ĊĠĠĠ Ġchar ArrayOf (' 1 ', Ġ' 2 ', Ġ' 3 '), ĊĠĠĠ Ġchar ArrayOf (' 4 ', Ġ' 5 ', Ġ' 6 '), ĊĠĠĠ Ġchar ArrayOf (' 7 ', Ġ' 8 ', Ġ' 9 ') Ċ ) Ċ Ċ private Ġval Ġkey pad Part Two Ġ= ĠarrayOf ( ĊĠĠĠ Ġchar ArrayOf (' Ġ', Ġ' Ġ', Ġ' 1 ', Ġ' Ġ', Ġ' Ġ'), ĊĠĠĠ Ġchar ArrayOf (' Ġ', Ġ' 2 ', Ġ' 3 ', Ġ' 4 ', Ġ' Ġ'), ĊĠĠĠ Ġchar ArrayOf (' 5 ', Ġ' 6 ', Ġ' 7 ', Ġ' 8 ', Ġ' 9 '), ĊĠĠĠ Ġchar ArrayOf (' Ġ', Ġ' A ', Ġ' B ', Ġ' C ', Ġ' Ġ'), ĊĠĠĠ Ġchar ArrayOf (' Ġ', Ġ' Ġ', Ġ' D ', Ġ' Ġ', Ġ' Ġ') Ċ ) Ċ Ċ private Ġfun Ġgo To The Next Point ( point : ĠPair < Int , ĠInt >, Ġinstruction : ĠString , Ġpart : ĠPart ): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠ Ġvar Ġx Ġ= Ġpoint . second ĊĠĠĠ Ġvar Ġy Ġ= Ġpoint . first ĊĊĠĠĠ Ġinstruction . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' U ' Ġ-> Ġif Ġ(!( y Ġ== Ġ 0 Ġ|| Ġ( part Ġ== ĠPART _ TWO Ġ&& Ġkey pad Part Two [ y Ġ- Ġ 1 ][ x ] Ġ== Ġ' Ġ' ))) Ġy -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' D ' Ġ-> Ġif Ġ(( part Ġ== ĠPART _ ONE Ġ&& Ġy Ġ!= Ġ 2 ) Ġ|| Ġ( part Ġ== ĠPART _ TWO Ġ&& Ġy Ġ!= Ġ 4 Ġ&& Ġkey pad Part Two [ y Ġ+ Ġ 1 ][ x ] Ġ!= Ġ' Ġ')) Ġy ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' R ' Ġ-> Ġif Ġ(( part Ġ== ĠPART _ ONE Ġ&& Ġx Ġ!= Ġ 2 ) Ġ|| Ġ( part Ġ== ĠPART _ TWO Ġ&& Ġx Ġ!= Ġ 4 Ġ&& Ġkey pad Part Two [ y ][ x Ġ+ Ġ 1 ] Ġ!= Ġ' Ġ')) Ġx ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' L ' Ġ-> Ġif Ġ(!( x Ġ== Ġ 0 Ġ|| Ġ( part Ġ== ĠPART _ TWO Ġ&& Ġkey pad Part Two [ y ][ x Ġ- Ġ 1 ] Ġ== Ġ' Ġ' ))) Ġx -- ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġy Ġto Ġx Ċ } Ċ