package Ġday 5 Ċ Ċ import Ġutils . Line Ċ import Ġutils . Point Ċ import Ġutils . Matrix Ċ import Ġutils . points In Line Ċ import Ġutils . read ĊĊ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġsolve () ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġprintln ( it ) Ġ} Ċ } Ċ Ċ fun Ġsolve (): ĠList < Int > Ġ{ ĊĠĠĠ Ġval Ġlines Ġ= Ġread ("./ src / main / resources / day 5 Input . txt ") ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . split (" Ġ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf irs Coord Ġ= Ġline [ 0 ]. split (",") Ġ// Ġ[' 5 ',' 6 '] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Coord Ġ= Ġline [ 2 ]. split (",") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( f irs Coord [ 0 ]. to Long (), Ġf irs Coord [ 1 ]. to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( second Coord [ 0 ]. to Long (), Ġsecond Coord [ 1 ]. to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġonly Str aight Lines Ġ= Ġlines ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . start . x Ġ== Ġit . end . x Ġ|| Ġit . start . y Ġ== Ġit . end . y Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġpoints In Line ( it ) Ġ} ĊĊĠĠĠ Ġval Ġalso Diag onal Lines Ġ= Ġlines ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġpoints In Line ( it ) Ġ} ĊĊĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġcount Cross ing ( only Str aight Lines ), ĊĠĠĠĠĠĠĠ Ġcount Cross ing ( also Diag onal Lines )) Ċ } Ċ Ċ private Ġfun Ġcount Cross ing ( all Points In Lines : ĠList < Point >): ĠInt Ġ{ ĊĠĠĠ Ġval Ġsea Floor Ġ= ĠMatrix ( 1 0 0 0 , Ġ 1 0 0 0 ) Ġ{ Ġx , Ġy Ġ-> Ġ 0 Ġ} ĊĠĠĠ Ġall Points In Lines . forEach Ġ{ Ġpoint Ġ-> ĊĠĠĠĠĠĠĠ Ġsea Floor . replace ( point . x . toInt (), Ġpoint . y . toInt ()) Ġ{ Ġentry Ġ-> Ġentry . value Ġ+ Ġ 1 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsea Floor . findAll Ġ{ Ġit . value Ġ>= Ġ 2 Ġ}. count () Ċ } ĊĊ