import Ġad vent of code . Grid Node Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġtest Input Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠ 2 1 9 9 9 4 3 2 1 0 ĊĠĠĠĠĠĠĠĠ 3 9 8 7 8 9 4 9 2 1 ĊĠĠĠĠĠĠĠĠ 9 8 5 6 7 8 9 8 9 2 ĊĠĠĠĠĠĠĠĠ 8 7 6 7 8 9 6 7 8 9 ĊĠĠĠĠĠĠĠĠ 9 8 9 9 9 6 5 6 7 8 ĊĠĠĠ Ġ""" . trim Indent () ĊĠĠĠ Ġval Ġtest Ġ= ĠDay 0 9 ( test Input ) ĊĠĠĠ Ġprintln (" TEST : Ġ" Ġ+ Ġtest . part 1 ()) ĊĠĠĠ Ġprintln (" TEST : Ġ" Ġ+ Ġtest . part 2 ()) ĊĊĠĠĠ Ġval Ġday Ġ= ĠDay 0 9 () ĊĊĠĠĠ Ġval Ġt 1 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġprintln ("${ day . part 1 ()} ĠĠ Ġ(${ System . currentTimeMillis () Ġ- Ġt 1 } ms )") ĊĠĠĠ Ġday . reset () ĊĊĠĠĠ Ġval Ġt 2 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġprintln ("${ day . part 2 ()} ĠĠ Ġ(${ System . currentTimeMillis () Ġ- Ġt 2 } ms )") Ċ } Ċ Ċ open Ġclass ĠDay 0 9 ( static Input : ĠString ? Ġ= Ġnull ) Ġ: ĠY 2 0 2 1 Day ( 9 , Ġstatic Input ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġgrid Ġ= Ġfetch Input As Grid () ĊĊĠĠĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . reset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpart 1 (): ĠNumber ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgrid . filter Ġ{ Ġit . content Ġ< Ġit . get Neighbors (). min Of Ġ{ Ġit . content Ġ} Ġ}. sum Of Ġ{ Ġit . content As Num () Ġ+ Ġ 1 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpart 2 (): ĠNumber ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlow Points Ġ= Ġgrid . filter Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . content As Num () Ġ< Ġnode . get Neighbors (). min Of Ġ{ Ġit . content As Num () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlow Points . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseen Ġ= Ġhash Set Of < Grid Node >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= Ġhash Set Of < Grid Node >( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfound Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnodes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġnode Ġ-> Ġ! seen . contains ( node ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseen . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . get Neighbors () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . content . digit ToInt () Ġ!= Ġ 9 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . content . digit ToInt () Ġ> Ġnode . content . digit ToInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nodes . add ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( found ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnodes . size ĊĠĠĠĠĠĠĠ Ġ}. sorted By Descending Ġ{ Ġit Ġ}. take ( 3 ). reduce Ġ{ Ġa , Ġb Ġ-> Ġa Ġ* Ġb Ġ} ĊĠĠĠ Ġ} Ċ } Ċ