package Ġorg . s job lo mj . ad vent of code . day 3 Ċ Ċ import Ġorg . s job lo mj . ad vent of code . day 3 . Instruction . Direction .* Ċ import Ġorg . s job lo mj . ad vent of code . readFile Ċ import Ġkotlin . math . abs Ċ Ċ private Ġconst Ġval Ġinput File Ġ= Ġ" src / main / resources / inputs / day 3 . txt " Ċ Ċ fun Ġday 3 (): ĠPair < Int , ĠInt > Ġ{ Ċ ĉ val Ġcontent Ġ= ĠreadFile ( inputFile ) Ċ ĉ val Ġcoordinates 0 Ġ= Ġinstructions To Coordinates ( create Instruction List ( content [ 0 ])) Ċ ĉ val Ġcoordinates 1 Ġ= Ġinstructions To Coordinates ( create Instruction List ( content [ 1 ])) ĊĊ ĉ val Ġdistance Ġ= Ġfind Distance ( coordinates 0 , Ġcoordinates 1 ) Ċ ĉ val Ġsteps Ġ= Ġfind Steps ( coordinates 0 , Ġcoordinates 1 ) ĊĊ ĉ println (" Short est Ġdistance : Ġ$ distance ") Ċ ĉ println (" F ew est Ġsteps : Ġ$ steps ") Ċ ĉ return Ġdistance Ġto Ġsteps Ċ } Ċ Ċ internal Ġfun Ġfind Steps ( coordinates 0 : ĠList < Coord >, Ġcoordinates 1 : ĠList < Coord >): ĠInt Ġ{ Ċ ĉ val Ġintersection Ġ= Ġcoordinates 1 . intersect ( coordinates 0 ). minus ( Coord ( 0 , Ġ 0 )) Ċ ĉ val Ġmap Ġ= Ġintersection . map Ġ{ ĠPair ( it , Ġit . steps Taken ) Ġ}. toMap () ĊĊ ĉ return Ġcoordinates 0 . intersect ( intersection ) Ċĉ ĉ . map Ġ{ Ġit . steps Taken Ġ+ Ġ( map [ it ] Ġ?: Ġ 0 ) Ġ} Ċĉ ĉ . min () Ċĉ ĉ ?: Ġthrow ĠRuntimeException (" Failed Ġto Ġfind Ġfew est Ġsteps ") Ċ } Ċ Ċ internal Ġfun Ġfind Distance ( coordinates 0 : ĠList < Coord >, Ġcoordinates 1 : ĠList < Coord >): ĠInt Ġ{ ĊĊ ĉ return Ġcoordinates 0 . intersect ( coordinates 1 . minus ( Coord ( 0 , Ġ 0 ))) Ċĉ ĉ . map Ġ{ Ġcoord Ġ-> Ġdistance ( coord ) Ġ} Ċĉ ĉ . min () Ċĉ ĉ ?: Ġthrow ĠRuntimeException (" Failed Ġto Ġfind Ġshortest Ġdistance ") Ċ } Ċ Ċ /** Ċ Ġ* ĠMan h att an Ġdistance , Ġfrom Ġ( 0 , Ġ 0 ) Ċ Ġ*/ Ċ private Ġfun Ġdistance ( coord : ĠCoord ) Ġ= Ġabs ( coord . x ) Ġ+ Ġabs ( coord . y ) ĊĊ Ċ internal Ġfun Ġinstructions To Coordinates ( instructions : ĠList < Instruction >): ĠList < Coord > Ġ{ Ċ ĉ var Ġx Ġ= Ġ 0 Ċ ĉ var Ġy Ġ= Ġ 0 Ċ ĉ var Ġsteps Taken Ġ= Ġ 0 Ċ ĉ val Ġcoords Ġ= Ġmutable ListOf < Coord >() ĊĊ ĉ for Ġ( instruction Ġin Ġinstructions ) Ġ{ Ċĉ ĉ coords . addAll ( Ċĉĉ ĉ when Ġ( instruction . direction ) Ġ{ Ċĉĉĉ ĉ R Ġ-> Ġ( 0 Ġuntil Ġinstruction . steps ). map Ġ{ ĠCoord ( x ++, Ġy , Ġsteps Taken ++) Ġ} Ċĉĉĉ ĉ L Ġ-> Ġ( 0 Ġuntil Ġinstruction . steps ). map Ġ{ ĠCoord ( x -- , Ġy , Ġsteps Taken ++) Ġ} Ċĉĉĉ ĉ U Ġ-> Ġ( 0 Ġuntil Ġinstruction . steps ). map Ġ{ ĠCoord ( x , Ġy ++, Ġsteps Taken ++) Ġ} Ċĉĉĉ ĉ D Ġ-> Ġ( 0 Ġuntil Ġinstruction . steps ). map Ġ{ ĠCoord ( x , Ġy -- , Ġsteps Taken ++) Ġ} Ċĉĉ ĉ }) Ċ ĉ } Ċ ĉ coords . add ( Coord ( x , Ġy , Ġsteps Taken )) Ċ ĉ return Ġcoords Ċ } Ċ Ċ internal Ġfun Ġcreate Instruction List ( instructions : ĠString ): ĠList < Instruction > Ġ{ Ċ ĉ fun Ġparse Direction ( d : ĠChar ) Ġ= Ċĉ ĉ when Ġ( d ) Ġ{ Ċĉĉ ĉ ' R ' Ġ-> ĠR Ċĉĉ ĉ ' L ' Ġ-> ĠL Ċĉĉ ĉ ' U ' Ġ-> ĠU Ċĉĉ ĉ ' D ' Ġ-> ĠD Ċĉĉ ĉ else Ġ-> Ġthrow ĠIllegalArgumentException (" Could Ġnot Ġparse Ġdirection Ġ'$ d '") Ċĉ ĉ } ĊĊ ĉ return Ġinstructions . split (",") Ċĉ ĉ . filter Ġ{ Ġit Ġ!= Ġ"" Ġ} Ċĉ ĉ . map Ġ{ ĠInstruction ( parse Direction ( it [ 0 ]), Ġit . substring ( 1 ). toInt ()) Ġ} Ċ } Ċ Ċ internal Ġdata Ġclass ĠInstruction ( val Ġdirection : ĠDirection , Ġval Ġsteps : ĠInt ) Ġ{ Ċ ĉ enum Ġclass ĠDirection Ġ{ ĠR , ĠL , ĠU , ĠD Ġ} Ċ } Ċ Ċ internal Ġdata Ġclass ĠCoord ( val Ġx : ĠInt , Ġval Ġy : ĠInt , Ġval Ġsteps Taken : ĠInt Ġ= Ġ 0 ) Ġ{ Ċ ĉ /** Ċĉ Ġ* ĠIgnore Ġthe Ġsteps Taken Ġparameter Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ Ċĉ ĉ if Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue Ċĉ ĉ if Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĉ ĉ other Ġas ĠCoord ĊĊĉ ĉ if Ġ( x Ġ!= Ġother . x ) Ġreturn Ġfalse Ċĉ ĉ if Ġ( y Ġ!= Ġother . y ) Ġreturn Ġfalse ĊĊĉ ĉ return Ġtrue Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠIgnore Ġthe Ġsteps Taken Ġparameter Ċĉ Ġ*/ Ċ ĉ override Ġfun ĠhashCode (): ĠInt Ġ{ Ċĉ ĉ var Ġresult Ġ= Ġx Ċĉ ĉ result Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġy Ċĉ ĉ return Ġresult Ċ ĉ } Ċ } Ċ