package Ġday 0 5 Ċ Ċ import Ġread Input Ċ import Ġkotlin . math . max Ċ import Ġkotlin . collections . sum Of Ċ import Ġkotlin . math . abs Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġinput Ġ= Ġread Input (" day 0 5 ") ĊĠĠĠ Ġprintln ( solve Part One ( input )) ĊĠĠĠ Ġprintln ( solve Part Two ( input )) Ċ } Ċ Ċ fun Ġsolve Part One ( input : ĠList < String >): ĠInt Ġ= ĊĠĠĠ Ġinput . to Line List () ĊĠĠĠĠĠĠĠ Ġ. filter Str aight Lines () ĊĠĠĠĠĠĠĠ Ġ. create Line Matrix () ĊĠĠĠĠĠĠĠ Ġ. sum At Least 2 Lines Overlap () Ċ Ċ fun Ġsolve Part Two ( input : ĠList < String >): ĠInt Ġ= ĊĠĠĠ Ġinput . to Line List () ĊĠĠĠĠĠĠĠ Ġ. create Line Matrix () ĊĠĠĠĠĠĠĠ Ġ. sum At Least 2 Lines Overlap () Ċ Ċ private Ġfun ĠList < String >. to Line List () Ġ= Ġmap Ġ{ Ġstring Ġ-> Ġstring . split (" Ġ-> Ġ") Ġ} ĊĠĠĠ Ġ. map Ġ{ Ġ( start , Ġend ) Ġ-> ĠLine ( start . to Coordinates (), Ġend . to Coordinates ()) Ġ} Ċ Ċ private Ġfun ĠList < Line >. filter Str aight Lines () Ġ= ĊĠĠĠ Ġfilter Ġ{ Ġ( start , Ġend ) Ġ-> Ġstart . x Ġ== Ġend . x Ġ|| Ġstart . y Ġ== Ġend . y Ġ} Ċ Ċ private Ġfun ĠList < Line >. create Line Matrix () Ġ= Ġfold ( ĊĠĠĠ Ġinitial Ġ= ĠZero , Ċ ) Ġ{ Ġacc , Ġline Ġ-> Ġmax ( acc , Ġline . max ()) Ġ} ĊĠĠĠ Ġ. let Ġ{ Ġ( x , Ġy ) Ġ-> ĠArray ( y Ġ+ Ġ 1 ) Ġ{ ĠArray ( x Ġ+ Ġ 1 ) Ġ{ Ġ 0 Ġ} Ġ} Ġ} ĊĠĠĠ Ġ. also Ġ{ Ġmatrix Ġ-> ĊĠĠĠĠĠĠĠ Ġon Each Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . on Each Member Ġ{ Ġ( x , Ġy ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix [ y ][ x ] Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ private Ġfun ĠArray < Array < Int >> . sum At Least 2 Lines Overlap () Ġ= ĊĠĠĠ Ġsum Of Ġ{ Ġrow Ġ-> Ġrow . sum Of Ġ{ Ġamount Ġ-> Ġif Ġ( amount Ġ> Ġ 1 ) Ġ 1 L Ġelse Ġ 0 L Ġ} Ġ}. toInt () Ċ Ċ private Ġfun ĠString . to Coordinates () Ġ= Ġsplit (',') ĊĠĠĠ Ġ. let Ġ{ Ġ( x , Ġy ) Ġ-> ĠCoordinates ( x . toInt (), Ġy . toInt ()) Ġ} Ċ Ċ private Ġfun Ġstep ( start : ĠInt , Ġend : ĠInt ) Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġstart Ġ== Ġend Ġ-> Ġ 0 ĊĠĠĠ Ġstart Ġ< Ġend Ġ-> Ġ 1 ĊĠĠĠ Ġelse Ġ-> Ġ- 1 Ċ } Ċ Ċ private Ġfun Ġmax ( first : ĠCoordinates , Ġsecond : ĠCoordinates ) Ġ= ĊĠĠĠ ĠCoordinates ( x Ġ= Ġmax ( first . x , Ġsecond . x ), Ġy Ġ= Ġmax ( first . y , Ġsecond . y )) ĊĊ Ċ private Ġdata Ġclass ĠLine ( ĊĠĠĠ Ġval Ġstart : ĠCoordinates , ĊĠĠĠ Ġval Ġend : ĠCoordinates , Ċ ) Ċ Ċ private Ġdata Ġclass ĠCoordinates ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ċ Ċ private Ġval ĠZero Ġ= ĠCoordinates ( x Ġ= Ġ 0 , Ġy Ġ= Ġ 0 ) Ċ Ċ private Ġfun ĠLine . on Each Member ( block : Ġ( Coordinates ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġhorizontal Step Ġ= Ġstep ( start . x , Ġend . x ) ĊĠĠĠ Ġval Ġvertical Step Ġ= Ġstep ( start . y , Ġend . y ) ĊĠĠĠ Ġrepeat ( steps Count ()) Ġ{ Ġcount Ġ-> ĊĠĠĠĠĠĠĠ Ġblock ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCoordinates ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġstart . x Ġ+ Ġhorizontal Step Ġ* Ġcount , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġstart . y Ġ+ Ġvertical Step Ġ* Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠLine . steps Count () Ġ= ĊĠĠĠ Ġmax ( abs ( end . x Ġ- Ġstart . x ), Ġabs ( end . y Ġ- Ġstart . y )) Ġ+ Ġ 1 Ċ Ċ private Ġfun ĠLine . max () Ġ= Ġmax ( start , Ġend ) Ċ