import Ġutils . Grid Ċ import Ġutils . Parser Ċ import Ġutils . Solution Ċ Ċ fun Ġmain () Ġ{ ĊĠ ĠDay 2 0 Func . run () Ċ } Ċ Ċ object ĠDay 2 0 Func Ġ: ĠSolution < Pair < Grid , ĠList < Int >> >() Ġ{ ĊĠ Ġoverride Ġval Ġname Ġ= Ġ" day 2 0 " ĊĠ Ġoverride Ġval Ġparser Ġ= ĠParser Ġ{ Ġinput Ġ-> ĊĠĠĠ Ġval Ġ( lookup String , Ġimage String ) Ġ= Ġinput . split ("\ n \ n ", Ġlimit Ġ= Ġ 2 ) ĊĊĠĠĠ Ġval Ġlookup Ġ= Ġlookup String . replace ("\ n ", Ġ""). trim (). map Ġ{ Ġif Ġ( it Ġ== Ġ'# ') Ġ 1 Ġelse Ġ 0 Ġ} ĊĠĠĠ Ġval Ġgrid Lines Ġ= Ġimage String . split ("\ n "). map Ġ{ Ġit . trim () Ġ}. filter Ġ{ Ġit . isNotBlank () Ġ} ĊĊĠĠĠ Ġval Ġgrid W Ġ= Ġgrid Lines . first (). length ĊĠĠĠ Ġval Ġgrid H Ġ= Ġgrid Lines . size ĊĊĠĠĠ Ġval Ġgrid Ġ= ĠGrid ( grid W , Ġgrid H ) Ġ{ Ġ( x , Ġy ) Ġ-> Ġif Ġ( grid Lines [ y ][ x ] Ġ== Ġ'# ') Ġ 1 Ġelse Ġ 0 Ġ} ĊĊĠĠĠ Ġreturn @ Parser Ġgrid . border With ( 0 , ĠborderWidth Ġ= Ġ 2 ) Ġto Ġlookup ĊĠ Ġ} ĊĊĠ Ġfun Ġenhance ( input : ĠGrid , Ġlookup : ĠList < Int >): ĠGrid Ġ{ ĊĠĠĠ Ġval Ġpadding Ġ= Ġif Ġ( input [ 0 ][ 0 ] Ġ== Ġ 0 ) Ġlookup [ 0 ] Ġelse Ġlookup [ 5 1 1 ] ĊĊĠĠĠ Ġreturn ĠGrid ( input . width , Ġinput . height ) Ġ{ Ġcoord Ġ-> ĊĠĠĠĠĠ Ġif Ġ( coord . x Ġ< Ġ 1 Ġ|| Ġcoord . y Ġ< Ġ 1 Ġ|| Ġcoord . x Ġ>= Ġinput . width Ġ- Ġ 1 Ġ|| Ġcoord . y Ġ>= Ġinput . height Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ Grid Ġpadding ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġlookup Index Ġ= Ġ( coord . y Ġ- Ġ 1 Ġ.. Ġcoord . y Ġ+ Ġ 1 ). flatMap Indexed Ġ{ Ġy Pos , Ġy Ġ-> ĊĠĠĠĠĠĠĠ Ġ( coord . x Ġ- Ġ 1 Ġ.. Ġcoord . x Ġ+ Ġ 1 ). map Indexed Ġ{ Ġx Pos , Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġshift Ġ= Ġ( 8 Ġ- Ġ( y Pos Ġ* Ġ 3 Ġ+ Ġx Pos )) ĊĠĠĠĠĠĠĠĠĠ Ġrequire ( shift Ġin Ġ 0 Ġ.. Ġ 8 ) Ġ{ Ġ" Shift Ġout Ġof Ġbounds " Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġinput [ x ][ y ] Ġshl Ġshift ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. sum () ĊĊĠĠĠĠĠ Ġrequire ( lookup Index Ġ<= Ġlookup . size ) Ġ{ Ġ" Lookup Ġindex Ġtoo Ġlarge !" Ġ} ĊĊĠĠĠĠĠ Ġreturn @ Grid Ġlookup [ lookup Index ] ĊĠĠĠ Ġ}. border With ( padding ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġpart 1 ( input : ĠPair < Grid , ĠList < Int >> ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġ( grid , Ġlookup ) Ġ= Ġinput ĊĠĠĠ Ġval Ġround 2 Ġ= Ġ( 0 Ġuntil Ġ 2 ). fold ( grid ) Ġ{ Ġacc , Ġ_ Ġ-> Ġenhance ( acc , Ġlookup ) Ġ} ĊĠĠĠ Ġreturn Ġround 2 . values . count Ġ{ Ġit Ġ> Ġ 0 Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġpart 2 ( input : ĠPair < Grid , ĠList < Int >> ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġ( grid , Ġlookup ) Ġ= Ġinput ĊĊĠĠĠ Ġval Ġresult Ġ= Ġ( 0 Ġuntil Ġ 5 0 ). fold ( grid ) Ġ{ Ġacc , Ġ_ Ġ-> Ġenhance ( acc , Ġlookup ) Ġ} ĊĊĠĠĠ Ġreturn Ġresult . values . count Ġ{ Ġit Ġ> Ġ 0 Ġ} ĊĠ Ġ} Ċ } Ċ