package Ġa oc 1 9 Ċ Ċ import Ġkotlin . math . abs Ċ Ċ object ĠDay 3 Ġ{ ĊĊĠĠĠ Ġenum Ġclass ĠDirection Ġ{ ĠUP , ĠDOWN , ĠLEFT , ĠRIGHT Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠStep ( val Ġdirection : ĠDirection , Ġval Ġdistance : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġpositions ( start Pos : ĠPos ): ĠList < Pos > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . UP Ġ-> Ġ(( start Pos . y Ġ+ Ġ 1 ) .. ( start Pos . y Ġ+ Ġdistance )). map Ġ{ ĠPos ( start Pos . x , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . DOWN Ġ-> Ġ(( start Pos . y Ġ- Ġ 1 ) Ġdown To Ġ( start Pos . y Ġ- Ġdistance )). map Ġ{ ĠPos ( start Pos . x , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . RIGHT Ġ-> Ġ(( start Pos . x Ġ+ Ġ 1 ) .. ( start Pos . x Ġ+ Ġdistance )). map Ġ{ ĠPos ( it , Ġstart Pos . y ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . LEFT Ġ-> Ġ(( start Pos . x Ġ- Ġ 1 ) Ġdown To Ġ( start Pos . x Ġ- Ġdistance )). map Ġ{ ĠPos ( it , Ġstart Pos . y ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠPos ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdistance ( other : ĠPos ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġabs ( x Ġ- Ġother . x ) Ġ+ Ġabs ( y Ġ- Ġother . y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Steps ( steps String : ĠString ): ĠList < Step > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsteps String . split (',' ). map Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġs [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġs . substring ( 1 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( dir ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' R ' Ġ-> ĠStep ( Direction . RIGHT , Ġdistance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' L ' Ġ-> ĠStep ( Direction . LEFT , Ġdistance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' U ' Ġ-> ĠStep ( Direction . UP , Ġdistance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' D ' Ġ-> ĠStep ( Direction . DOWN , Ġdistance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Un pars able Ġstep Ġ$ s ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdistance ( wire 1 : ĠString , Ġwire 2 : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwire 1 Steps Ġ= Ġparse Steps ( wire 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġwire 2 Steps Ġ= Ġparse Steps ( wire 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġwire 1 Positions Ġ= Ġwire 1 Steps . fold ( listOf ( Pos ( 0 , Ġ 0 ))) Ġ{ Ġinit , Ġstep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ+ Ġstep . positions ( init . last ()) ĊĠĠĠĠĠĠĠ Ġ}. drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġwire 2 Positions Ġ= Ġwire 2 Steps . fold ( listOf ( Pos ( 0 , Ġ 0 ))) Ġ{ Ġinit , Ġstep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ+ Ġstep . positions ( init . last ()) ĊĠĠĠĠĠĠĠ Ġ}. drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġinter sections Ġ= Ġwire 1 Positions . intersect ( wire 2 Positions ) ĊĠĠĠĠĠĠĠ Ġval Ġdistances Ġ= Ġinter sections . map Ġ{ Ġit . distance ( Pos ( 0 , Ġ 0 )) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdistances . min () Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwire Length ( wire 1 : ĠString , Ġwire 2 : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwire 1 Steps Ġ= Ġparse Steps ( wire 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġwire 2 Steps Ġ= Ġparse Steps ( wire 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġwire 1 Positions Ġ= Ġwire 1 Steps . fold ( listOf ( Pos ( 0 , Ġ 0 ))) Ġ{ Ġinit , Ġstep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ+ Ġstep . positions ( init . last ()) ĊĠĠĠĠĠĠĠ Ġ}. drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġwire 2 Positions Ġ= Ġwire 2 Steps . fold ( listOf ( Pos ( 0 , Ġ 0 ))) Ġ{ Ġinit , Ġstep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ+ Ġstep . positions ( init . last ()) ĊĠĠĠĠĠĠĠ Ġ}. drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġinter sections Ġ= Ġwire 1 Positions . intersect ( wire 2 Positions ) ĊĠĠĠĠĠĠĠ Ġval Ġwire 1 Positions Indexed Ġ= Ġwire 1 Positions . with Index (). filter Ġ{ Ġit . value Ġin Ġinter sections Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwire 2 Positions Indexed Ġ= Ġwire 2 Positions . with Index (). filter Ġ{ Ġit . value Ġin Ġinter sections Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwire 1 Map Ġ= Ġwire 1 Positions Indexed . groupBy ({ Ġit . value Ġ}) Ġ{ Ġit . index Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwire 2 Map Ġ= Ġwire 2 Positions Indexed . groupBy ({ Ġit . value Ġ}) Ġ{ Ġit . index Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġinter sections . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( wire 1 Map [ it ]?. min () Ġ?: Ġ 0 ) Ġ+ Ġ( wire 2 Map [ it ]?. min () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ}. min () Ġ?: Ġ 0 ĊĠĠĠ Ġ} Ċ }