/* Ċ Ġ* Ġ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 2 3 Ċ Ċ import Ġcom . ask re pp s . ad vent 2 0 2 1 . util . getInput Lines Ċ import Ġjava . io . File Ċ Ċ sealed Ġclass ĠLocation ( val Ġid : ĠInt ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġ_ distance Map Ġ= Ġmutable Map Of < Int , ĠLong >() ĊĠĠĠ Ġval Ġdistance Map : ĠMap < Int , ĠLong > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ distance Map ĊĊĠĠĠ Ġprivate Ġvar Ġ_ destination Block ers Ġ= Ġmutable Map Of < Int , ĠList < Int >>() ĊĠĠĠ Ġval Ġdestination Block ers : ĠMap < Int , ĠList < Int >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ destination Block ers ĊĊĠĠĠ Ġvar Ġneighbors Ġ= Ġempty List < Location >() ĊĊĠĠĠ Ġfun Ġgenerate Data Maps () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ distance Map . clear () ĊĠĠĠĠĠĠĠ Ġ_ destination Block ers . clear () ĊĠĠĠĠĠĠĠ Ġtake Step ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtake Step ( ĊĠĠĠĠĠĠĠ Ġcurrent Location : ĠLocation , ĊĠĠĠĠĠĠĠ Ġdistance : ĠLong Ġ= Ġ 0 L , ĊĠĠĠĠĠĠĠ Ġsteps So Far : ĠList < Location > Ġ= Ġempty List () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Steps So Far Ġ= Ġsteps So Far Ġ+ Ġcurrent Location ĊĠĠĠĠĠĠĠ Ġval Ġnext Distance Ġ= Ġdistance Ġ+ Ġ 1 L ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Location Ġ! is ĠPas sthrough Location ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ distance Map [ current Location . id ] Ġ= Ġdistance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ destination Block ers [ current Location . id ] Ġ= Ġnext Steps So Far . map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġid Ġ&& Ġit Ġ>= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( neighbor Ġin Ġcurrent Location . neighbors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( neighbor Ġ! in Ġsteps So Far ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtake Step ( neighbor , Ġnext Distance , Ġnext Steps So Far ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠHall way ( id : ĠInt ) Ġ: ĠLocation ( id ) Ċ Ċ class ĠSide Room ( id : ĠInt ) Ġ: ĠLocation ( id ) Ċ Ċ class ĠPas sthrough Location Ġ: ĠLocation (- 1 ) Ċ Ċ fun Ġcreate Part 1 Map (): ĠPair < List < Location >, ĠMap < Pod Type , ĠList < Int >>> Ġ{ ĊĠĠĠ Ġ// Ġ################################ ## ĊĠĠĠ Ġ// Ġ# 0 0 Ġ 0 1 Ġ.. Ġ 0 4 Ġ.. Ġ 0 7 Ġ.. Ġ 1 0 Ġ.. Ġ 1 3 Ġ 1 4 # ĊĠĠĠ Ġ// Ġ#### ### 0 2 #### 0 5 #### 0 8 #### 1 1 ####### ĊĠĠĠ Ġ// ĠĠĠĠĠĠ Ġ# 0 3 # Ġ Ġ# 0 6 # Ġ Ġ# 0 9 # Ġ Ġ# 1 2 # ĊĠĠĠ Ġ// ĠĠĠĠĠĠ Ġ#### Ġ Ġ#### Ġ Ġ#### Ġ Ġ#### ĊĠĠĠ Ġval Ġlocations Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 0 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 1 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 2 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 3 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 4 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 5 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 6 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 7 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 8 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 9 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 1 0 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 1 1 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 1 2 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 1 3 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 1 4 ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġpas sthrough Locations Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠPas sthrough Location (). apply Ġ{ Ġneighbors Ġ= ĠlistOf ( locations [ 1 ], Ġlocations [ 2 ], Ġlocations [ 4 ]) Ġ}, ĊĠĠĠĠĠĠĠ ĠPas sthrough Location (). apply Ġ{ Ġneighbors Ġ= ĠlistOf ( locations [ 4 ], Ġlocations [ 5 ], Ġlocations [ 7 ]) Ġ}, ĊĠĠĠĠĠĠĠ ĠPas sthrough Location (). apply Ġ{ Ġneighbors Ġ= ĠlistOf ( locations [ 7 ], Ġlocations [ 8 ], Ġlocations [ 1 0 ]) Ġ}, ĊĠĠĠĠĠĠĠ ĠPas sthrough Location (). apply Ġ{ Ġneighbors Ġ= ĠlistOf ( locations [ 1 0 ], Ġlocations [ 1 1 ], Ġlocations [ 1 3 ]) Ġ}, ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġlocations [ 0 ]. neighbors Ġ= ĠlistOf ( locations [ 1 ]) ĊĠĠĠ Ġlocations [ 1 ]. neighbors Ġ= ĠlistOf ( locations [ 0 ], Ġpas sthrough Locations [ 0 ]) ĊĠĠĠ Ġlocations [ 2 ]. neighbors Ġ= ĠlistOf ( locations [ 3 ], Ġpas sthrough Locations [ 0 ]) ĊĠĠĠ Ġlocations [ 3 ]. neighbors Ġ= ĠlistOf ( locations [ 2 ]) ĊĠĠĠ Ġlocations [ 4 ]. neighbors Ġ= ĠlistOf ( pas sthrough Locations [ 0 ], Ġpas sthrough Locations [ 1 ]) ĊĠĠĠ Ġlocations [ 5 ]. neighbors Ġ= ĠlistOf ( locations [ 6 ], Ġpas sthrough Locations [ 1 ]) ĊĠĠĠ Ġlocations [ 6 ]. neighbors Ġ= ĠlistOf ( locations [ 5 ]) ĊĠĠĠ Ġlocations [ 7 ]. neighbors Ġ= ĠlistOf ( pas sthrough Locations [ 1 ], Ġpas sthrough Locations [ 2 ]) ĊĠĠĠ Ġlocations [ 8 ]. neighbors Ġ= ĠlistOf ( locations [ 9 ], Ġpas sthrough Locations [ 2 ]) ĊĠĠĠ Ġlocations [ 9 ]. neighbors Ġ= ĠlistOf ( locations [ 8 ]) ĊĠĠĠ Ġlocations [ 1 0 ]. neighbors Ġ= ĠlistOf ( pas sthrough Locations [ 2 ], Ġpas sthrough Locations [ 3 ]) ĊĠĠĠ Ġlocations [ 1 1 ]. neighbors Ġ= ĠlistOf ( locations [ 1 2 ], Ġpas sthrough Locations [ 3 ]) ĊĠĠĠ Ġlocations [ 1 2 ]. neighbors Ġ= ĠlistOf ( locations [ 1 1 ]) ĊĠĠĠ Ġlocations [ 1 3 ]. neighbors Ġ= ĠlistOf ( locations [ 1 4 ], Ġpas sthrough Locations [ 3 ]) ĊĠĠĠ Ġlocations [ 1 4 ]. neighbors Ġ= ĠlistOf ( locations [ 1 3 ]) ĊĊĠĠĠ Ġfor Ġ( location Ġin Ġlocations ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation . generate Data Maps () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġhome s Ġmust Ġbe Ġordered Ġfrom Ġbottom Ġto Ġtop ĊĠĠĠ Ġval Ġhome sBy Type Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠPod Type . Am ber Ġto ĠlistOf ( 3 , Ġ 2 ), ĊĠĠĠĠĠĠĠ ĠPod Type . B ron ze Ġto ĠlistOf ( 6 , Ġ 5 ), ĊĠĠĠĠĠĠĠ ĠPod Type . Cop per Ġto ĠlistOf ( 9 , Ġ 8 ), ĊĠĠĠĠĠĠĠ ĠPod Type . Des ert Ġto ĠlistOf ( 1 2 , Ġ 1 1 ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn ĠPair ( locations , Ġhome sBy Type ) Ċ } Ċ Ċ fun Ġcreate Part 2 Map (): ĠPair < List < Location >, ĠMap < Pod Type , ĠList < Int >>> Ġ{ ĊĠĠĠ Ġ// Ġ################################ ## ĊĠĠĠ Ġ// Ġ# 0 0 Ġ 0 1 Ġ.. Ġ 0 4 Ġ.. Ġ 0 7 Ġ.. Ġ 1 0 Ġ.. Ġ 1 3 Ġ 1 4 # ĊĠĠĠ Ġ// Ġ#### ### 0 2 #### 0 5 #### 0 8 #### 1 1 ####### ĊĠĠĠ Ġ// ĠĠĠĠ Ġ[ Ġ# 1 5 # Ġ Ġ# 1 7 # Ġ Ġ# 1 9 # Ġ Ġ# 2 1 # Ġ] ĊĠĠĠ Ġ// ĠĠĠĠ Ġ[ Ġ# 1 6 # Ġ Ġ# 1 8 # Ġ Ġ# 2 0 # Ġ Ġ# 2 2 # Ġ] ĊĠĠĠ Ġ// ĠĠĠĠĠĠ Ġ# 0 3 # Ġ Ġ# 0 6 # Ġ Ġ# 0 9 # Ġ Ġ# 1 2 # ĊĠĠĠ Ġ// ĠĠĠĠĠĠ Ġ#### Ġ Ġ#### Ġ Ġ#### Ġ Ġ#### ĊĠĠĠ Ġval Ġlocations Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 0 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 1 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 2 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 1 5 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 1 6 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 3 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 4 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 5 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 1 7 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 1 8 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 6 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 7 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 8 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 1 9 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 2 0 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 9 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 1 0 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 1 1 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 2 1 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 2 2 ), ĊĠĠĠĠĠĠĠ ĠSide Room ( id Ġ= Ġ 1 2 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 1 3 ), ĊĠĠĠĠĠĠĠ ĠHall way ( id Ġ= Ġ 1 4 ) ĊĠĠĠ Ġ). sorted By Ġ{ Ġit . id Ġ} ĊĊĠĠĠ Ġval Ġpas sthrough Locations Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠPas sthrough Location (). apply Ġ{ Ġneighbors Ġ= ĠlistOf ( locations [ 1 ], Ġlocations [ 2 ], Ġlocations [ 4 ]) Ġ}, ĊĠĠĠĠĠĠĠ ĠPas sthrough Location (). apply Ġ{ Ġneighbors Ġ= ĠlistOf ( locations [ 4 ], Ġlocations [ 5 ], Ġlocations [ 7 ]) Ġ}, ĊĠĠĠĠĠĠĠ ĠPas sthrough Location (). apply Ġ{ Ġneighbors Ġ= ĠlistOf ( locations [ 7 ], Ġlocations [ 8 ], Ġlocations [ 1 0 ]) Ġ}, ĊĠĠĠĠĠĠĠ ĠPas sthrough Location (). apply Ġ{ Ġneighbors Ġ= ĠlistOf ( locations [ 1 0 ], Ġlocations [ 1 1 ], Ġlocations [ 1 3 ]) Ġ}, ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġlocations [ 0 ]. neighbors Ġ= ĠlistOf ( locations [ 1 ]) ĊĠĠĠ Ġlocations [ 1 ]. neighbors Ġ= ĠlistOf ( locations [ 0 ], Ġpas sthrough Locations [ 0 ]) ĊĠĠĠ Ġlocations [ 2 ]. neighbors Ġ= ĠlistOf ( locations [ 1 5 ], Ġpas sthrough Locations [ 0 ]) ĊĠĠĠ Ġlocations [ 1 5 ]. neighbors Ġ= ĠlistOf ( locations [ 2 ], Ġlocations [ 1 6 ]) ĊĠĠĠ Ġlocations [ 1 6 ]. neighbors Ġ= ĠlistOf ( locations [ 1 5 ], Ġlocations [ 3 ]) ĊĠĠĠ Ġlocations [ 3 ]. neighbors Ġ= ĠlistOf ( locations [ 1 6 ]) ĊĠĠĠ Ġlocations [ 4 ]. neighbors Ġ= ĠlistOf ( pas sthrough Locations [ 0 ], Ġpas sthrough Locations [ 1 ]) ĊĠĠĠ Ġlocations [ 5 ]. neighbors Ġ= ĠlistOf ( locations [ 1 7 ], Ġpas sthrough Locations [ 1 ]) ĊĠĠĠ Ġlocations [ 1 7 ]. neighbors Ġ= ĠlistOf ( locations [ 5 ], Ġlocations [ 1 8 ]) ĊĠĠĠ Ġlocations [ 1 8 ]. neighbors Ġ= ĠlistOf ( locations [ 1 7 ], Ġlocations [ 6 ]) ĊĠĠĠ Ġlocations [ 6 ]. neighbors Ġ= ĠlistOf ( locations [ 1 8 ]) ĊĠĠĠ Ġlocations [ 7 ]. neighbors Ġ= ĠlistOf ( pas sthrough Locations [ 1 ], Ġpas sthrough Locations [ 2 ]) ĊĠĠĠ Ġlocations [ 8 ]. neighbors Ġ= ĠlistOf ( locations [ 1 9 ], Ġpas sthrough Locations [ 2 ]) ĊĠĠĠ Ġlocations [ 1 9 ]. neighbors Ġ= ĠlistOf ( locations [ 8 ], Ġlocations [ 2 0 ]) ĊĠĠĠ Ġlocations [ 2 0 ]. neighbors Ġ= ĠlistOf ( locations [ 1 9 ], Ġlocations [ 9 ]) ĊĠĠĠ Ġlocations [ 9 ]. neighbors Ġ= ĠlistOf ( locations [ 2 0 ]) ĊĠĠĠ Ġlocations [ 1 0 ]. neighbors Ġ= ĠlistOf ( pas sthrough Locations [ 2 ], Ġpas sthrough Locations [ 3 ]) ĊĠĠĠ Ġlocations [ 1 1 ]. neighbors Ġ= ĠlistOf ( locations [ 2 1 ], Ġpas sthrough Locations [ 3 ]) ĊĠĠĠ Ġlocations [ 2 1 ]. neighbors Ġ= ĠlistOf ( locations [ 1 1 ], Ġlocations [ 2 2 ]) ĊĠĠĠ Ġlocations [ 2 2 ]. neighbors Ġ= ĠlistOf ( locations [ 2 1 ], Ġlocations [ 1 2 ]) ĊĠĠĠ Ġlocations [ 1 2 ]. neighbors Ġ= ĠlistOf ( locations [ 2 2 ]) ĊĠĠĠ Ġlocations [ 1 3 ]. neighbors Ġ= ĠlistOf ( locations [ 1 4 ], Ġpas sthrough Locations [ 3 ]) ĊĠĠĠ Ġlocations [ 1 4 ]. neighbors Ġ= ĠlistOf ( locations [ 1 3 ]) ĊĊĠĠĠ Ġfor Ġ( location Ġin Ġlocations ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation . generate Data Maps () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġhome s Ġmust Ġbe Ġordered Ġfrom Ġbottom Ġto Ġtop ĊĠĠĠ Ġval Ġhome sBy Type Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠPod Type . Am ber Ġto ĠlistOf ( 3 , Ġ 1 6 , Ġ 1 5 , Ġ 2 ), ĊĠĠĠĠĠĠĠ ĠPod Type . B ron ze Ġto ĠlistOf ( 6 , Ġ 1 8 , Ġ 1 7 , Ġ 5 ), ĊĠĠĠĠĠĠĠ ĠPod Type . Cop per Ġto ĠlistOf ( 9 , Ġ 2 0 , Ġ 1 9 , Ġ 8 ), ĊĠĠĠĠĠĠĠ ĠPod Type . Des ert Ġto ĠlistOf ( 1 2 , Ġ 2 2 , Ġ 2 1 , Ġ 1 1 ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn ĠPair ( locations , Ġhome sBy Type ) Ċ } Ċ Ċ enum Ġclass ĠPod Type ( val Ġenergy Per Move : ĠLong ) Ġ{ ĊĠĠĠ ĠAm ber ( energy Per Move Ġ= Ġ 1 L ), ĊĠĠĠ ĠB ron ze ( energy Per Move Ġ= Ġ 1 0 L ), ĊĠĠĠ ĠCop per ( energy Per Move Ġ= Ġ 1 0 0 L ), ĊĠĠĠ ĠDes ert ( energy Per Move Ġ= Ġ 1 0 0 0 L ) Ċ } Ċ Ċ data Ġclass ĠPod State ( val Ġtype : ĠPod Type , Ġval Ġlocation Id : ĠInt ) Ġ{ ĊĠĠĠ Ġfun Ġis Home ( all Pods : ĠList < Pod State >, Ġhome sBy Type : ĠMap < Pod Type , ĠList < Int >> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhome Locations Ġ= Ġhome sBy Type [ type ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" No Ġhome s Ġfound Ġfor Ġtype Ġ$ type ") ĊĠĠĠĠĠĠĠ Ġif Ġ( location Id Ġ! in Ġhome Locations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġhas Mis matched Neighbors Ġ= Ġhome Locations . any Ġ{ Ġhome Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpod Ġ= Ġall Pods . find Ġ{ Ġit . location Id Ġ== Ġhome Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpod Ġ!= Ġnull Ġ&& Ġpod . type Ġ!= Ġtype ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( has Mis matched Neighbors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠBur row State ( val Ġpods : ĠList < Pod State >) Ġ{ ĊĠĠĠ Ġfun ĠgetNext Valid States ( ĊĠĠĠĠĠĠĠ Ġlocations : ĠList < Location >, ĊĠĠĠĠĠĠĠ Ġhome sBy Type : ĠMap < Pod Type , ĠList < Int >> ĊĠĠĠ Ġ): ĠList < Pair < Bur row State , ĠLong >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext States Ġ= Ġmutable ListOf < Pair < Bur row State , ĠLong >>() ĊĊĠĠĠĠĠĠĠ Ġfun Ġcheck Destination ( pod : ĠPod State , Ġdestination Id : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pod . location Id Ġ!= Ġdestination Id Ġ&& Ġpod . can MoveTo ( destination Id , Ġlocations )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( moved Pod , ĠnewState ) Ġ= Ġcreate New State ( pod , Ġdestination Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( locations [ destination Id ] Ġis ĠSide Room Ġ&& Ġ! moved Pod . is Home ( newState . pods , Ġhome sBy Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġlocations [ pod . location Id ]. distance Map [ destination Id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" No Ġdistance Ġfrom Ġ${ pod . location Id } Ġto Ġ$ destination Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenergy Cost Ġ= Ġdistance Ġ* Ġpod . type . energy Per Move ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext States . add ( Pair ( newState , Ġenergy Cost )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( pod Ġin Ġpods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pod . is Home ( pods , Ġhome sBy Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhome Locations Ġ= Ġhome sBy Type [ pod . type ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" No Ġhome s Ġfor Ġtype Ġ${ pod . type }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġa Ġpod Ġcan Ġalways Ġmove Ġto Ġits Ġhome Ġif Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhome Available Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( home Id Ġin Ġhome Locations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Destination ( pod , Ġhome Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġconsider Ġthe Ġlowest Ġavailable Ġhome Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhome Available Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġa Ġpod Ġcan Ġonly Ġmove Ġto Ġthe Ġhall way Ġif Ġin Ġa Ġside Ġroom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! home Available Ġ&& Ġlocations [ pod . location Id ] Ġis ĠSide Room ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( location Ġin Ġlocations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location Ġis ĠHall way ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Destination ( pod , Ġlocation . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnext States ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate New State ( moving Pod : ĠPod State , Ġnew Location Id : ĠInt ): ĠPair < Pod State , ĠBur row State > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmoved State Ġ= ĠPod State ( moving Pod . type , Ġnew Location Id ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmoved State , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBur row State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpods . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġmoving Pod ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmoved State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPod State . can MoveTo ( destination Id : ĠInt , Ġlocations : ĠList < Location >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblock ers Ġ= Ġlocations [ location Id ]. destination Block ers [ destination Id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Missing Ġdestination Ġblock ers Ġfor Ġlocation Ġ$ location Id ") ĊĠĠĠĠĠĠĠ Ġreturn Ġblock ers . none Ġ{ Ġblock er Ġ-> Ġpods . any Ġ{ Ġit . location Id Ġ== Ġblock er Ġ} Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠList < String >. to InitialState (): ĠBur row State Ġ{ ĊĠĠĠ Ġval Ġpods Ġ= Ġmutable ListOf < Pod State >() ĊĊĠĠĠ Ġfun Ġadd Pod State From ( line Index : ĠInt , Ġchar Index : ĠInt , Ġlocation Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpod Ġ= Ġwhen Ġ( val Ġc Ġ= Ġget OrNull ( line Index )?. get OrNull ( char Index )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' A ' Ġ-> ĠPod State ( Pod Type . Am ber , Ġlocation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' B ' Ġ-> ĠPod State ( Pod Type . B ron ze , Ġlocation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' C ' Ġ-> ĠPod State ( Pod Type . Cop per , Ġlocation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' D ' Ġ-> ĠPod State ( Pod Type . Des ert , Ġlocation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġpod Ġdefinition : Ġ'$ c '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpods . add ( pod ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġadd Pod State From ( line Index Ġ= Ġ 2 , Ġchar Index Ġ= Ġ 3 , Ġlocation Id Ġ= Ġ 2 ) ĊĠĠĠ Ġadd Pod State From ( line Index Ġ= Ġ 3 , Ġchar Index Ġ= Ġ 1 , Ġlocation Id Ġ= Ġ 3 ) ĊĠĠĠ Ġadd Pod State From ( line Index Ġ= Ġ 2 , Ġchar Index Ġ= Ġ 5 , Ġlocation Id Ġ= Ġ 5 ) ĊĠĠĠ Ġadd Pod State From ( line Index Ġ= Ġ 3 , Ġchar Index Ġ= Ġ 3 , Ġlocation Id Ġ= Ġ 6 ) ĊĠĠĠ Ġadd Pod State From ( line Index Ġ= Ġ 2 , Ġchar Index Ġ= Ġ 7 , Ġlocation Id Ġ= Ġ 8 ) ĊĠĠĠ Ġadd Pod State From ( line Index Ġ= Ġ 3 , Ġchar Index Ġ= Ġ 5 , Ġlocation Id Ġ= Ġ 9 ) ĊĠĠĠ Ġadd Pod State From ( line Index Ġ= Ġ 2 , Ġchar Index Ġ= Ġ 9 , Ġlocation Id Ġ= Ġ 1 1 ) ĊĠĠĠ Ġadd Pod State From ( line Index Ġ= Ġ 3 , Ġchar Index Ġ= Ġ 7 , Ġlocation Id Ġ= Ġ 1 2 ) ĊĠĠĠ Ġreturn ĠBur row State ( pods ) Ċ } Ċ Ċ fun Ġfind Minimum Organization Energy ( ĊĠĠĠ Ġcurrent State : ĠBur row State , ĊĠĠĠ Ġlocations : ĠList < Location >, ĊĠĠĠ Ġhome sBy Type : ĠMap < Pod Type , ĠList < Int >>, ĊĠĠĠ Ġresults Cache : ĠMutable Map < Bur row State , ĠLong ?> Ġ= Ġmutable Map Of () Ċ ): ĠLong ? Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġresults Cache [ currentState ] Ġ?: ĊĠĠĠĠĠĠĠ Ġif Ġ( currentState . pods . all Ġ{ Ġit . is Home ( currentState . pods , Ġhome sBy Type ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 L ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State . getNext Valid States ( locations , Ġhome sBy Type ). map NotNull Ġ{ Ġ( next State , Ġenergy Cost ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Minimum Organization Energy ( next State , Ġlocations , Ġhome sBy Type , Ġresults Cache )?. let Ġ{ Ġenergy Cost Ġ+ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. min OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġresults Cache [ currentState ] Ġ= Ġresult ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun Ġget Part 1 Answer ( initialState : ĠBur row State ): ĠLong ? Ġ{ ĊĠĠĠ Ġval Ġ( locations , Ġhome sBy Type ) Ġ= Ġcreate Part 1 Map () ĊĠĠĠ Ġreturn Ġfind Minimum Organization Energy ( initialState , Ġlocations , Ġhome sBy Type ) Ċ } Ċ Ċ fun Ġget Part 2 Answer ( initialState : ĠBur row State ): ĠLong ? Ġ{ ĊĠĠĠ Ġval Ġmodified Pods Ġ= initialState . pods Ġ+ ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠPod State ( Pod Type . Des ert , Ġlocation Id Ġ= Ġ 1 5 ), ĊĠĠĠĠĠĠĠ ĠPod State ( Pod Type . Des ert , Ġlocation Id Ġ= Ġ 1 6 ), ĊĠĠĠĠĠĠĠ ĠPod State ( Pod Type . Cop per , Ġlocation Id Ġ= Ġ 1 7 ), ĊĠĠĠĠĠĠĠ ĠPod State ( Pod Type . B ron ze , Ġlocation Id Ġ= Ġ 1 8 ), ĊĠĠĠĠĠĠĠ ĠPod State ( Pod Type . B ron ze , Ġlocation Id Ġ= Ġ 1 9 ), ĊĠĠĠĠĠĠĠ ĠPod State ( Pod Type . Am ber , Ġlocation Id Ġ= Ġ 2 0 ), ĊĠĠĠĠĠĠĠ ĠPod State ( Pod Type . Am ber , Ġlocation Id Ġ= Ġ 2 1 ), ĊĠĠĠĠĠĠĠ ĠPod State ( Pod Type . Cop per , Ġlocation Id Ġ= Ġ 2 2 ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġmodified State Ġ= ĠBur row State ( modified Pods ) ĊĠĠĠ Ġval Ġ( locations , Ġhome sBy Type ) Ġ= Ġcreate Part 2 Map () ĊĠĠĠ Ġreturn Ġfind Minimum Organization Energy ( modified State , Ġlocations , Ġhome sBy Type ) Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval ĠinitialState Ġ= ĠFile (" src / main / resources / day 2 3 . txt ") ĊĠĠĠĠĠĠĠ Ġ. getInput Lines (). to InitialState () ĊĊĠĠĠ Ġprintln (" The Ġanswer Ġto Ġpart Ġ 1 Ġis Ġ${ get Part 1 Answer ( initialState )} ") ĊĠĠĠ Ġprintln (" The Ġanswer Ġto Ġpart Ġ 2 Ġis Ġ${ get Part 2 Answer ( initialState )} ") Ċ } Ċ