package Ġnet . m gu ent her . ad vent of code . day 3 Ċ Ċ import Ġnet . m gu ent her . ad vent of code . array 2 d Of Int Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMark us ĠG Ã¼n ther Ġ( mark us . gu ent her @ gmail . com ) Ċ Ġ*/ Ċ Ċ class ĠSquare Fill er ( fill Until L arger Than : ĠInt ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfill Until L arger Than Ġ= Ġfill Until L arger Than ĊĠĠĠ Ġprivate Ġval Ġinternal Array Ġ= Ġarray 2 d Of Int ( 1 1 , Ġ 1 1 ) ĊĠĠĠ Ġprivate Ġval Ġneighbour Vectors : ĠList < Pair < Int , ĠInt >> Ġ= ĠlistOf ( Pair ( 0 , Ġ 1 ), ĠPair ( 1 , Ġ 1 ), ĠPair ( 1 , Ġ 0 ), ĠPair ( 1 , Ġ- 1 ), ĠPair ( 0 , Ġ- 1 ), ĠPair (- 1 , Ġ- 1 ), ĠPair (- 1 , Ġ 0 ), ĠPair (- 1 , Ġ 1 )) ĊĠĠĠ Ġprivate Ġvar Ġposition : ĠPair < Int , ĠInt > Ġ= ĠPair ( 5 , Ġ 5 ) ĊĠĠĠ Ġprivate Ġvar Ġlayer Ġ= Ġ 1 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Array [ position . first ][ position . second ] Ġ= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfill () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! fill Layer ()) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill Layer (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( move Ġin Ġmove Commands ( layer )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmove . times ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= ĠPair ( position . first Ġ+ Ġmove . direction . first , Ġposition . second Ġ+ Ġmove . direction . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsum Ġ= Ġsum Of Ne ighbours ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Array [ position . first ][ position . second ] Ġ= Ġsum ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sum Ġ> Ġfill Until L arger Than ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( sum ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlayer ++ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmove Commands ( layer : ĠInt ): ĠList < Move Sequence > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove Sequence ( move Right , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove Sequence ( move Up , Ġ 2 Ġ* Ġlayer Ġ- Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove Sequence ( move Left , Ġ 2 Ġ* Ġlayer ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove Sequence ( move Down , Ġ 2 Ġ* Ġlayer ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove Sequence ( move Right , Ġ 2 Ġ* Ġlayer )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsum Of Ne ighbours ( position : ĠPair < Int , ĠInt >): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġneighbour Vectors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( first , Ġsecond ) Ġ-> ĠPair ( position . first Ġ+ Ġfirst , Ġposition . second Ġ+ Ġsecond ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġneighbour Ġ-> Ġout Of Bounds ( ne ighbour ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( first , Ġsecond ) Ġ-> Ġinternal Array [ first ][ second ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sum () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġout Of Bounds ( position : ĠPair < Int , ĠInt >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġposition . first ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġposition . second ĊĠĠĠĠĠĠĠ Ġreturn Ġy Ġ< Ġ 0 Ġ|| Ġx Ġ< Ġ 0 Ġ|| Ġy Ġ>= Ġinternal Array . size Ġ|| Ġx Ġ>= Ġinternal Array [ 0 ]. size ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠMove Sequence ( val Ġdirection : ĠPair < Int , ĠInt >, Ġval Ġtimes : ĠInt ) Ċ Ċ val Ġmove Right Ġ= ĠPair ( 0 , 1 ) Ċ val Ġmove Up Ġ= ĠPair (- 1 , Ġ 0 ) Ċ val Ġmove Left Ġ= ĠPair ( 0 , Ġ- 1 ) Ċ val Ġmove Down Ġ= ĠPair ( 1 , Ġ 0 )