package Ġad vent of code 2 0 1 7 . pot as z Ċ Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ // Ġhttp :// ad vent of code . com / 2 0 1 7 / day / 3 Ċ object ĠP 0 3 Sp iral Memory Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠMove ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) ĊĊĠĠĠ Ġdata Ġclass ĠPosition ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġplus ( move : ĠMove ) Ġ= ĠPosition ( x Ġ+ Ġmove . x , Ġy Ġ+ Ġmove . y ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġdistance From Center () Ġ= Ġabs ( x ) Ġ+ Ġabs ( y ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġdistance From ( other : ĠPosition ) Ġ= Ġ(( x Ġ- Ġother . x ). square () Ġ+ Ġ( y Ġ- Ġother . y ). square ()) ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Within ( top Right : ĠPosition , Ġbottom Left : ĠPosition ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ>= Ġtop Right . x Ġ&& Ġx Ġ<= Ġbottom Left . x Ġ&& Ġy Ġ<= Ġtop Right . y Ġ&& Ġy Ġ>= Ġbottom Left . y ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠInt . square () Ġ= Ġthis Ġ* Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠSquare ( val Ġvalue : ĠLong , Ġval Ġposition : ĠPosition ) ĊĊĠĠĠ Ġval Ġmoves Ġ= ĠarrayOf ( Move ( 1 , Ġ 0 ), ĠMove ( 0 , Ġ 1 ), ĠMove (- 1 , Ġ 0 ), ĠMove ( 0 , Ġ- 1 )) ĊĊĠĠĠ Ġval Ġinput Ġ= Ġ 2 8 9 3 2 6 ĊĊĠĠĠ Ġprivate Ġfun Ġfind Square ( v : Ġ( Square , ĠPosition ) Ġ-> ĠLong , Ġstop At : Ġ( Square ) Ġ-> ĠBoolean ): ĠSquare Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmove Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġsquare Ġ= ĠSquare ( 1 , ĠPosition ( 0 , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġvar Ġtop Right Ġ= Ġsquare . position ĊĠĠĠĠĠĠĠ Ġvar Ġbottom Left Ġ= Ġsquare . position ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Ġ= Ġmoves [ move Index ++ Ġ% Ġmoves . size ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( square . position . is Within ( top Right , Ġbottom Left )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Position Ġ= Ġsquare . position Ġ+ Ġmove ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġv ( square , Ġnew Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsquare Ġ= ĠSquare ( newValue , Ġnew Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stop At ( square )) Ġreturn Ġsquare ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Right Ġ= ĠPosition ( min ( top Right . x , Ġsquare . position . x ), Ġmax ( top Right . y , Ġsquare . position . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Left Ġ= ĠPosition ( max ( bottom Left . x , Ġsquare . position . x ), Ġmin ( bottom Left . y , Ġsquare . position . y )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsolve 1 ( input : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Square ({ Ġsquare , Ġ_ Ġ-> Ġ Ġsquare . value Ġ+ Ġ 1 Ġ}, Ġ{ Ġit . value Ġ>= Ġinput }). position . distance From Center () ĊĊĠĠĠ Ġfun Ġsolve 2 ( input : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsquares Ġ= Ġmutable ListOf < Square >() ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Square ({ Ġsquare , Ġnew Position Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsquares . add ( square ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsquares . filter Ġ{ Ġit . position . distance From ( new Position ) Ġ<= Ġ 2 Ġ}. fold ( 0 L ) Ġ{ Ġacc , Ġs Ġ-> Ġacc Ġ+ Ġs . value Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġit . value Ġ> Ġinput }). value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( listOf ( 1 , Ġ 1 2 , Ġ 2 3 , Ġ 1 0 2 4 , Ġinput ). map Ġ{ Ġsolve 1 ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġprintln ( listOf ( 1 , Ġ 1 2 , Ġ 2 3 , Ġ 1 0 2 4 , Ġinput ). map Ġ{ Ġsolve 2 ( it ) Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ