package Ġa oc 2 0 2 1 Ċ Ċ import ĠGrid Ċ import ĠPos Ċ Ċ class ĠDay 9 ( input : ĠList < String >) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrange X Ġ= Ġinput . first (). indices ĊĠĠĠ Ġprivate Ġval Ġrange Y Ġ= Ġinput . indices ĊĊĠĠĠ Ġval Ġgrid Ġ= ĠGrid . parse ( input ) ĊĊĠĠĠ Ġprivate Ġfun Ġfind Low Points (): ĠList < Pos > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgrid . keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . y Ġin Ġrange Y Ġ} Ġ// Ġreal Ġinput Ġis Ġsquare , Ġbut Ġexample Ġinput Ġhas Ġy Ġ< Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos . all Ne ighbours () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . x Ġin Ġrange X Ġ&& Ġit . y Ġin Ġrange Y Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. all Ġ{ Ġgrid [ it ] Ġ> Ġgrid [ pos ] Ġ} Ġ// ĠAll Ġne ighbours Ġare Ġlarger Ġthan Ġcurrent Ġ==> Ġminimum ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠReturn Ġa Ġlist Ġof Ġall Ġpoints Ġpart Ġof Ġthe Ġbas in Ġaround Ġthe Ġgiven Ġlow Ġpoint ĊĠĠĠ Ġprivate Ġfun Ġfind Bas in ( low Point : ĠPos ): ĠSet < Pos > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġmutable Set Of < Pos >() ĊĠĠĠĠĠĠĠ Ġval Ġto Check Ġ= Ġmutable Set Of ( low Point ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( to Check . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Ġ= Ġto Check . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Check . remove ( curr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret . add ( curr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġcurr . all Ne ighbours (). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . x Ġin Ġrange X Ġ&& Ġit . y Ġin Ġrange Y Ġ&& Ġit Ġ! in Ġret Ġ&& Ġgrid [ it ] Ġ!= Ġ' 9 ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Check . addAll ( next ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsolve Part 1 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Low Points (). sum Of Ġ{ Ġ 1 Ġ+ Ġgrid [ it ]. digit ToInt () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsolve Part 2 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Low Points () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfind Bas in ( it ). size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take Last ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce ( Int :: times ) ĊĠĠĠ Ġ} Ċ }