package Ġworld s . greg s . hest ia . core . world . map . logic Ċ Ċ import Ġjava . util . function . Bi Predicate Ċ Ċ object ĠSp iral Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġout ward Ġrectangle Ġareas ĊĠĠĠĠ Ġ* Ġ@ param Ġx ĠThe Ġpoints Ġbottom Ġleft Ġx Ġposition ĊĠĠĠĠ Ġ* Ġ@ param Ġy ĠThe Ġpoints Ġbottom Ġleft Ġy Ġposition ĊĠĠĠĠ Ġ* Ġ@ param Ġpoint Width ĠThe Ġwidth Ġof Ġthe Ġpoint ĊĠĠĠĠ Ġ* Ġ@ param Ġpoint Height ĠThe Ġheight Ġof Ġthe Ġpoint ĊĠĠĠĠ Ġ* Ġ@ param Ġradius ĠThe Ġradius Ġto Ġsp iral ĊĠĠĠĠ Ġ* Ġ@ param Ġpredicate ĠThe Ġdelta Ġcoordinates , Ġreturn Ġfalse Ġto Ġstop Ġearly ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠ Ġfun Ġout wards Rect ( x : ĠInt , Ġy : ĠInt , Ġpoint Width : ĠInt , Ġpoint Height : ĠInt , Ġx Bounds : ĠInt Range , Ġy Bounds : ĠInt Range , Ġradius : ĠInt , Ġpredicate : ĠBi Predicate < Int , ĠInt >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġvar Ġdirection Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġsteps Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ// Loop Ġuntil Ġwe 've Ġcovered Ġevery Ġpoint Ġin Ġthe Ġgrid ĊĠĠĠĠĠĠĠ Ġval Ġarea Ġ= Ġ( point Width Ġ+ Ġradius Ġ* Ġ 2 ) Ġ* Ġ( point Height Ġ+ Ġradius Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( count Ġ< Ġarea ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Repe ats Ġeach Ġstep Ġtwice Ġe . g . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// 1 , Ġ 1 , Ġ 2 , Ġ 2 , Ġ 3 , Ġ 3 , Ġ 4 , Ġ 4 , Ġ 5 , Ġ 5 ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( steps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġin Ġbounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġin Ġx Bounds Ġ&& Ġy Ġin Ġy Bounds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Apply Ġpredicate Ġ( stop Ġif Ġreached Ġmax ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! predicate . test ( x , Ġy ) Ġ|| Ġcount Ġ>= Ġarea ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Move Ġone Ġstep Ġin Ġthe Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġy -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġx -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġy ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġx ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Turn Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġ( direction Ġ+ Ġ 1 ) Ġ% Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsteps ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoop Ġcoordinates Ġfor Ġeach Ġpoint Ġexpand ing Ġcounter Ġclock wise Ġin Ġa Ġsp iral ĊĠĠĠĠ Ġ* ĠOrder Ġe . g . ĊĠĠĠĠ Ġ* Ġ[ 2 ][ 3 ][ 4 ] ĊĠĠĠĠ Ġ* Ġ[ 1 ][ 0 ][ 5 ] ĊĠĠĠĠ Ġ* Ġ[ 8 ][ 7 ][ 6 ] ĊĠĠĠĠ Ġ* Ġ@ param Ġx ĠThe Ġpoints Ġbottom Ġleft Ġx Ġposition ĊĠĠĠĠ Ġ* Ġ@ param Ġy ĠThe Ġpoints Ġbottom Ġleft Ġy Ġposition ĊĠĠĠĠ Ġ* Ġ@ param Ġpoint Width ĠThe Ġwidth Ġof Ġthe Ġpoint ĊĠĠĠĠ Ġ* Ġ@ param Ġpoint Height ĠThe Ġheight Ġof Ġthe Ġpoint ĊĠĠĠĠ Ġ* Ġ@ param Ġradius ĠThe Ġradius Ġto Ġsp iral ĊĠĠĠĠ Ġ* Ġ@ param Ġpredicate ĠThe Ġdelta Ġcoordinates , Ġreturn Ġfalse Ġto Ġstop Ġearly ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġout wards ( x : ĠInt , Ġy : ĠInt , Ġpoint Width : ĠInt , Ġpoint Height : ĠInt , Ġradius : ĠInt , Ġpredicate : ĠBi Predicate < Int , ĠInt >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( point Width Ġ!= Ġpoint Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout wards Rect ( x , Ġy , Ġpoint Width , Ġpoint Height , Ġx Ġ- Ġradius Ġuntil Ġx Ġ+ Ġpoint Width Ġ+ Ġradius , Ġy Ġ- Ġradius Ġuntil Ġy Ġ+ Ġpoint Height Ġ+ Ġradius , Ġradius , Ġpredicate ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout wards Square ( x , Ġy , Ġpoint Width , Ġpoint Height , Ġradius , Ġpredicate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġonly Ġsquare Ġareas ĊĠĠĠĠ Ġ* Ġ@ param Ġx ĠThe Ġpoints Ġbottom Ġleft Ġx Ġposition ĊĠĠĠĠ Ġ* Ġ@ param Ġy ĠThe Ġpoints Ġbottom Ġleft Ġy Ġposition ĊĠĠĠĠ Ġ* Ġ@ param Ġpoint Width ĠThe Ġwidth Ġof Ġthe Ġpoint ĊĠĠĠĠ Ġ* Ġ@ param Ġpoint Height ĠThe Ġheight Ġof Ġthe Ġpoint ĊĠĠĠĠ Ġ* Ġ@ param Ġradius ĠThe Ġradius Ġto Ġsp iral ĊĠĠĠĠ Ġ* Ġ@ param Ġpredicate ĠThe Ġdelta Ġcoordinates , Ġreturn Ġfalse Ġto Ġstop Ġearly ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠ Ġprivate Ġfun Ġout wards Square ( x : ĠInt , Ġy : ĠInt , Ġpoint Width : ĠInt , Ġpoint Height : ĠInt , Ġradius : ĠInt , Ġpredicate : ĠBi Predicate < Int , ĠInt >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġvar Ġdirection Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġsteps Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ// Loop Ġuntil Ġwe 've Ġcovered Ġevery Ġpoint Ġin Ġthe Ġgrid ĊĠĠĠĠĠĠĠ Ġval Ġarea Ġ= Ġ( point Width Ġ+ Ġradius Ġ* Ġ 2 ) Ġ* Ġ( point Height Ġ+ Ġradius Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( count Ġ< Ġarea ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Repe ats Ġeach Ġstep Ġtwice Ġe . g . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// 1 , Ġ 1 , Ġ 2 , Ġ 2 , Ġ 3 , Ġ 3 , Ġ 4 , Ġ 4 , Ġ 5 , Ġ 5 ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( steps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġin Ġbounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Apply Ġpredicate Ġ( stop Ġif Ġreached Ġmax ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! predicate . test ( x , Ġy ) Ġ|| Ġcount Ġ>= Ġarea ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Move Ġone Ġstep Ġin Ġthe Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġy -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġx -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġy ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġx ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Turn Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġ( direction Ġ+ Ġ 1 ) Ġ% Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsteps ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoop Ġcoordinates Ġfor Ġeach Ġpoint Ġof Ġa Ġsp iral Ġfrom Ġoutside Ġin ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget X ĠThe Ġfinish Ġx Ġcoordinate ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget Y ĠThe Ġfinish Ġy Ġcoordinate ĊĠĠĠĠ Ġ* Ġ@ param Ġradius ĠThe Ġradius Ġof Ġthe Ġsp iral Ġaround Ġthe Ġtarget ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġin wards ( target X : ĠInt , Ġtarget Y : ĠInt , Ġradius : ĠInt , Ġpredicate : ĠBi Predicate < Int , ĠInt >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġ 1 Ġ+ Ġradius Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġmin Col Ġ= Ġtarget Y Ġ- Ġradius ĊĠĠĠĠĠĠĠ Ġvar Ġmax Col Ġ= Ġtarget Y Ġ+ Ġradius ĊĠĠĠĠĠĠĠ Ġvar Ġmin Row Ġ= Ġtarget X Ġ- Ġradius ĊĠĠĠĠĠĠĠ Ġvar Ġmax Row Ġ= Ġtarget X Ġ+ Ġradius ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( value Ġ<= Ġsize Ġ* Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġmin Row .. max Row ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! predicate . test ( i , Ġmin Col )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġmin Col Ġ+ Ġ 1 .. max Col ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! predicate . test ( max Row , Ġi )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġmax Row Ġ- Ġ 1 Ġdown To Ġmin Row ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! predicate . test ( i , Ġmax Col )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġmax Col Ġ- Ġ 1 Ġdown To Ġmin Col Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! predicate . test ( min Row , Ġi )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Col ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Row ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Col -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Row -- ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠHashMap < Int , ĠArray < Pair < Int , ĠInt >> >() ĊĊĠĠĠ Ġfun Ġsp iral ( radius : ĠInt ): ĠArray < Pair < Int , ĠInt >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcache . get Or Put ( radius ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < Pair < Int , ĠInt >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout wards ( 0 , Ġ 0 , Ġ 1 , Ġ 1 , Ġradius , ĠBi Predicate Ġ{ Ġx , Ġy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Pair ( x , Ġy )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }