package Ġa oc 2 0 2 1 Ċ Ċ import Ġa oc 2 0 2 1 . utils . head Ċ import Ġa oc 2 0 2 1 . utils . load Input Ċ import Ġa oc 2 0 2 1 . utils . tail Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġgrid Ġ= Ġload Input ("/ 2 0 2 1 / day 1 1 ") ĊĠĠĠĠĠĠĠ Ġ. buffered Reader () ĊĠĠĠĠĠĠĠ Ġ. read Lines () ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . as Sequence () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġi , Ġc Ġ-> Ġi Ġto Ġ( c . code Ġ- Ġ 4 8 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. toMap () ĊĊĠĠĠ Ġval Ġsim Ġ= Ġgenerate Sequence ( Step ( grid , Ġ 0 )) Ġ{ Ġ( state , Ġtotal ) Ġ-> ĊĠĠĠĠĠĠĠ Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let (:: initialize Step ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let (:: reduce Fl ashes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. run { Ġlast (). state Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfl ashed Ġ= Ġt ally Fl ashed ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStep ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ+ Ġfl ashed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+ Ġfl ashed . count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpart 1 Ġ= Ġsim . take ( 1 Ġ+ Ġ 1 0 0 ). last () ĊĠĠĠ Ġdraw State ( part 1 . state ) ĊĠĠĠ Ġprintln ( part 1 . total ) ĊĊĠĠĠ Ġval Ġpart 2 Ġ= Ġsim ĊĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġ( state , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . values . any Ġ{ Ġit Ġ!= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. count () ĊĠĠĠ Ġprintln ( part 2 ) Ċ } Ċ Ċ private Ġfun Ġreduce Fl ashes ( initial : ĠFlash Result ) Ġ= ĊĠĠĠ Ġgenerate Sequence ( initial ) Ġ{ Ġ( state , Ġqueue ) Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( queue . none ()) Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġapply Flash ( state , Ġqueue ) ĊĠĠĠ Ġ} Ċ Ċ type alias ĠState Ġ= ĠMap < Int , ĠInt ?> Ċ Ċ data Ġclass ĠStep ( val Ġstate : ĠState , Ġval Ġtotal : ĠInt ) Ċ data Ġclass ĠFlash Result ( val Ġstate : ĠState , Ġval Ġqueue : ĠIterable < Int >) Ċ Ċ fun Ġapply Flash ( state : ĠState , Ġqueue : ĠIterable < Int >): ĠFlash Result Ġ{ ĊĠĠĠ Ġval Ġi Ġ= Ġqueue . head () ĊĠĠĠ Ġreturn Ġif Ġ( state [ i ] Ġ== Ġnull ) ĠFlash Result ( state , Ġempty List ()) ĊĠĠĠ Ġelse Ġstate ĊĠĠĠĠĠĠĠ Ġ// Ġincrement Ġneighbors ĊĠĠĠĠĠĠĠ Ġ. plus ( neighbors Memo ized ( i ). map Ġ{ Ġit Ġto Ġstate [ it ]?. inc () Ġ}) ĊĠĠĠĠĠĠĠ Ġ// Ġmark Ġself Ġas Ġfl ashed ĊĠĠĠĠĠĠĠ Ġ. plus ( i Ġto Ġnull ) ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġupdated Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlash Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdated , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdated . filter Values Ġ{ Ġ( it Ġ?: Ġ 0 ) Ġ> Ġ 9 Ġ}. keys Ġ+ Ġqueue . tail () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġinitialize Step ( state : ĠState ): ĠFlash Result Ġ{ ĊĠĠĠ Ġval Ġupdated Ġ= Ġstate . map Values Ġ{ Ġ(_, Ġi ) Ġ-> ĊĠĠĠĠĠĠĠ Ġi !!. inc () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠFlash Result ( ĊĠĠĠĠĠĠĠ Ġupdated , ĊĠĠĠĠĠĠĠ Ġupdated . filter Values Ġ{ Ġit Ġ> Ġ 9 Ġ}. keys . sorted () ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** ĠT ally Ġfl ashed Ġoct op uses Ġand Ġreset Ġenergy Ġlevels Ġto Ġ 0 Ġ*/ Ċ fun Ġt ally Fl ashed ( state : ĠState ): ĠIterable < Pair < Int , ĠInt >> Ġ{ ĊĠĠĠ Ġreturn Ġstate ĊĠĠĠĠĠĠĠ Ġ. filter Values Ġ{ Ġit Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( i , Ġ_) Ġ-> Ġi Ġto Ġ 0 Ġ} Ċ } ĊĊĊ Ċ /** Ċ Ġ* Ġ@ param Ġi Ġindex Ġinto Ġa Ġ 1 0 x 1 0 Ġgrid Ġstarting ĠN W , Ġgoing Ġhorizontal Ġto ĠNE , Ġthen Ġrow - by - row Ġending Ġat ĠSE Ċ Ġ*/ Ċ fun Ġneighbors ( i : ĠInt ): ĠList < Int > Ġ{ ĊĠĠĠ Ġval Ġx Ġ= Ġi Ġ% Ġ 1 0 ĊĠĠĠ Ġval Ġy Ġ= Ġi Ġ/ Ġ 1 0 ĊĊĠĠĠ Ġ/* ĠĠĠĠĠ Ġ| Ġ- 1 ĠĠĠ Ġ+ 0 ĠĠĠĠ Ġ+ 1 ĊĠĠĠĠ Ġ* ĠĠ Ġ- 1 Ġ| Ġ- 1 ,- 1 Ġ+ 0 ,- 1 , Ġ+ 1 ,- 1 ĊĠĠĠĠ Ġ* ĠĠ Ġ+ 0 Ġ| Ġ- 1 , + 0 Ġ+ 0 , + 0 , Ġ+ 1 , + 0 ĊĠĠĠĠ Ġ* ĠĠ Ġ+ 1 Ġ| Ġ- 1 , + 1 Ġ+ 0 , + 1 , Ġ+ 1 , + 1 ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġval Ġnw Ġ= Ġif Ġ( x Ġ> Ġ 0 Ġ&& Ġy Ġ> Ġ 0 ) Ġx Ġ- Ġ 1 Ġ+ Ġ( y Ġ- Ġ 1 ) Ġ* Ġ 1 0 Ġelse Ġnull ĊĠĠĠ Ġval Ġw Ġ Ġ= Ġif Ġ( x Ġ> Ġ 0 ĠĠĠĠĠĠĠĠ Ġ) Ġx Ġ- Ġ 1 Ġ+ Ġ( y Ġ+ Ġ 0 ) Ġ* Ġ 1 0 Ġelse Ġnull ĊĠĠĠ Ġval Ġsw Ġ= Ġif Ġ( x Ġ> Ġ 0 Ġ&& Ġy Ġ< Ġ 9 ) Ġx Ġ- Ġ 1 Ġ+ Ġ( y Ġ+ Ġ 1 ) Ġ* Ġ 1 0 Ġelse Ġnull ĊĊĠĠĠ Ġval Ġn Ġ Ġ= Ġif Ġ( ĠĠĠĠĠĠĠĠ Ġy Ġ> Ġ 0 ) Ġx Ġ+ Ġ 0 Ġ+ Ġ( y Ġ- Ġ 1 ) Ġ* Ġ 1 0 Ġelse Ġnull ĊĠĠĠ Ġ// Ġ Ġc Ġ Ġ= Ġif Ġ( ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġx Ġ+ Ġ 0 Ġ+ Ġ( y Ġ+ Ġ 0 ) Ġ* Ġ 1 0 ĊĠĠĠ Ġval Ġs Ġ Ġ= Ġif Ġ( ĠĠĠĠĠĠĠĠ Ġy Ġ< Ġ 9 ) Ġx Ġ+ Ġ 0 Ġ+ Ġ( y Ġ+ Ġ 1 ) Ġ* Ġ 1 0 Ġelse Ġnull ĊĊĠĠĠ Ġval Ġne Ġ= Ġif Ġ( x Ġ< Ġ 9 Ġ&& Ġy Ġ> Ġ 0 ) Ġx Ġ+ Ġ 1 Ġ+ Ġ( y Ġ- Ġ 1 ) Ġ* Ġ 1 0 Ġelse Ġnull ĊĠĠĠ Ġval Ġe Ġ Ġ= Ġif Ġ( x Ġ< Ġ 9 ĠĠĠĠĠĠĠĠ Ġ) Ġx Ġ+ Ġ 1 Ġ+ Ġ( y Ġ+ Ġ 0 ) Ġ* Ġ 1 0 Ġelse Ġnull ĊĠĠĠ Ġval Ġse Ġ= Ġif Ġ( x Ġ< Ġ 9 Ġ&& Ġy Ġ< Ġ 9 ) Ġx Ġ+ Ġ 1 Ġ+ Ġ( y Ġ+ Ġ 1 ) Ġ* Ġ 1 0 Ġelse Ġnull ĊĊĠĠĠ Ġreturn ĠlistOf NotNull ( nw , Ġn , Ġne , Ġw , Ġe , Ġsw , Ġs , Ġse ) Ċ } Ċ Ċ val Ġneighbor Cache Ġ= Ġmutable Map Of < Int , ĠList < Int >>() Ċ fun Ġneighbors Memo ized ( i : ĠInt ): ĠList < Int > Ġ= ĊĠĠĠ Ġneighbor Cache . get Or Put ( i ) Ġ{ ĊĠĠĠĠĠĠĠ Ġneighbors ( i ) ĊĠĠĠ Ġ} Ċ Ċ /* Ċ Ġ* ĠĠ 0 ĠĠ 1 ĠĠ 2 ĠĠ 3 ĠĠ 4 ĠĠ 5 ĠĠ 6 ĠĠ 7 ĠĠ 8 ĠĠ 9 Ċ Ġ* Ġ 1 0 Ġ 1 1 Ġ 1 2 Ġ 1 3 Ġ 1 4 Ġ 1 5 Ġ 1 6 Ġ 1 7 Ġ 1 8 Ġ 1 9 Ċ Ġ* Ġ 2 0 Ġ 2 1 Ġ 2 2 Ġ 2 3 Ġ 2 4 Ġ 2 5 Ġ 2 6 Ġ 2 7 Ġ 2 8 Ġ 2 9 Ċ Ġ* Ġ 3 0 Ġ 3 1 Ġ 3 2 Ġ 3 3 Ġ 3 4 Ġ 3 5 Ġ 3 6 Ġ 3 7 Ġ 3 8 Ġ 3 9 Ċ Ġ* Ġ 4 0 Ġ 4 1 Ġ 4 2 Ġ 4 3 Ġ 4 4 Ġ 4 5 Ġ 4 6 Ġ 4 7 Ġ 4 8 Ġ 4 9 Ċ Ġ* Ġ 5 0 Ġ 5 1 Ġ 5 2 Ġ 5 3 Ġ 5 4 Ġ 5 5 Ġ 5 6 Ġ 5 7 Ġ 5 8 Ġ 5 9 Ċ Ġ* Ġ 6 0 Ġ 6 1 Ġ 6 2 Ġ 6 3 Ġ 6 4 Ġ 6 5 Ġ 6 6 Ġ 6 7 Ġ 6 8 Ġ 6 9 Ċ Ġ* Ġ 7 0 Ġ 7 1 Ġ 7 2 Ġ 7 3 Ġ 7 4 Ġ 7 5 Ġ 7 6 Ġ 7 7 Ġ 7 8 Ġ 7 9 Ċ Ġ* Ġ 8 0 Ġ 8 1 Ġ 8 2 Ġ 8 3 Ġ 8 4 Ġ 8 5 Ġ 8 6 Ġ 8 7 Ġ 8 8 Ġ 8 9 Ċ Ġ* Ġ 9 0 Ġ 9 1 Ġ 9 2 Ġ 9 3 Ġ 9 4 Ġ 9 5 Ġ 9 6 Ġ 9 7 Ġ 9 8 Ġ 9 9 Ċ Ġ*/ Ċ fun Ġdraw Grid Indices () Ġ{ ĊĠĠĠ Ġdraw State (( 0 .. 9 9 ). associate With Ġ{ Ġit Ġ}) Ċ } Ċ Ċ fun Ġdraw State ( state : ĠState , Ġwith Index : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġ( 0 .. 9 ). forEach Ġ{ Ġy Ġ-> ĊĠĠĠĠĠĠĠ Ġ( 0 .. 9 ). forEach Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( with Index ) Ġprint ("% 2 d :% 2 d | Ġ". format ( x Ġ+ Ġy Ġ* Ġ 1 0 , Ġstate [ x Ġ+ Ġy Ġ* Ġ 1 0 ] ?: Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġprint ("% 2 d Ġ". format ( state [ x Ġ+ Ġy Ġ* Ġ 1 0 ] ?: Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln () ĊĠĠĠ Ġ} Ċ } ĊĊ