package Ġcom . github . danger ground . a oc 2 0 2 0 Ċ Ċ import Ġcom . github . danger ground . a oc 2 0 2 0 . util . Day Input Ċ import Ġcom . github . danger ground . a oc 2 0 2 0 . util . World Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġprocess Ġ= ĠDay 2 0 ( Day Input . batches Of String List ( 2 0 )) ĊĊĠĠĠ Ġprintln (" result Ġpart Ġ 1 : Ġ${ process . part 1 () }") ĊĠĠĠ Ġprintln (" result Ġpart Ġ 2 : Ġ${ process . part 2 () }") Ċ } Ċ Ċ class ĠDay 2 0 ( val Ġinput : ĠList < List < String >>) Ġ{ ĊĊĠĠĠ Ġval Ġtiles Ġ= Ġinput . map Ġ{ Ġtile Num ( it [ 0 ]) Ġto ĠWorld ( it . drop ( 1 ). to Mutable List ()) Ġ}. toMap () ĊĊĠĠĠ Ġval Ġtile Ne ighbours Ġ= Ġtiles . map Ġ{ Ġit . key Ġto Ġ 0 Ġ}. toMap (). to Mutable Map () ĊĠĠĠ Ġval Ġoptions Ġ= Ġtiles . map Values Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . rotate Left (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . rotate Left (). rotate Left (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . rotate Left (). rotate Left (). rotate Left (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . flip (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . rotate Left (). flip (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . rotate Left (). rotate Left (). flip (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . rotate Left (). rotate Left (). flip (). rotate Left (). flip () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrelations Ġ= Ġtiles . map Values Ġ{ ĠInformation () Ġ} ĊĊĠĠĠ Ġ// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ# ĊĠĠĠ Ġ// # ĠĠĠ Ġ## ĠĠĠ Ġ## ĠĠĠ Ġ### ĊĠĠĠ Ġ// Ġ# Ġ Ġ# Ġ Ġ# Ġ Ġ# Ġ Ġ# Ġ Ġ# ĊĠĠĠ Ġval Ġse amon ster Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠPair ( 0 , Ġ 1 9 ), ĊĠĠĠĠĠĠĠ ĠPair ( 1 , Ġ 0 ), ĠPair ( 1 , Ġ 5 ), ĠPair ( 1 , Ġ 6 ), ĠPair ( 1 , Ġ 1 1 ), ĠPair ( 1 , Ġ 1 2 ), ĠPair ( 1 , Ġ 1 7 ), ĠPair ( 1 , Ġ 1 8 ), ĠPair ( 1 , Ġ 1 9 ), ĊĠĠĠĠĠĠĠ ĠPair ( 2 , Ġ 1 ), ĠPair ( 2 , Ġ 4 ), ĠPair ( 2 , Ġ 7 ), ĠPair ( 2 , Ġ 1 0 ), ĠPair ( 2 , Ġ 1 3 ), ĠPair ( 2 , Ġ 1 6 ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġtile Num ( txt : ĠString ) Ġ= Ġtxt . replace ("[ ^ 0 - 9 ] ". to Regex (), Ġ""). to Long () ĊĠĠĠ Ġfun Ġpart 1 (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtile Ne ighbours Ġ= Ġtiles . map Ġ{ Ġit . key Ġto Ġ 0 Ġ}. toMap (). to Mutable Map () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( t 1 , Ġw 1 Opts ) Ġin Ġoptions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( t 2 , Ġw 2 Opts ) Ġin Ġoptions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t 1 Ġ== Ġt 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext @ Ġfor Ġ( w 1 Ġin Ġw 1 Opts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( w 2 Ġin Ġw 2 Opts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatching Edge Ġ= Ġmatching Edge ( w 1 , Ġw 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matching Edge Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ("> -------------- Found Ġ(${ t 1 } Ġ/ Ġ${ t 2 } Ġ/ Ġ$ matching Edge ) ---------------- --> ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtile Ne ighbours [ t 1 ] Ġ= Ġtile Ne ighbours [ t 1 ] !! Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ next ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtile Ne ighbours . filter Ġ{ Ġit . value Ġ== Ġ 2 Ġ}. map Ġ{ Ġit . key Ġ}. reduce Ġ{ Ġi 1 , Ġi 2 Ġ-> Ġi 1 Ġ* Ġi 2 Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġmatching Edge ( w 1 : ĠWorld , Ġw 2 : ĠWorld ): ĠSide ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġmatch Ġright ĊĠĠĠĠĠĠĠ Ġvar Ġmatching Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin Ġ 0 Ġuntil Ġw 1 . getRow Count ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( w 1 . getCell ( r , Ġ 0 ) Ġ!= Ġw 2 . getCell ( r , Ġw 2 . getColumn Count () Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( matching ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSide . LEFT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġmatch Ġleft ĊĠĠĠĠĠĠĠ Ġmatching Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin Ġ 0 Ġuntil Ġw 1 . getRow Count ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( w 2 . getCell ( r , Ġ 0 ) Ġ!= Ġw 1 . getCell ( r , Ġw 1 . getColumn Count () Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( matching ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSide . RIGHT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġmatch Ġtop ĊĠĠĠĠĠĠĠ Ġmatching Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġ 0 Ġuntil Ġw 1 . getRow Count ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( w 2 . getCell ( 0 , Ġc ) Ġ!= Ġw 1 . getCell ( w 2 . getRow Count () Ġ- Ġ 1 , Ġc )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( matching ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSide . TOP ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġmatch Ġbottom ĊĠĠĠĠĠĠĠ Ġmatching Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġ 0 Ġuntil Ġw 1 . getRow Count ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( w 1 . getCell ( 0 , Ġc ) Ġ!= Ġw 2 . getCell ( w 2 . getRow Count () Ġ- Ġ 1 , Ġc )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( matching ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSide . BOTTOM ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 2 (): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcalculate Relationships () ĊĠĠĠĠĠĠĠ Ġprintln ( relations ) ĊĊĊĠĠĠĠĠĠĠ Ġval Ġcoord Ġ= Ġget Positions () ĊĠĠĠĠĠĠĠ Ġ// println ( coord ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= Ġmutable Map Of < Int , ĠMutable Map < Int , ĠLong >>() ĊĠĠĠĠĠĠĠ Ġcoord . map Ġ{ Ġit . value . second Ġ}. forEach Ġ{ Ġmatrix [ it ] Ġ= Ġmutable Map Of () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfilled Ġ= Ġmatrix . map Ġ{ Ġ( row , Ġ_ )-> Ġrow Ġto Ġcoord . filter Ġ{ Ġit . value . second Ġ== Ġrow Ġ}. map Ġ{ ĠPair ( it . value . first , Ġit . key ) Ġ}. toMap (). to Mutable Map ()} ĊĊ ĊĠĠĠĠĠĠ Ġ// Ġprintln ( coord ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġdebug Ġprint Ġtable ĊĠĠĠĠĠĠĠ Ġfilled . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" Ġ${ it . value } Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Positions (): ĠMutable Map < Long , ĠPair < Int , ĠInt >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremaining Keys Ġ= Ġtiles . keys . to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġval Ġcoord Ġ= Ġmutable Map Of < Long , ĠPair < Int , ĠInt >>() ĊĠĠĠĠĠĠĠ Ġcoord [ remaining Keys [ 0 ]] Ġ= ĠPair ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġremaining Keys . remove At ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġprintln ( remaining Keys ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġmutable Map Of < Int , ĠMutable Map < Int , ĠLong >>() ĊĠĠĠĠĠĠĠ Ġpos [ 0 ] Ġ= Ġmutable Map Of ( 0 Ġto Ġremaining Keys [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! remaining Keys . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtile Num Ġ= Ġremaining Keys . random () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ("$ tile Num Ġ-> Ġ$ coord ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelation Ġ= Ġrelations [ tile Num ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoord . toList (). forEach Ġ{ Ġ( tile , Ġc ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tile Ġ== Ġrelation . right ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" ĠRight Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoord [ tile Num ] Ġ= ĠPair ( c . first Ġ- Ġ 1 , Ġc . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Keys . remove ( tile Num ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( tile Ġ== Ġrelation . left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprintln (" ĠLeft Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoord [ tile Num ] Ġ= ĠPair ( c . first Ġ+ Ġ 1 , Ġc . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Keys . remove ( tile Num ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( tile Ġ== Ġrelation . top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" ĠTop Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoord [ tile Num ] Ġ= ĠPair ( c . first , Ġc . second Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Keys . remove ( tile Num ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( tile Ġ== Ġrelation . bottom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" ĠBottom Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoord [ tile Num ] Ġ= ĠPair ( c . first , Ġc . second Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Keys . remove ( tile Num ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcoord ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Relationships () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( t 1 , Ġw 1 Opts ) Ġin Ġoptions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( t 2 , Ġw 2 Opts ) Ġin Ġoptions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t 1 Ġ== Ġt 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext @ Ġfor Ġ( w 1 Ġin Ġw 1 Opts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( w 2 Ġin Ġw 2 Opts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatching Edge Ġ= Ġmatching Edge ( w 1 , Ġw 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matching Edge Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( matching Edge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSide . TOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelations [ t 1 ] !!. top Ġ= Ġt 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// relations [ t 2 ] !!. bottom Ġ= Ġt 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSide . BOTTOM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelations [ t 1 ] !!. bottom Ġ= Ġt 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// relations [ t 2 ] !!. top Ġ= Ġt 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSide . LEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelations [ t 1 ] !!. left Ġ= Ġt 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// relations [ t 2 ] !!. right Ġ= Ġt 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSide . RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelations [ t 1 ] !!. right Ġ= Ġt 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// relations [ t 2 ] !!. left Ġ= Ġt 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("> -------------- Found Ġ(${ t 1 } Ġ/ Ġ${ t 2 } Ġ/ Ġ$ matching Edge ) ---------------- --> ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtile Ne ighbours [ t 1 ] Ġ= Ġtile Ne ighbours [ t 1 ] !! Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ next ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln (" ne ighbours ") ĊĠĠĠĠĠĠĠ Ġprintln ( tile Ne ighbours ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠInformation Ġ{ ĊĠĠĠ Ġvar Ġleft : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġright : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġtop : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġbottom : ĠLong ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Information ( left =$ left , Ġright =$ right , Ġtop =$ top , Ġbottom =$ bottom )" ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠSide Ġ{ ĊĠĠĠ ĠTOP , ĊĠĠĠ ĠLEFT , ĊĠĠĠ ĠBOTTOM , ĊĠĠĠ ĠRIGHT Ċ } Ċ