package Ġday 5 Ċ Ċ import Ġread ToList Ċ Ċ val Ġinput Ġ= Ġread ToList (" day 5 . txt ") Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġprintln ( part 1 ()) ĊĠĠĠ Ġprintln ( part 2 ()) Ċ } Ċ Ċ private Ġfun Ġpart 1 () Ġ{ ĊĠĠĠ Ġval Ġvalid Lines Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( first , Ġsecond ) Ġ= Ġline . split (" Ġ-> Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLine ( to Point ( first ), Ġto Point ( second )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . not Diag onal () Ġ} ĊĊĠĠĠ Ġval Ġresult Points Ġ= Ġvalid Lines . flatMap Ġ{ Ġline Ġ-> Ġline . produce Points () Ġ} ĊĠĠĠ Ġval Ġgrouped By Points Ġ= Ġresult Points ĊĠĠĠĠĠĠĠ Ġ. grouping By Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ. each Count () ĊĊĠĠĠ Ġprintln ( grouped By Points . values . count Ġ{ Ġit Ġ>= Ġ 2 Ġ}) Ċ } Ċ Ċ private Ġfun Ġpart 2 () Ġ{ ĊĠĠĠ Ġval Ġvalid Lines Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( first , Ġsecond ) Ġ= Ġline . split (" Ġ-> Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLine ( to Point ( first ), Ġto Point ( second )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġresult Points Ġ= Ġvalid Lines . flatMap Ġ{ Ġline Ġ-> Ġline . produce Points () Ġ} ĊĠĠĠ Ġval Ġgrouped By Points Ġ= Ġresult Points ĊĠĠĠĠĠĠĠ Ġ. grouping By Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ. each Count () ĊĊĠĠĠ Ġprintln ( grouped By Points . values . count Ġ{ Ġit Ġ>= Ġ 2 Ġ}) Ċ } Ċ Ċ private Ġfun Ġto Point ( first : ĠString ): ĠPoint Ġ{ ĊĠĠĠ Ġval Ġ( x , Ġy ) Ġ= Ġfirst . split ("," ). map Ġ{ Ġit . toInt () Ġ} ĊĠĠĠ Ġreturn ĠPoint ( x , Ġy ) Ċ } Ċ Ċ data Ġclass ĠLine ( val Ġa : ĠPoint , Ġval Ġb : ĠPoint ) Ġ{ ĊĊĠĠĠ Ġfun Ġnot Diag onal () Ġ= Ġis Horizontal () Ġ|| Ġis Vertical () ĊĠĠĠ Ġfun Ġis Horizontal () Ġ= Ġa . x Ġ== Ġb . x ĊĠĠĠ Ġfun Ġis Vertical () Ġ= Ġa . y Ġ== Ġb . y ĊĊĠĠĠ Ġfun Ġproduce Points (): ĠList < Point > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Horizontal ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġif Ġ( a . y Ġ< Ġb . y ) Ġa . y .. b . y Ġelse Ġb . y .. a . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange . map Ġ{ ĠPoint ( a . x , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Vertical ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġif Ġ( a . x Ġ< Ġb . x ) Ġa . x .. b . x Ġelse Ġb . x .. a . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange . map Ġ{ ĠPoint ( it , Ġa . y ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġif Ġ( a . x Ġ< Ġb . x ) Ġa . x .. b . x Ġelse Ġb . x .. a . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpts Ġ= Ġrange . map Ġ{ ĠPoint ( it , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpts ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ data Ġclass ĠPoint ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ċ