package Ġday 2 0 Ċ Ċ data Ġclass ĠTile ( val Ġid : ĠInt , Ġval Ġcontent : ĠList < List < Char >>) Ċ Ċ private Ġval ĠTile . edges : ĠList < List < Char >> ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupper Ġ= Ġcontent . first () ĊĠĠĠĠĠĠĠ Ġval Ġlower Ġ= Ġcontent . last () ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġcontent . map Ġ{ Ġit . first () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġcontent . map Ġ{ Ġit . last () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( upper , Ġlower , Ġleft , Ġright ) ĊĠĠĠ Ġ} Ċ Ċ fun ĠTile . is Adjacent To ( other : ĠTile ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( other . id Ġ== Ġid ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġother Edges Ġ= Ġother . edges ĊĠĠĠ Ġreturn Ġedges . any Ġ{ Ġthis Edge Ġ-> Ġother Edges . any Ġ{ Ġit Ġ== Ġthis Edge Ġ|| Ġit . reversed () Ġ== Ġthis Edge Ġ} Ġ} Ċ } Ċ Ċ fun Ġfind C orners ( tiles : ĠList < Tile >): ĠList < Tile > Ġ{ ĊĠĠĠ Ġreturn Ġtiles . filter Ġ{ Ġtile Ġ-> Ġtiles . count Ġ{ Ġtile . is Adjacent To ( it ) Ġ} Ġ== Ġ 2 Ġ} Ċ } Ċ Ċ private Ġval Ġtile Id Pattern Ġ= ĠRegex ("^ Tile Ġ( \\ d + ): $ ") Ċ private Ġval Ġtile Pattern Ġ= ĠRegex ("^ ([ \\. \\ # ]){ 1 0 }$ ") Ċ fun Ġparse Tile ( tile : ĠList < String >): ĠTile Ġ{ ĊĠĠĠ Ġval Ġ( tile Id , Ġ_) Ġ= Ġtile Id Pattern . match Ent ire ( tile . first ()) !!. de structured ĊĠĠĠ Ġval Ġcontent Ġ= Ġtile . drop ( 1 ). on Each Ġ{ Ġassert ( tile Pattern . matches ( it )) Ġ}. map Ġ{ Ġit . toList () Ġ} ĊĠĠĠ Ġreturn ĠTile ( tile Id . toInt (), Ġcontent ) Ċ }