fun Ġmain () Ġ{ ĊĠĠĠ Ġprintln (" Part ĠOne ĠSolution : Ġ${ part One () }") ĊĠĠĠ Ġprintln (" Part ĠTwo ĠSolution : Ġ${ part Two () }") Ċ } Ċ Ċ private Ġfun Ġpart One (): ĠInt Ġ{ ĊĊĠĠĠ Ġval Ġheight Map Ġ= Ġread Height Map () ĊĊĠĠĠ Ġval Ġlow Points Ġ= Ġfind Low Points ( height Map ) ĊĊĠĠĠ Ġreturn Ġlow Points . sum Of Ġ{ Ġheight Map [ it . first ][ it . second ] Ġ+ Ġ 1 Ġ} Ċ } Ċ Ċ private Ġfun Ġpart Two (): ĠLong Ġ{ ĊĠĠĠ Ġval Ġheight Map Ġ= Ġread Height Map () ĊĊĠĠĠ Ġval Ġlow Points Ġ= Ġfind Low Points ( height Map ) ĊĊĠĠĠ Ġvar Ġresult Ġ= Ġ 1 L ĊĊĠĠĠ Ġlow Points . map Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Bas in Size ( it , Ġheight Map , Ġ 1 , Ġmutable ListOf ()) ĊĠĠĠ Ġ}. sorted Descending () ĊĠĠĠĠĠĠĠ Ġ. take ( 3 ) ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ*= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġfun Ġread Height Map (): ĠList < Mutable List < Int >> Ġ{ ĊĠĠĠ Ġval Ġheight Map Ġ= Ġmutable ListOf < Mutable List < Int >>() ĊĊĠĠĠ Ġread Input Lines () ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . split ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . toInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġrow . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map . add ( row ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġheight Map Ċ } Ċ Ċ private Ġfun Ġfind Low Points ( height Map : ĠList < Mutable List < Int >> ): ĠList < Pair < Int , ĠInt >> Ġ{ ĊĠĠĠ Ġval Ġlow Points Ġ= Ġmutable ListOf < Pair < Int , ĠInt >>() ĊĠĠĠ Ġfor Ġ( row Ġin Ġheight Map . indices ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( column Ġin Ġheight Map [ 0 ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Low Point Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row Ġ- Ġ 1 Ġin Ġheight Map . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( height Map [ row Ġ- Ġ 1 ][ column ] Ġ<= Ġheight Map [ row ][ column ]) Ġis Low Point Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row Ġ+ Ġ 1 Ġin Ġheight Map . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( height Map [ row Ġ+ Ġ 1 ][ column ] Ġ<= Ġheight Map [ row ][ column ]) Ġis Low Point Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column Ġ- Ġ 1 Ġin Ġheight Map [ 0 ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( height Map [ row ][ column Ġ- Ġ 1 ] Ġ<= Ġheight Map [ row ][ column ]) Ġis Low Point Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column Ġ+ Ġ 1 Ġin Ġheight Map [ 0 ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( height Map [ row ][ column Ġ+ Ġ 1 ] Ġ<= Ġheight Map [ row ][ column ]) Ġis Low Point Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Low Point ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlow Points . add ( Pair ( row , Ġcolumn )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġlow Points Ċ } Ċ Ċ fun Ġfind Bas in Size ( ĊĠĠĠ Ġpoint : ĠPair < Int , ĠInt >, ĊĠĠĠ Ġmap : ĠList < List < Int >>, ĊĠĠĠ Ġinitial Size : ĠInt , ĊĠĠĠ Ġvisited : ĠMutable List < Pair < Int , ĠInt >> Ċ ): ĠInt Ġ{ ĊĠĠĠ Ġvisited . add ( point ) ĊĠĠĠ Ġvar Ġcount Ġ= Ġinitial Size ĊĠĠĠ Ġval Ġprevious Row Ġ= ĠPair ( point . first Ġ- Ġ 1 , Ġpoint . second ) ĊĠĠĠ Ġif Ġ( previous Row . exists ( map ) Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Row Ġ! in Ġvisited Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Row . isNot N ine ( map ) Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Row . is High er ( point , Ġmap ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Ġ+= Ġfind Bas in Size ( previous Row , Ġmap , Ġ 1 , Ġvisited ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġnext Row Ġ= ĠPair ( point . first Ġ+ Ġ 1 , Ġpoint . second ) ĊĠĠĠ Ġif Ġ( next Row . exists ( map ) Ġ&& ĊĠĠĠĠĠĠĠ Ġnext Row Ġ! in Ġvisited Ġ&& ĊĠĠĠĠĠĠĠ Ġnext Row . isNot N ine ( map ) Ġ&& ĊĠĠĠĠĠĠĠ Ġnext Row . is High er ( point , Ġmap ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Ġ+= Ġfind Bas in Size ( next Row , Ġmap , Ġ 1 , Ġvisited ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġprevious Column Ġ= ĠPair ( point . first , Ġpoint . second Ġ- Ġ 1 ) ĊĠĠĠ Ġif Ġ( previous Column . exists ( map ) Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Column Ġ! in Ġvisited Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Column . isNot N ine ( map ) Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Column . is High er ( point , Ġmap ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Ġ+= Ġfind Bas in Size ( previous Column , Ġmap , Ġ 1 , Ġvisited ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġnext Column Ġ= ĠPair ( point . first , Ġpoint . second Ġ+ Ġ 1 ) ĊĠĠĠ Ġif Ġ( next Column . exists ( map ) Ġ&& ĊĠĠĠĠĠĠĠ Ġnext Column Ġ! in Ġvisited Ġ&& ĊĠĠĠĠĠĠĠ Ġnext Column . isNot N ine ( map ) Ġ&& ĊĠĠĠĠĠĠĠ Ġnext Column . is High er ( point , Ġmap ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Ġ+= Ġfind Bas in Size ( next Column , Ġmap , Ġ 1 , Ġvisited ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcount Ċ } Ċ Ċ fun ĠPair < Int , ĠInt >. is High er ( other : ĠPair < Int , ĠInt >, Ġmap : ĠList < List < Int >>) Ġ= ĊĠĠĠ Ġmap [ this . first ][ this . second ] Ġ> Ġmap [ other . first ][ other . second ] Ċ Ċ fun ĠPair < Int , ĠInt >. isNot N ine ( map : ĠList < List < Int >>) Ġ= Ġmap [ this . first ][ this . second ] Ġ!= Ġ 9 Ċ Ċ fun ĠPair < Int , ĠInt >. exists ( map : ĠList < List < Int >>) Ġ= Ġthis . first Ġin Ġmap . indices Ġ&& Ġthis . second Ġin Ġmap [ 0 ]. indices Ċ Ċ fun Ġread Input Lines (): ĠList < String > Ġ{ ĊĠĠĠ Ġreturn Ġ{} :: class . java . class Loader . getResource (" input . txt ") !! ĊĠĠĠĠĠĠĠ Ġ. read Text () ĊĠĠĠĠĠĠĠ Ġ. split ("\ n ") ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotBlank () Ġ} Ċ } Ċ