package Ġdays Ċ Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . atan 2 Ċ Ċ class ĠDay 1 0 Ġ: ĠDay ( 1 0 ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġgrid Ġ= ĠA ster oid Grid ( input List ) ĊĊĠĠĠ Ġoverride Ġfun Ġpart One (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbest Location Ġ= Ġgrid . best Location For Monitoring () ĊĠĠĠĠĠĠĠ Ġval Ġnumber Detect able Ġ= Ġgrid . number Can Detect ( best Location . first , Ġbest Location . second ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Best Ġis Ġ$ best Location Ġwith Ġ$ number Detect able Ġother Ġaster oids Ġdetected " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpart Two (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv apor ized 2 0 0 th Ġ= Ġgrid . v apor ized N th ( 2 0 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ( v apor ized 2 0 0 th . first Ġ* Ġ 1 0 0 ) Ġ+ Ġv apor ized 2 0 0 th . second ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠA ster oid Grid ( private Ġval Ġrows : ĠList < String >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġget ( x : ĠInt , Ġy : ĠInt ): ĠChar Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrows [ y ][ x ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġnumber Can Detect ( x : ĠInt , Ġy : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangles Ġ= Ġall A ster oids (). filter Ġ{ Ġit Ġ!= Ġx Ġto Ġy Ġ}. map Ġ{ Ġaster oid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta X Ġ= Ġaster oid . first . toDouble () Ġ- Ġx . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Y Ġ= Ġaster oid . second . toDouble () Ġ- Ġy . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatan 2 ( delta Y , Ġdelta X ) Ġ* Ġ 1 8 0 Ġ/ ĠMath . PI ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġangles . toSet (). size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġall A ster oids (): ĠList < Pair < Int , ĠInt >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( 0 .. rows . last Index ). flatMap Ġ{ Ġy Ġ-> Ġ( 0 .. rows [ 0 ]. last Index ). map Ġ{ Ġx Ġ-> Ġif Ġ( is A ster oid ( x , Ġy )) Ġx Ġto Ġy Ġelse Ġnull Ġ} Ġ}. filter NotNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbest Location For Monitoring (): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġall A ster oids (). max By Ġ{ Ġnumber Can Detect ( it . first , Ġit . second ) Ġ} Ġ?: Ġ 0 Ġto Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġv apor ized N th ( n : ĠInt ): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġbest Location For Monitoring () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaster oid sTo Angles Ġ= Ġall A ster oids (). filter Ġ{ Ġit Ġ!= Ġlocation Ġ}. map Ġ{ Ġaster oid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta X Ġ= Ġaster oid . first . toDouble () Ġ- Ġlocation . first . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Y Ġ= Ġaster oid . second . toDouble () Ġ- Ġlocation . second . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle Ġ= Ġ( Ġatan 2 ( delta Y , Ġdelta X ) Ġ* Ġ 1 8 0 Ġ/ ĠMath . PI Ġ) Ġ+ Ġ 9 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaster oid Ġto Ġif Ġ( angle Ġ< Ġ 0 ) Ġangle Ġ+ Ġ 3 6 0 Ġelse Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. sorted By Descending Ġ{ Ġit . second Ġ}. reversed () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo Ġclean Ġup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaa Ġ= Ġaster oid sTo Angles ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdestroyed Ġ= Ġmutable ListOf < Pair < Int , ĠInt >>() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( destroy ed . size Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( remaining , Ġgone ) Ġ= Ġdo Rotation ( aa , Ġlocation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroyed . addAll ( g one . map Ġ{ Ġit . first Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaa Ġ= Ġremaining ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdestroyed [ n Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġtodo Ġclean Ġup ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdo Rotation ( aster oid sTo Angles : ĠList < Pair < Pair < Int , ĠInt >, ĠDouble >>, Ġlocation : ĠPair < Int , ĠInt >): ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair < ĠList < Pair < Pair < Int , ĠInt >, ĠDouble >>, ĠList < Pair < Pair < Int , ĠInt >, ĠDouble >> Ġ> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpass Ġ= Ġaster oid sTo Angles . filter Ġ{ Ġa 2 a Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall With Same Angle Ġ= Ġaster oid sTo Angles . filter Ġ{ Ġit . second Ġ== Ġa 2 a . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( all With Same Angle . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġdistance ( location , Ġa 2 a . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Ġ== Ġall With Same Angle . map Ġ{ Ġdistance ( location , Ġit . first ) Ġ}. min () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaster oid sTo Angles . filter Ġ{ Ġa 2 a Ġ-> Ġpass . find Ġ{ Ġit . first Ġ== Ġa 2 a . first Ġ} Ġ== Ġnull Ġ} Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaster oid sTo Angles . filter Ġ{ Ġa 2 a Ġ-> Ġpass . find Ġ{ Ġit . first Ġ== Ġa 2 a . first Ġ} Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis A ster oid ( x : ĠInt , Ġy : ĠInt ): ĠBoolean Ġ= Ġget ( x , Ġy ) Ġ== Ġ'#' ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġdistance ( a 1 : ĠPair < Int , ĠInt >, Ġa 2 : ĠPair < Int , ĠInt >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġabs ( a 2 . second Ġ- Ġa 1 . second ) Ġ+ Ġabs ( a 2 . first Ġ- Ġa 1 . first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ