package Ġday 3 Ċ Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Test Ċ Ċ class ĠSp iral Neighbors Ġ{ ĊĊĠ Ġprivate Ġfun Ġsum Neighbors ( sp iral : ĠMap < Dim ens , ĠInt >, Ġdim en : ĠDim ens ): ĠInt Ġ= ĊĠĠĠĠĠ Ġ( sp iral [ Pair ( dim en . first Ġ+ Ġ 1 , Ġdim en . second )] Ġ?: Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ( sp iral [ Pair ( dim en . first Ġ+ Ġ 1 , Ġdim en . second Ġ+ Ġ 1 )] Ġ?: Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ( sp iral [ Pair ( dim en . first , Ġdim en . second Ġ+ Ġ 1 )] Ġ?: Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ( sp iral [ Pair ( dim en . first Ġ- Ġ 1 , Ġdim en . second Ġ+ Ġ 1 )] Ġ?: Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ( sp iral [ Pair ( dim en . first Ġ- Ġ 1 , Ġdim en . second )] Ġ?: Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ( sp iral [ Pair ( dim en . first Ġ- Ġ 1 , Ġdim en . second Ġ- Ġ 1 )] Ġ?: Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ( sp iral [ Pair ( dim en . first , Ġdim en . second Ġ- Ġ 1 )] Ġ?: Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ( sp iral [ Pair ( dim en . first Ġ+ Ġ 1 , Ġdim en . second Ġ- Ġ 1 )] Ġ?: Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ( sp iral [ Pair ( dim en . first , Ġdim en . second )] Ġ?: Ġ 0 ) ĊĊĠ Ġfun Ġnext To ( input : ĠInt ): ĠMap < Dim ens , ĠInt > Ġ{ ĊĠĠĠ Ġvar Ġdisplacement X Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġdisplacement Y Ġ= Ġ- 1 ĊĠĠĠ Ġvar Ġx Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġy Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġnumber Ġ= Ġ 1 ĊĠĠĠ Ġval Ġsp iral Ġ= Ġmutable Map Of ( Dim ens ( 0 , Ġ 0 ) Ġto Ġ 1 ) ĊĊĠĠĠ Ġwhile Ġ( number Ġ<= Ġinput ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcurrent Position Ġ= ĠDim ens ( x , Ġy ) ĊĠĠĠĠĠ Ġnumber Ġ= Ġsum Neighbors ( sp iral , Ġcurrent Position ) ĊĠĠĠĠĠ Ġsp iral . put ( current Position , Ġnumber ) ĊĊĠĠĠĠĠ Ġif Ġ( x Ġ== Ġy Ġ|| Ġ( x Ġ< Ġ 0 Ġ&& Ġx Ġ== Ġ- y ) Ġ|| Ġ( x Ġ> Ġ 0 Ġ&& Ġx Ġ== Ġ 1 Ġ- Ġy )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġdisplacement X ĊĠĠĠĠĠĠĠ Ġdisplacement X Ġ= Ġ- dis placement Y ĊĠĠĠĠĠĠĠ Ġdisplacement Y Ġ= Ġt ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġx Ġ+= Ġdisplacement X ĊĠĠĠĠĠ Ġy Ġ+= Ġdisplacement Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsp iral ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` sum Ġof Ġall Ġneighbors Ġwhen Ġyou Ġare Ġon Ġcenter Ġshould Ġbe Ġ 8 `() Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠDim ens ( 0 , Ġ 0 ) Ġto Ġ 1 , ĠDim ens ( 1 , Ġ 0 ) Ġto Ġ 1 , ĠDim ens ( 2 , Ġ 0 ) Ġto Ġ 1 , ĊĠĠĠĠĠĠĠ ĠDim ens ( 0 , Ġ 1 ) Ġto Ġ 1 , ĠDim ens ( 2 , Ġ 1 ) Ġto Ġ 1 , ĊĠĠĠĠĠĠĠ ĠDim ens ( 0 , Ġ 2 ) Ġto Ġ 1 , ĠDim ens ( 1 , Ġ 2 ) Ġto Ġ 1 , ĠDim ens ( 2 , Ġ 2 ) Ġto Ġ 1 ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠassertEquals ( 8 , Ġsum Neighbors ( map , ĠDim ens ( 1 , Ġ 1 ))) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` sum Ġhalf Ġneighbors Ġwhen Ġyou Ġare Ġon Ġcenter Ġshould Ġbe Ġ 5 `() Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠDim ens ( 0 , Ġ 0 ) Ġto Ġ 1 , ĠDim ens ( 1 , Ġ 0 ) Ġto Ġ 1 , ĠDim ens ( 2 , Ġ 0 ) Ġto Ġ 1 , ĊĠĠĠĠĠĠĠ ĠDim ens ( 0 , Ġ 1 ) Ġto Ġ 1 , ĠDim ens ( 2 , Ġ 1 ) Ġto Ġ 1 ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠassertEquals ( 5 , Ġsum Neighbors ( map , ĠDim ens ( 1 , Ġ 1 ))) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` sum Ġtwo Ġneighbors Ġwhen Ġyou Ġare Ġon Ġa Ġcorner Ġshould Ġbe Ġ 5 `() Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠDim ens ( 2 , Ġ 0 ) Ġto Ġ 1 , ĊĠĠĠĠĠĠĠ ĠDim ens ( 2 , Ġ 1 ) Ġto Ġ 1 ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠassertEquals ( 2 , Ġsum Neighbors ( map , ĠDim ens ( 1 , Ġ 1 ))) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` sum Ġitself Ġshould Ġbe Ġ 1 `() Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠDim ens ( 1 , Ġ 1 ) Ġto Ġ 1 ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠassertEquals ( 1 , Ġsum Neighbors ( map , ĠDim ens ( 1 , Ġ 1 ))) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` generate Ġsp iral Ġto Ġfind Ġnext Ġto Ġ 2 3 Ġnumber `() Ġ{ ĊĠĠĠ Ġval Ġexpected Ġ= ĠarrayOf ( 1 , Ġ 1 , Ġ 2 , Ġ 4 , Ġ 5 , Ġ 1 0 , Ġ 1 1 , Ġ 2 3 , Ġ 2 5 ) ĊĊĠĠĠ Ġassert ArrayEquals ( expected , Ġnext To ( 2 3 ). values . to Typed Array ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` generate Ġsp iral Ġto Ġfind Ġnext Ġto Ġ 2 0 0 `() Ġ{ ĊĠĠĠ Ġval Ġexpected Ġ= ĠarrayOf ( 1 , Ġ 1 , Ġ 2 , Ġ 4 , Ġ 5 , Ġ 1 0 , Ġ 1 1 , Ġ 2 3 , Ġ 2 5 , Ġ 2 6 , Ġ 5 4 , Ġ 5 7 , Ġ 5 9 , Ġ 1 2 2 , Ġ 1 3 3 , Ġ 1 4 2 , Ġ 1 4 7 , Ġ 3 0 4 ) ĊĊĠĠĠ Ġassert ArrayEquals ( expected , Ġnext To ( 2 0 0 ). values . to Typed Array ()) ĊĠĠĠ ĠassertEquals ( 3 0 4 , Ġnext To ( 2 0 0 ). values . to Typed Array (). last ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` find Ġthe Ġsolution Ġnext Ġto Ġ 2 7 7 6 7 8 `() Ġ{ ĊĠĠĠ ĠassertEquals ( 2 7 9 1 3 8 , Ġnext To ( 2 7 7 6 7 8 ). values . to Typed Array (). last ()) ĊĠ Ġ} Ċ Ċ }