/* Ċ Ġ* Ġ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 1 9 Ċ Ċ import Ġcom . ask re pp s . ad vent 2 0 2 1 . util . getInput Lines Ċ import Ġjava . io . File Ċ import Ġkotlin . math . abs Ċ Ċ type alias ĠRotation Ġ= Ġ( Graph Coordinates ) Ġ-> ĠGraph Coordinates Ċ Ċ private Ġconst Ġval ĠOVER LAP _ THRESHOLD Ġ= Ġ 1 2 Ċ Ċ private Ġval ĠME AS UREMENT _ ROT ATIONS Ġ= ĠlistOf < Rotation >( ĊĠĠĠ Ġ// Ġscanner Ġ+ z Ġis Ġfacing Ġworld Ġ+ z ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġx , Ġ Ġy , Ġ Ġz ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġy , Ġ- x , Ġ Ġz ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- x , Ġ- y , Ġ Ġz ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- y , Ġ Ġx , Ġ Ġz ) Ġ}, ĊĊĠĠĠ Ġ// Ġscanner Ġ+ z Ġis Ġfacing Ġworld Ġ- z ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġx , Ġ- y , Ġ- z ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġy , Ġ Ġx , Ġ- z ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- x , Ġ Ġy , Ġ- z ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- y , Ġ- x , Ġ- z ) Ġ}, ĊĊĠĠĠ Ġ// Ġscanner Ġ+ z Ġis Ġfacing Ġworld Ġ+ x ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġy , Ġ Ġz , Ġ Ġx ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- z , Ġ Ġy , Ġ Ġx ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- y , Ġ- z , Ġ Ġx ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġz , Ġ- y , Ġ Ġx ) Ġ}, ĊĊĠĠĠ Ġ// Ġscanner Ġ+ z Ġis Ġfacing Ġworld Ġ- x ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġy , Ġ- z , Ġ- x ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- z , Ġ- y , Ġ- x ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- y , Ġ Ġz , Ġ- x ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġz , Ġ Ġy , Ġ- x ) Ġ}, ĊĊĠĠĠ Ġ// Ġscanner Ġ+ z Ġis Ġfacing Ġworld Ġ+ y ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġx , Ġ- z , Ġ Ġy ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- z , Ġ- x , Ġ Ġy ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- x , Ġ Ġz , Ġ Ġy ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġz , Ġ Ġx , Ġ Ġy ) Ġ}, ĊĊĠĠĠ Ġ// Ġscanner Ġ+ z Ġis Ġfacing Ġworld Ġ- y ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġx , Ġ Ġz , Ġ- y ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- z , Ġ Ġx , Ġ- y ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates (- x , Ġ- z , Ġ- y ) Ġ}, ĊĠĠĠ Ġ{ Ġ( x , Ġy , Ġz ) Ġ-> ĠGraph Coordinates ( Ġz , Ġ- x , Ġ- y ) Ġ} Ċ ) Ċ Ċ data Ġclass ĠGraph Coordinates ( val Ġx : ĠInt , Ġval Ġy : ĠInt , Ġval Ġz : ĠInt ) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠGraph Coordinates ) Ġ= ĊĠĠĠĠĠĠĠ ĠGraph Coordinates ( x Ġ+ Ġother . x , Ġy Ġ+ Ġother . y , Ġz Ġ+ Ġother . z ) ĊĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠGraph Coordinates ) Ġ= ĊĠĠĠĠĠĠĠ ĠGraph Coordinates ( x Ġ- Ġother . x , Ġy Ġ- Ġother . y , Ġz Ġ- Ġother . z ) ĊĊĠĠĠ Ġfun Ġman h att an Distance To ( other : ĠGraph Coordinates ) Ġ= ĊĠĠĠĠĠĠĠ Ġabs ( x Ġ- Ġother . x ) Ġ+ Ġabs ( y Ġ- Ġother . y ) Ġ+ Ġabs ( z Ġ- Ġother . z ) Ċ } Ċ Ċ data Ġclass ĠScanner Report ( val Ġid : ĠInt , Ġval Ġbe acon Measure ments : ĠSet < Graph Coordinates >) Ċ Ċ data Ġclass ĠScanner State ( ĊĠĠĠ Ġval Ġposition : ĠGraph Coordinates , ĊĠĠĠ Ġval Ġrotation : ĠRotation , ĊĠĠĠ Ġval Ġtransformed Measure ments : ĠSet < Graph Coordinates > Ċ ) Ċ Ċ fun ĠList < String >. to Scanner Reports (): ĠMap < Int , ĠScanner Report > Ġ{ ĊĠĠĠ Ġval Ġreports Ġ= Ġmutable Map Of < Int , ĠScanner Report >() ĊĠĠĠ Ġvar Ġid : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġval Ġmeasurements Ġ= Ġmutable Set Of < Graph Coordinates >() ĊĠĠĠ Ġfor Ġ( line Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( line . startsWith (" --- ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( measure ments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreports [ id ] Ġ= ĠScanner Report ( id , Ġmeasurements . toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasurements . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġline . substring ( line . indexOf First Ġ{ Ġit . is Digit () Ġ}, Ġline . indexOf Last Ġ{ Ġit . is Whitespace () Ġ}). toInt () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( x , Ġy , Ġz ) Ġ= Ġline . split ("," ). map Ġ{ Ġit . toInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeasurements . add ( Graph Coordinates ( x , Ġy , Ġz )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreports [ id ] Ġ= ĠScanner Report ( id , Ġmeasurements . toSet ()) ĊĠĠĠ Ġreturn Ġreports Ċ } Ċ Ċ fun Ġcheck Overlap ( ĊĠĠĠ Ġbase Scanner State : ĠScanner State , ĊĠĠĠ Ġnew Scanner : ĠScanner Report , ĊĠĠĠ Ġrotation Cache : ĠMutable Map < Pair < Int , ĠRotation >, ĠSet < Graph Coordinates >> Ċ ): ĠScanner State ? Ġ{ ĊĠĠĠ Ġval Ġbase Measure ments Ġ= Ġbase Scanner State . transformed Measure ments ĊĠĠĠ Ġfor Ġ( rotation Ġin ĠME AS UREMENT _ ROT ATIONS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrotated Measure ments Ġ= Ġrotation Cache . compute If Absent ( Pair ( new Scanner . id , Ġrotation )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Scanner . beacon Measure ments . map ( rotation ). toSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( new Measurement Ġin Ġrotated Measure ments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( base Measurement Ġin Ġbase Measure ments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġbase Measurement Ġ- Ġnew Measurement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransformed Measure ments Ġ= Ġrotated Measure ments . map Ġ{ Ġit Ġ+ Ġposition Ġ}. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoverlap Ġ= Ġbase Measure ments . intersect ( transformed Measure ments ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( overlap . size Ġ>= ĠOVER LAP _ THRESHOLD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠScanner State ( position , Ġrotation , Ġtransformed Measure ments ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ fun Ġfind Scanner States ( scanner Reports : ĠMap < Int , ĠScanner Report >): ĠMap < Int , ĠScanner State > Ġ{ ĊĠĠĠ Ġval Ġstate 0 Ġ= ĠScanner State ( ĊĠĠĠĠĠĠĠ ĠGraph Coordinates ( 0 , Ġ 0 , Ġ 0 ), ĊĠĠĠĠĠĠĠ ĠME AS UREMENT _ ROT ATIONS [ 0 ], ĊĠĠĠĠĠĠĠ Ġscanner Reports [ 0 ]?. beacon Measure ments . or Empty () ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġscanner States Ġ= Ġmutable Map Of ( 0 Ġto Ġstate 0 ) ĊĠĠĠ Ġval Ġsc anners To Match Ġ= Ġscanner Reports . keys . associate With Ġ{ Ġs 1 Ġ-> ĊĠĠĠĠĠĠĠ Ġscanner Reports . keys . filter Ġ{ Ġs 2 Ġ-> Ġs 1 Ġ!= Ġs 2 Ġ}. to Mutable List () ĊĠĠĠ Ġ}. to Mutable Map () ĊĠĠĠ Ġsc anners To Match . remove ( 0 ) ĊĠĠĠ Ġval Ġrotation Cache Ġ= Ġmutable Map Of < Pair < Int , ĠRotation >, ĠSet < Graph Coordinates >>() ĊĠĠĠ Ġwhile Ġ( sc anners To Match . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( new Id , Ġnew Scanner ) Ġin Ġscanner Reports ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Id Ġ! in Ġsc anners To Match . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sc anners To Match [ new Id ]. isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Could Ġnot Ġdetermine Ġstate Ġof Ġscanner Ġ$ new Id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( base Scanner Id , Ġbase Scanner State ) Ġin Ġscanner States ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( base Scanner Id Ġ! in Ġsc anners To Match [ new Id ]. or Empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= Ġcheck Overlap ( base Scanner State , Ġnew Scanner , Ġrotation Cache ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner States [ new Id ] Ġ= ĠnewState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsc anners To Match . remove ( new Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsc anners To Match [ new Id ]?. remove ( base Scanner Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġscanner States Ċ } Ċ Ċ fun Ġget Part 1 Answer ( scanner States : ĠMap < Int , ĠScanner State >) Ġ= ĊĠĠĠ Ġscanner States . values . flatMap Ġ{ Ġstate Ġ-> Ġstate . transformed Measure ments Ġ}. toSet (). size Ċ Ċ fun Ġget Part 2 Answer ( scanner States : ĠMap < Int , ĠScanner State >): ĠInt Ġ= ĊĠĠĠ Ġscanner States . max Of Ġ{ Ġ( id 1 , Ġstate 1 ) Ġ-> ĊĠĠĠĠĠĠĠ Ġscanner States . max Of Ġ{ Ġ( id 2 , Ġstate 2 ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id 1 Ġ== Ġid 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt . MIN _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate 1 . position . man h att an Distance To ( state 2 . position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġscanner Reports Ġ= ĠFile (" src / main / resources / day 1 9 . txt ") ĊĠĠĠĠĠĠĠ Ġ. getInput Lines (). to Scanner Reports () ĊĠĠĠ Ġval Ġscanner States Ġ= Ġfind Scanner States ( scanner Reports ) ĊĊĠĠĠ Ġprintln (" The Ġanswer Ġto Ġpart Ġ 1 Ġis Ġ${ get Part 1 Answer ( scanner States )} ") ĊĠĠĠ Ġprintln (" The Ġanswer Ġto Ġpart Ġ 2 Ġis Ġ${ get Part 2 Answer ( scanner States )} ") Ċ } Ċ