package Ġio . github . to mpl um . a oc . f erry . se ating Ċ Ċ import Ġio . github . to mpl um . a oc . f erry . navigation . F erry Ċ import Ġio . github . to mpl um . libs . math . Direction Ċ import Ġio . github . to mpl um . libs . math . map . Ad vent Map 2 D Ċ import Ġio . github . to mpl um . libs . math . point . Point 2 D Ċ Ċ /** Ċ Ġ* ĠA Ġmap Ġof Ġthe Ġse ating Ġlayout Ġin Ġthe Ġwaiting Ġarea Ġof Ġthe Ġ[ F erry ]. Ċ Ġ* Ġ@ param Ġdata ĠA Ġlist Ġof Ġrows Ġof Ġse ating Ġdata . Ċ Ġ*/ Ċ class ĠSe ating Layout ( data : ĠList < String >): ĠAd vent Map 2 D < Seat >() Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdata . forEach Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . forEach Ġ{ Ġcolumn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tile ( Point 2 D ( x , Ġy ), ĠSe at ( column )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġall Ġthe Ġse ats Ġthat Ġmatching Ġthe Ġgiven Ġ[ predicate ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġpredicate ĠA Ġboolean Ġpredicate Ġfrom Ġthe Ġ[ Seat ] Ġclass . ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġlist Ġof Ġthe Ġpositions Ġof Ġse ats Ġmatching Ġthe Ġpredicate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Se ats ( predicate : Ġ( Seat ) Ġ-> ĠBoolean ): ĠList < Point 2 D > Ġ= Ġfilter Tiles Ġ{ Ġseat Ġ-> Ġpredicate ( seat ) Ġ}. keys . toList () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġall Ġthe Ġse ats Ġthat Ġare Ġadjacent Ġto Ġthe Ġgiven Ġ[ position ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġposition ĠThe Ġposition Ġof Ġthe Ġseat Ġto Ġsearch Ġaround . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġse ats Ġadjacent Ġto Ġthe Ġgiven Ġposition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Adjacent Se ating ( position : ĠPoint 2 D ): ĠList < Seat > Ġ= Ġposition . adjacent () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġpos Ġ-> Ġget Tile ( pos , ĠSe at . floor ()) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġstate Ġof Ġthe Ġse ats Ġat Ġthe Ġgiven Ġ[ positions ] Ġto Ġoccupied . ĊĠĠĠĠ Ġ* Ġ@ param Ġpositions ĠThe Ġpositions Ġof Ġthe Ġse ats Ġto Ġupdate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġocc upy ( positions : ĠList < Point 2 D >) Ġ= Ġpositions . forEach Ġ{ Ġpos Ġ-> Ġadd Tile ( pos , ĠSe at . occup ied ()) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġstate Ġof Ġthe Ġse ats Ġat Ġthe Ġgiven Ġ[ positions ] Ġto Ġempty . ĊĠĠĠĠ Ġ* Ġ@ param Ġpositions ĠThe Ġpositions Ġof Ġthe Ġse ats Ġto Ġupdate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġev ict ( positions : ĠList < Point 2 D >) Ġ= Ġpositions . forEach Ġ{ Ġpos Ġ-> Ġadd Tile ( pos , ĠSe at . empty ()) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġcopy Ġof Ġthe Ġcurrent Ġ[ Se ating Layout ]. ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġcopy Ġof Ġthe Ġlayout Ġin Ġits Ġcurrent Ġstate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsnapshot Current State (): ĠSe ating Layout Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsnapshot Ġ= ĠSe ating Layout ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġsnapshot . overwrite Data ( getData Map (). to Mutable Map ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġsnapshot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġall Ġthe Ġse ats Ġthat Ġare Ġcurrent Ġoccupied . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġnumber Ġof Ġoccupied Ġse ats . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Occup ied Seat Count (): ĠInt Ġ= Ġfilter Tiles Ġ{ Ġseat Ġ-> Ġseat . is Occup ied () Ġ}. count () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġeight Ġadjacent Ġse ats Ġthat Ġcan Ġbe Ġseen Ġfrom Ġthe Ġgiven Ġseat Ġ[ position ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠInstead Ġof Ġconsidering Ġjust Ġthe Ġeight Ġimmediately Ġadjacent Ġse ats , Ġit Ġfinds Ġthe Ġfirst Ġseat Ġin Ġeach ĊĠĠĠĠ Ġ* Ġ[ Direction ] Ġthat Ġis ĠNOT Ġfloor Ġspace . ĠThat Ġis Ġto Ġsay , Ġthe Ġfirst Ġoccupied Ġor Ġempty Ġseat Ġin Ġview . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġvision Ġreaches Ġthe Ġedge Ġof Ġthe Ġ[ Se ating Layout ] Ġwithout Ġhaving Ġfound Ġa Ġseat , Ġfloor Ġspace Ġis Ġreturned ĊĠĠĠĠ Ġ* Ġfor Ġthat Ġdirection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġposition ĠThe Ġse ating Ġposition Ġto Ġlook Ġaround Ġfrom . ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġlist Ġof Ġthe Ġfirst Ġadjacent Ġseat Ġin Ġevery Ġdirection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget First Adjacent ( position : ĠPoint 2 D ): ĠList < Seat > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDirection . values (). map Ġ{ Ġdirection Ġ-> Ġposition . getFirst Seat ( direction ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġfirst Ġoccupied Ġor Ġempty Ġse ating Ġin Ġthe Ġgiven Ġ[ direction ]. ĊĠĠĠĠ Ġ* ĠIf Ġa Ġthere Ġis Ġonly Ġfloor Ġspace Ġall Ġthe Ġway Ġto Ġthe Ġedge Ġof Ġthe Ġ[ Se ating Layout ], Ġfloor Ġis Ġreturned . ĊĠĠĠĠ Ġ* Ġ@ param Ġdirection ĠThe Ġdirection Ġto Ġlook Ġdown Ġfrom Ġthe Ġcurrent Ġposition . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġfirst Ġseat Ġseen , Ġelse Ġfloor Ġspace . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠPoint 2 D . getFirst Seat ( direction : ĠDirection ): ĠSe at Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpos Ġ= Ġthis . shift ( direction ) ĊĠĠĠĠĠĠĠ Ġvar Ġcandidate Ġ= Ġget Tile ( pos , ĠSe at . floor ()) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( candidate . is Floor ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Re corded ( pos )) Ġreturn ĠSe at . floor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ= Ġpos . shift ( direction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Ġ= Ġget Tile ( pos , ĠSe at . floor ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcandidate ĊĠĠĠ Ġ} Ċ Ċ }