/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠAndrew ĠK re pp s Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . ask re pp s . ad vent 2 0 2 1 . day 0 5 Ċ Ċ import Ġcom . ask re pp s . ad vent 2 0 2 1 . util . getInput Lines Ċ import Ġjava . io . File Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ Ċ data Ġclass ĠGraph Coordinates ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ċ Ċ enum Ġclass ĠOrientation Ġ{ ĠHorizontal , ĠVertical , ĠDiag onal Ġ} Ċ Ċ data Ġclass ĠV ent Line ( val Ġstart : ĠGraph Coordinates , Ġval Ġend : ĠGraph Coordinates ) Ġ{ ĊĠĠĠ Ġval Ġorientation : ĠOrientation ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart . x Ġ== Ġend . x Ġ-> ĠOrientation . Vertical ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart . y Ġ== Ġend . y Ġ-> ĠOrientation . Horizontal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠOrientation . Diag onal ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpoints : ĠList < Graph Coordinates > Ġby Ġlazy Ġ{ Ġgenerate Points () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Points (): ĠList < Graph Coordinates > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Distance Ġ= Ġabs ( start . x Ġ- Ġend . x ) ĊĠĠĠĠĠĠĠ Ġval Ġy Distance Ġ= Ġabs ( start . y Ġ- Ġend . y ) ĊĠĠĠĠĠĠĠ Ġcheck Ġ( x Distance Ġ== Ġ 0 Ġ|| Ġy Distance Ġ== Ġ 0 Ġ|| Ġx Distance Ġ== Ġy Distance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Vent Ġlines Ġmust Ġbe Ġhorizontal , Ġvertical , Ġor Ġdiagonal Ġat Ġ 4 5 Ġdegrees " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġmax ( x Distance , Ġy Distance ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġdelta X Ġ= ĠgetS lope ( start . x , Ġend . x ) ĊĠĠĠĠĠĠĠ Ġval Ġdelta Y Ġ= ĠgetS lope ( start . y , Ġend . y ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( 0 Ġuntil Ġlength ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGraph Coordinates ( start . x Ġ+ Ġit * delta X , Ġstart . y Ġ+ Ġit * delta Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetS lope ( start Value : ĠInt , Ġend Value : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Value Ġ< Ġend Value Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Value Ġ> Ġend Value Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠString . to Coordinates () Ġ= ĊĠĠĠ Ġsplit ("," ). let Ġ{ Ġ( x , Ġy ) Ġ-> ĠGraph Coordinates ( x . toInt (), Ġy . toInt ()) Ġ} Ċ Ċ fun ĠString . to Vent Line () Ġ= ĊĠĠĠ Ġsplit (" Ġ-> Ġ"). let Ġ{ Ġ( start , Ġend ) Ġ-> ĠV ent Line ( start . to Coordinates (), Ġend . to Coordinates ()) Ġ} Ċ Ċ fun ĠList < Vent Line >. count Over lapping Points ( include Di agon als : ĠBoolean ) Ġ= ĊĠĠĠ Ġfilter Ġ{ Ġinclude Di agon als Ġ|| Ġit . orientation Ġ!= ĠOrientation . Diag onal Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . points Ġ} ĊĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ. count Ġ{ Ġ(_, Ġoverlapping Points ) Ġ-> Ġoverlapping Points . size Ġ>= Ġ 2 Ġ} Ċ Ċ fun Ġget Part 1 Answer ( vent Lines : ĠList < Vent Line >) Ġ= ĊĠĠĠ Ġvent Lines . count Over lapping Points ( include Di agon als Ġ= Ġfalse ) Ċ Ċ fun Ġget Part 2 Answer ( vent Lines : ĠList < Vent Line >) Ġ= ĊĠĠĠ Ġvent Lines . count Over lapping Points ( include Di agon als Ġ= Ġtrue ) Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġvent Lines Ġ= ĠFile (" src / main / resources / day 0 5 . txt ") ĊĠĠĠĠĠĠĠ Ġ. getInput Lines (). map Ġ{ Ġit . to Vent Line () Ġ} ĊĊĠĠĠ Ġprintln (" The Ġanswer Ġto Ġpart Ġ 1 Ġis Ġ${ get Part 1 Answer ( vent Lines )} ") ĊĠĠĠ Ġprintln (" The Ġanswer Ġto Ġpart Ġ 2 Ġis Ġ${ get Part 2 Answer ( vent Lines )} ") Ċ } Ċ