package Ġcom . s 1 3 g . a oc . a oc 2 0 2 0 Ċ Ċ import Ġcom . s 1 3 g . a oc . Result Ċ import Ġcom . s 1 3 g . a oc . Solver Ċ Ċ /** Ċ Ġ* Ġ--- ĠDay Ġ 2 0 : ĠJ ur ass ic ĠJ igsaw Ġ--- Ċ Ġ* Ġhttps :// ad vent of code . com / 2 0 2 0 / day / 2 0 Ċ Ġ*/ Ċ class ĠDay 2 0 Ġ: ĠSolver Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠP U ZZ LE _ SIZE Ġ= Ġ 1 2 Ġ Ġ// Ġ 1 2 x 1 2 Ġtiles ĊĠĠĠ Ġprivate Ġconst Ġval ĠT ILE _ SIZE Ġ= Ġ 1 0 ĊĠĠĠ Ġprivate Ġval Ġtile Regex Ġ= Ġ""" Tile Ġ(\ d + ): """. to Regex () ĊĠĠĠ Ġprivate Ġfun Ġindex ( x : ĠInt , Ġy : ĠInt , Ġn : ĠInt Ġ= Ġ 1 0 ) Ġ= Ġy Ġ* Ġn Ġ+ Ġx ĊĠĠĠ Ġprivate Ġfun Ġindex P ( x : ĠInt , Ġy : ĠInt ) Ġ= Ġy Ġ* ĠP U ZZ LE _ SIZE Ġ+ Ġx ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġsolve ( lines : ĠList < String >): ĠResult Ġ{ ĊĠĠĠ Ġval Ġall Tiles Ġ= Ġparse Input ( lines ) ĊĊĠĠĠ Ġ// ĠT ries Ġto Ġplace Ġall Ġthe Ġtiles Ġinto Ġthe Ġ 1 2 x 1 2 Ġgrid . ĊĠĠĠ Ġval Ġresult Ġ= Ġplace New Tile ( 0 , Ġ 0 , Ġmap Of (), Ġall Tiles ) ĊĊĠĠĠ Ġ// ĠMultiply Ġthe Ġcorner ĠIDs Ġas Ġrequested Ġfor ĠPart Ġ 1 . ĊĠĠĠ Ġval Ġresult A Ġ= Ġresult [ index P ( 0 , Ġ 0 )] !!. id . to Long () Ġ* ĊĠĠĠĠĠĠĠ Ġresult [ index P ( PU ZZ LE _ SIZE Ġ- Ġ 1 , Ġ 0 )] !!. id . to Long () Ġ* ĊĠĠĠĠĠĠĠ Ġresult [ index P ( 0 , ĠP U ZZ LE _ SIZE Ġ- Ġ 1 )] !!. id . to Long () Ġ* ĊĠĠĠĠĠĠĠ Ġresult [ index P ( PU ZZ LE _ SIZE Ġ- Ġ 1 , ĠP U ZZ LE _ SIZE Ġ- Ġ 1 )] !!. id . to Long () ĊĊĠĠĠ Ġ// ĠRender Ġthe Ġimage Ġas Ġrequested Ġfor ĠPart 2 Ġand Ġgenerate Ġall Ġeight Ġvariants . ĊĠĠĠ Ġval Ġvariants Part 2 Ġ= Ġgen Variants ( render Image For Part 2 ( result )) ĊĠĠĠ Ġ// ĠThen Ġtry Ġto Ġfind Ġthe Ġmon sters Ġin Ġany Ġof Ġthe Ġvariants Ġand Ġcount Ġremaining Ġ'#' Ġtiles . ĊĠĠĠ Ġval Ġresult B Ġ= Ġfind Se amon ster ( variants Part 2 ) ĊĊĠĠĠ Ġreturn ĠResult ("$ result A ", Ġ"$ result B ") ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfind Se amon ster ( datas : ĠList < Tile Data >): ĠInt Ġ{ ĊĠĠĠ Ġ// ĠThis Ġmonster Ġwas Ġgiven Ġin Ġpart Ġ 2 . ĊĠĠĠ Ġval Ġm Width Ġ= Ġ 2 0 ĊĠĠĠ Ġval Ġm Height Ġ= Ġ 3 ĊĠĠĠ Ġval Ġmonster Ġ= Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ# Ġ# ĠĠĠ Ġ## ĠĠĠ Ġ## ĠĠĠ Ġ### Ġ# Ġ Ġ# Ġ Ġ# Ġ Ġ# Ġ Ġ# Ġ Ġ# ĠĠ Ġ" ĊĊĠĠĠ Ġfor Ġ( data Ġin Ġdatas ) Ġ{ ĊĠĠĠĠĠ Ġvar Ġnum Mon sters Ġ= Ġ 0 ĊĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġdata . dim Ġ- Ġm Height ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġdata . dim Ġ- Ġm Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . matches ( monster , Ġm Width , Ġm Height , Ġx , Ġy )) Ġnum Mon sters ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// ĠMon sters Ġdon 't Ġoverlap , Ġso Ġwe Ġcan Ġjust Ġcount Ġthe Ġnumbers Ġof Ġmon sters Ġand Ġsubtract ĊĠĠĠĠĠ Ġ// Ġthat Ġmany Ġ'#' Ġfindings . ĊĠĠĠĠĠ Ġif Ġ( num Mon sters Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdata . data . count Ġ{ Ġit Ġ== Ġ'#' Ġ} Ġ- Ġ( num Mon sters Ġ* Ġmonster . count Ġ{ Ġit Ġ== Ġ'#' Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġerror (" Cannot Ġfind Ġany Ġmon sters .") ĊĠ Ġ} ĊĊĠ Ġ/** ĠBased Ġon Ġresult Ġfrom ĠPart Ġ 1 , Ġproduce Ġthe Ġimage Ġthat Ġwill Ġserve Ġas Ġbase Ġfor ĠPart Ġ 2 . Ġ*/ ĊĠ Ġprivate Ġfun Ġrender Image For Part 2 ( placed : ĠMap < Int , ĠTile Data >): ĠTile Data Ġ{ ĊĠĠĠ Ġ// ĠWe 're Ġgoing Ġto Ġcut Ġ 1 Ġpixel Ġfrom Ġeach Ġedge Ġof Ġeach Ġtile Ġbefore Ġglue ing Ġthem Ġtogether . ĊĠĠĠ Ġval Ġside Length Ġ= Ġ( TILE _ SIZE Ġ- Ġ 2 ) Ġ* ĠP U ZZ LE _ SIZE ĊĠĠĠ Ġval Ġresult Ġ= ĠChar Array ( side Length Ġ* Ġside Length ) Ġ{ Ġ' Ġ' Ġ} ĊĊĠĠĠ Ġfor Ġ( tile X Ġin Ġ 0 Ġuntil ĠP U ZZ LE _ SIZE ) Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( tile Y Ġin Ġ 0 Ġuntil ĠP U ZZ LE _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart X Ġ= Ġtile X Ġ* Ġ( TILE _ SIZE Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġstart Y Ġ= Ġtile Y Ġ* Ġ( TILE _ SIZE Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġtile Ġ= Ġplaced [ index P ( tile X , Ġtile Y )] !!. data ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 1 Ġuntil ĠT ILE _ SIZE Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 1 Ġuntil ĠT ILE _ SIZE Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ index ( x Ġ+ Ġstart X Ġ- Ġ 1 , Ġy Ġ+ Ġstart Y Ġ- Ġ 1 , Ġside Length )] Ġ= Ġtile [ index ( x , Ġy , ĠT ILE _ SIZE )] ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠTile Data ( 0 , ĠString ( result ), Ġside Length ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠT ries Ġto Ġplace Ġa Ġnew Ġtile Ġat Ġlocation Ġx , y . ĠIf Ġsuccessful , Ġwill Ġcall Ġitself Ġrecursively Ġfor Ġnext Ġtile Ġ. Ġ*/ ĊĠ Ġprivate Ġfun Ġplace New Tile ( x : ĠInt , Ġy : ĠInt , Ġplaced : ĠMap < Int , ĠTile Data >, Ġall Tiles : ĠMap < Int , ĠList < Tile Data >> ): ĠMap < Int , ĠTile Data > Ġ{ ĊĠĠĠ Ġ// ĠThe Ġtile Ġwe Ġwant Ġto Ġplace . ĊĠĠĠ Ġval Ġpos Ġ= Ġindex P ( x , Ġy ) ĊĠĠĠ Ġassert ( pos Ġ! in Ġplaced ) ĊĊĠĠĠ Ġval Ġplaced Copy Ġ= Ġplaced . to Mutable Map () ĊĊĠĠĠ Ġ// ĠCheck Ġall Ġremaining Ġtiles ĊĠĠĠ Ġfor Ġ( tile Ġin Ġall Tiles ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( tile . key Ġin Ġplaced . values . map Ġ{ Ġit . id Ġ}) Ġcontinue Ġ Ġ// ĠAlready Ġplaced Ġ-> Ġskip . ĊĊĠĠĠĠĠ Ġ// ĠCheck Ġall Ġthe Ġvariants ĊĠĠĠĠĠ Ġfor Ġ( variant Ġin Ġtile . value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġplaced Copy [ pos ] Ġ= Ġvariant ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġplacement Ġis Ġvalid Ġas Ġto Ġthe Ġrules .... ĊĠĠĠĠĠĠĠ Ġif Ġ( isValid Tile ( x , Ġy , Ġplaced Copy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠCh ose Ġnext Ġcoordinate Ġand Ġrepeat Ġrecursively . ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġnew X Ġ= Ġx Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( new X Ġ== ĠP U ZZ LE _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew X Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Y ++ ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Y Ġ== ĠP U ZZ LE _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġfound Ġthe Ġfinal Ġsolution ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġplaced Copy ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġwere Ġunable Ġto Ġcomplete Ġthe Ġplacement Ġrecursively , Ġreplace Ġour Ġcurrent ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġcandidate Ġplacement Ġby Ġcontinuing Ġthe Ġloop Ġ( back Ġtrack ). ĊĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġplace New Tile ( new X , Ġnew Y , Ġplaced Copy , Ġall Tiles ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . isNotEmpty ()) Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġempty Map () ĊĠ Ġ} ĊĊĠ Ġ/** ĠChecks Ġif Ġthe Ġtile Ġat Ġlocation Ġx , y Ġis Ġvalid Ġby Ġmatching Ġits Ġedges Ġwith Ġneighbors ' Ġedges . Ġ*/ ĊĠ Ġprivate Ġfun ĠisValid Tile ( x : ĠInt , Ġy : ĠInt , Ġplaced : ĠMap < Int , ĠTile Data >): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcurrent Tile Ġ= Ġplaced [ index P ( x , Ġy )] !! ĊĠĠĠ Ġif Ġ( y Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtop Of Idx Ġ= Ġindex P ( x , Ġy Ġ- Ġ 1 ) ĊĠĠĠĠĠ Ġif Ġ( top Of Idx Ġin Ġplaced ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbottom Edge Of Top Ġ= Ġplaced [ top Of Idx ] !!. edges [ 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġtop Edge Of Current Ġ= Ġcurrent Tile . edges [ 0 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( bottom Edge Of Top Ġ!= Ġtop Edge Of Current ) Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( x Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġright Of Idx Ġ= Ġindex P ( x Ġ+ Ġ 1 , Ġy ) ĊĠĠĠĠĠ Ġif Ġ( right Of Idx Ġin Ġplaced ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft Edge Of Right Ġ= Ġplaced [ right Of Idx ] !!. edges [ 3 ] ĊĠĠĠĠĠĠĠ Ġval Ġright Edge Of Current Ġ= Ġcurrent Tile . edges [ 1 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( left Edge Of Right Ġ!= Ġright Edge Of Current ) Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( y Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġbottom Of Idx Ġ= Ġindex P ( x , Ġy Ġ+ Ġ 1 ) ĊĠĠĠĠĠ Ġif Ġ( bottom Of Idx Ġin Ġplaced ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Edge Of Bottom Ġ= Ġplaced [ bottom Of Idx ] !!. edges [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġbottom Edge Of Current Ġ= Ġcurrent Tile . edges [ 2 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( top Edge Of Bottom Ġ!= Ġbottom Edge Of Current ) Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( x Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġleft Of Idx Ġ= Ġindex P ( x Ġ- Ġ 1 , Ġy ) ĊĠĠĠĠĠ Ġif Ġ( left Of Idx Ġin Ġplaced ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġright Edge Of Left Ġ= Ġplaced [ left Of Idx ] !!. edges [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġleft Edge Of Current Ġ= Ġcurrent Tile . edges [ 3 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( right Edge Of Left Ġ!= Ġleft Edge Of Current ) Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġ/** ĠRepresents Ġa Ġsingle Ġtile . Ġ*/ ĊĠ Ġprivate Ġclass ĠTile Data ( val Ġid : ĠInt , Ġval Ġdata : ĠString , Ġval Ġdim : ĠInt Ġ= ĠT ILE _ SIZE ) Ġ{ ĊĠĠĠ Ġval Ġedges : ĠList < String > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġ// ĠGenerate Ġthe Ġfour Ġedges Ġas Ġa Ġlist Ġof Ġstrings Ġso Ġwe Ġcan Ġmatch Ġthem Ġeasily . ĊĠĠĠĠĠ Ġvar Ġtop Ġ= Ġ"" ĊĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġdim ) Ġtop Ġ+= Ġdata [ index ( x , Ġ 0 )] ĊĠĠĠĠĠ Ġvar Ġbottom Ġ= Ġ"" ĊĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġdim ) Ġbottom Ġ+= Ġdata [ index ( x , Ġdim Ġ- Ġ 1 )] ĊĠĠĠĠĠ Ġvar Ġleft Ġ= Ġ"" ĊĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġdim ) Ġleft Ġ+= Ġdata [ index ( 0 , Ġy )] ĊĠĠĠĠĠ Ġvar Ġright Ġ= Ġ"" ĊĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġdim ) Ġright Ġ+= Ġdata [ index ( dim Ġ- Ġ 1 , Ġy )] ĊĠĠĠĠĠ Ġedges Ġ= ĠlistOf ( top , Ġright , Ġbottom , Ġleft ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGets Ġa Ġsingle Ġpixel Ġ. */ ĊĠĠĠ Ġfun Ġget ( x : ĠInt , Ġy : ĠInt ) Ġ= Ġdata [ index ( x , Ġy , Ġdim )] ĊĊĠĠĠ Ġ/** ĠReturns Ġa Ġcopy Ġof Ġa Ġ 9 0 Ġdegrees ĠC W Ġrotated Ġtile . Ġ*/ ĊĠĠĠ Ġfun Ġrotate Right (): ĠTile Data Ġ{ ĊĠĠĠĠĠ Ġvar Ġright Rot Ġ= Ġ"" ĊĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġdim ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġdim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġright Rot Ġ+= Ġdata [ index ( y , Ġdim Ġ- Ġ 1 Ġ- Ġx , Ġdim )] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĠTile Data ( id , Ġright Rot , Ġdim ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġa Ġcopy Ġof Ġa Ġh orizontally Ġf lipped Ġtile . Ġ*/ ĊĠĠĠ Ġfun Ġhor Flip (): ĠTile Data Ġ{ ĊĠĠĠĠĠ Ġvar Ġf lipped Ġ= Ġ"" ĊĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġdim ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġdim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġf lipped Ġ+= Ġdata [ index ( dim Ġ- Ġ 1 Ġ- Ġx , Ġy , Ġdim )] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĠTile Data ( id , Ġf lipped , Ġdim ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠT ries Ġto Ġmatch Ġall Ġ'#' Ġin Ġgiven Ġpattern Ġwith Ġgiven Ġdimensions Ġin Ġgiven Ġlocation . Ġ*/ ĊĠĠĠ Ġfun Ġmatches ( pattern : ĠString , Ġwidth : ĠInt , Ġheight : ĠInt , Ġx : ĠInt , Ġy : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( my Ġin Ġ 0 Ġuntil Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( mx Ġin Ġ 0 Ġuntil Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( pattern [ width Ġ* Ġmy Ġ+ Ġmx ] Ġ== Ġ'#' Ġ&& Ġget ( x Ġ+ Ġmx , Ġy Ġ+ Ġmy ) Ġ!= Ġ'# ') Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠGenerates Ġall Ġ 8 Ġvariants Ġof Ġthis Ġtile Ġ( rot ated , Ġf lipped , Ġboth ). */ ĊĠ Ġprivate Ġfun Ġgen Variants ( orig : ĠTile Data ): ĠList < Tile Data > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf ( orig ) ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 2 ) Ġresult . add ( result . last (). rotate Right ()) ĊĠĠĠ Ġresult . add ( orig . hor Flip ()) ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 2 ) Ġresult . add ( result . last (). rotate Right ()) ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġparse Input ( lines : ĠList < String >): ĠMap < Int , ĠList < Tile Data >> Ġ{ ĊĠĠĠ Ġval Ġinput Ġ= Ġmutable Map Of < Int , ĠTile Data >() ĊĠĠĠ Ġvar Ġcurrent Pic Ġ= Ġ"" ĊĠĠĠ Ġvar Ġcurrent Id Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( line Ġin Ġlines ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġline . startsWith (" Tile ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcurrent Id Ġ= Ġtile Regex . find ( line ) !!. de structured . component 1 (). toInt () ĊĠĠĠĠĠĠĠĠĠ Ġcurrent Pic Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġline . isBlank () Ġ-> Ġinput [ current Id ] Ġ= ĠTile Data ( current Id , Ġcurrent Pic ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcurrent Pic Ġ+= Ġline ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġinput . map Ġ{ Ġ( k , Ġv ) Ġ-> ĠPair ( k , Ġgen Variants ( v )) Ġ}. associate Ġ{ Ġit Ġ} ĊĠ Ġ} Ċ } Ċ