// Ġhttps :// ad vent of code . com / 2 0 2 1 / day / 9 Ċ Ċ fun Ġmain () Ġ{ ĊĠ Ġclass ĠTable ( cols : ĠInt , Ġrows : ĠInt , Ġnumbers : ĠArray < Int >) Ġ{ ĊĠĠĠ Ġval Ġcols Ġ= Ġcols ĊĠĠĠ Ġval Ġrows Ġ= Ġrows ĊĠĠĠ Ġval Ġnumbers Ġ= Ġnumbers ĊĊĠĠĠ Ġfun Ġcompute Bas ins () Ġ{ ĊĠĠĠĠĠ Ġval Ġlow Point Indices Ġ= Ġcompute Low Points () ĊĠĠĠĠĠ Ġval Ġbas in Sizes Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠ Ġval Ġbas ins Ġ= Ġmutable ListOf < List < Pair < Int , ĠInt >> >() ĊĠĠĠĠĠ Ġval Ġbas in Indices Ġ= Ġmutable ListOf < Int >() ĊĊĠĠĠĠĠ Ġlow Point Indices . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbas in Ġ= Ġcompute Bas in ( it ) ĊĊĠĠĠĠĠĠĠ Ġbas in Sizes . add ( bas in . size ) ĊĠĠĠĠĠĠĠ Ġbas ins . add ( bas in . map Ġ{ Ġindex To Point ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġbas in Indices . addAll ( bas in ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġnumbers . forEach Indexed Ġ{ Ġindex , Ġv Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ% Ġcols Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġprintln ("") ĊĠĠĠĠĠĠĠĠĠ Ġprint ("${ index Ġ/ Ġrows Ġ}: Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( low Point Indices . contains ( index )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġprint (" Ġ^ $ v ^ Ġ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( bas in Indices . contains ( index )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġprint (" Ġ* $ v * Ġ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġprint (" Ġ Ġ$ v Ġ Ġ") ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġprintln () ĊĠĠĠĠĠ Ġprintln (" Result : Ġ${ bas in Sizes . sorted Descending (). take ( 3 ). fold ( 1 ) Ġ{ Ġacc , Ġi Ġ-> Ġacc Ġ* Ġi Ġ}} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompute Bas in ( index Ġ: ĠInt , Ġcurrent Bas in Ġ: ĠList < Int > Ġ= ĠlistOf ()) Ġ: ĠList < Int > Ġ{ ĊĠĠĠĠĠ Ġvar Ġnew Bas in Ġ= Ġcurrent Bas in . to Mutable List () ĊĠĠĠĠĠ Ġnew Bas in . add ( index ) ĊĊĠĠĠĠĠ Ġget Ne ighbours ( index ). filter Ġ{ Ġit . second Ġ< Ġ 9 Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! new Bas in . contains ( it . first )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnew Bas in Ġ= Ġcompute Bas in ( it . first , Ġnew Bas in ). to Mutable List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġnew Bas in ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompute Low Points () Ġ: ĠList < Int > Ġ{ ĊĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 0 ĊĠĠĠĠĠ Ġval Ġlow Point Indices Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠ Ġval Ġsure ly Not Low Point Indices Ġ= Ġmutable Map Of < Int , ĠBoolean >() ĊĊĠĠĠĠĠ Ġnumbers . forEach Indexed Ġ{ Ġi , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( sure ly Not Low Point Indices . get OrDefault ( i , Ġfalse )) Ġreturn @ forEach Indexed ĊĊĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlow Point Indices . add ( i ) ĊĠĠĠĠĠĠĠĠĠ Ġresult ++ ĊĊĠĠĠĠĠĠĠĠĠ Ġget Ne ighbours ( i ). forEach Ġ{ Ġsure ly Not Low Point Indices [ it . first ] Ġ= Ġtrue Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach Indexed ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ< Ġ 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġne ighbours Ġ= Ġget Ne ighbours ( i ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( ne ighbours . all Ġ{ Ġit . second Ġ> Ġvalue Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlow Point Indices . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġvalue Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġne ighbours . forEach Ġ{ Ġsure ly Not Low Point Indices [ it . first ] Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġlow Point Indices ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠReturns Ġlist Ġof Ġpairs Ġof Ġ< Index , ĠValue > ĊĠĠĠ Ġfun Ġget Ne ighbours ( index Ġ: ĠInt ) Ġ: ĠList < Pair < Int , ĠInt >> Ġ{ ĊĠĠĠĠĠ Ġval Ġpoint Ġ= Ġindex To Point ( index ) ĊĠĠĠĠĠ Ġval Ġx Ġ= Ġpoint . first ĊĠĠĠĠĠ Ġval Ġy Ġ= Ġpoint . second ĊĊĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠPair ( x Ġ- Ġ 1 , Ġy ), ĊĠĠĠĠĠĠĠ ĠPair ( x Ġ+ Ġ 1 , Ġy ), ĊĠĠĠĠĠĠĠ ĠPair ( x , Ġy Ġ- Ġ 1 ), ĊĠĠĠĠĠĠĠ ĠPair ( x , Ġy Ġ+ Ġ 1 ) ĊĠĠĠĠĠ Ġ). filter Ġ{ Ġit . first Ġ>= Ġ 0 Ġ&& Ġit . first Ġ< Ġcols Ġ&& Ġit . second Ġ>= Ġ 0 Ġ&& Ġit . second Ġ< Ġrows Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠ ĠPair ( point To Index ( it . first , Ġit . second ), Ġget ( it . first , Ġit . second ) !! ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpoint To Index ( x Ġ: ĠInt , Ġy Ġ: ĠInt ) Ġ: ĠInt Ġ{ ĊĠĠĠĠĠ Ġreturn Ġy Ġ* Ġcols Ġ+ Ġx ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġindex To Point ( index Ġ: ĠInt ) Ġ: ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠ Ġreturn ĠPair ( index Ġ% Ġcols , Ġindex Ġ/ Ġcols ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ( x Ġ: ĠInt , Ġy Ġ: ĠInt ) Ġ: ĠInt ? Ġ{ ĊĠĠĠĠĠ Ġreturn Ġnumbers . elementAt OrNull ( y Ġ* Ġcols Ġ+ Ġx ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġpart 1 () Ġ{ ĊĠĠĠ Ġval Ġnumbers Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġvar Ġcols Ġ= Ġ- 1 ĊĠĠĠ Ġvar Ġrows Ġ= Ġ 0 ĊĊĠĠĠ Ġfor Ġ( line Ġin Ġread Input (" Day 0 9 ")) Ġ{ ĊĠĠĠĠĠ Ġcols Ġ= Ġline . length ĊĠĠĠĠĠ Ġrows ++ ĊĠĠĠĠĠ Ġnumbers . addAll ( line . split (" "). filter Ġ{ Ġit . isNotEmpty () Ġ}. map Ġ{ Ġit . toInt () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġt Ġ= ĠTable ( cols , Ġrows , Ġnumbers . to Typed Array ()) ĊĊĠĠĠ Ġt . compute Low Points () ĊĠ Ġ} ĊĊĠ Ġfun Ġpart 2 () Ġ{ ĊĠĠĠ Ġval Ġnumbers Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġvar Ġcols Ġ= Ġ- 1 ĊĠĠĠ Ġvar Ġrows Ġ= Ġ 0 ĊĊĠĠĠ Ġfor Ġ( line Ġin Ġread Input (" Day 0 9 ")) Ġ{ ĊĠĠĠĠĠ Ġcols Ġ= Ġline . length ĊĠĠĠĠĠ Ġrows ++ ĊĠĠĠĠĠ Ġnumbers . addAll ( line . split (" "). filter Ġ{ Ġit . isNotEmpty () Ġ}. map Ġ{ Ġit . toInt () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġt Ġ= ĠTable ( cols , Ġrows , Ġnumbers . to Typed Array ()) ĊĊĠĠĠ Ġt . compute Bas ins () ĊĠ Ġ} ĊĊĠ Ġpart 1 () ĊĠ Ġpart 2 () Ċ } Ċ