class ĠDay 1 1 Ġ{ ĊĊĠĠĠ Ġfun Ġfirst ( input : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġparse Input ( input ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmap . getNum Fl ashes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsecond ( input : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġparse Input ( input ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmap . get Step All Flash () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Input ( input : ĠString ): ĠOctopus Map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġinput . lines () ĊĠĠĠĠĠĠĠ Ġval Ġnum Rows Ġ= Ġlines . size ĊĠĠĠĠĠĠĠ Ġval Ġnum Cols Ġ= Ġlines . first (). length ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠArray ( num Rows Ġ+ Ġ 2 ) Ġ{ ĠArray ( num Cols Ġ+ Ġ 2 ) Ġ{ ĠOctopus . EMPTY Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. num Rows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 1 .. num Cols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ i ][ j ] Ġ= Ġlines [ i Ġ- Ġ 1 ][ j Ġ- Ġ 1 ]. to Oct opus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠOctopus Map ( map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠOctopus ( var Ġenergy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġincrease Energy (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( energy Ġ< ĠMAX _ ENER GY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenergy ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( energy Ġ== ĠMAX _ ENER GY ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( energy Ġ== ĠMAX _ ENER GY ) Ġenergy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠEMPTY Ġ= ĠOctopus ( energy Ġ= Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ ENER GY Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠOctopus Map ( private Ġval Ġmap : ĠArray < Array < Oct opus >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnum Rows Ġ= Ġmap . size Ġ- Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnum Cols Ġ= Ġmap . first (). size Ġ- Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetNum Fl ashes (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Map : ĠArray < Array < Oct opus >> Ġ= Ġmap . deep Copy () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( 1 .. 1 0 0 ). sum Of Ġ{ Ġincrease Step ( temp Map ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Step All Flash (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Map : ĠArray < Array < Oct opus >> Ġ= Ġmap . deep Copy () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Sequence ( seed Ġ= Ġ 1 , ĠInt :: inc ). forEach Ġ{ Ġstep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrease Step ( temp Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp Map . is All Reset ()) Ġreturn Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Not Ġreachable ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġincrease Step ( temp Map : ĠArray < Array < Oct opus >> ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġincrease Energy ( i : ĠInt , Ġj : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp Map [ i ][ j ]. energy Ġ== ĠOctopus . MAX _ ENER GY ) Ġreturn Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( temp Map [ i ][ j ]. increase Energy ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ+ ĠPoint ( i , Ġj ). adjacent Locations . sum Of Ġ{ Ġnext Ġ-> Ġincrease Energy ( next . i , Ġnext . j ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfl ashes Ġ= Ġ( 1 .. num Rows ). sum Of Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 .. num Cols ). sum Of Ġ{ Ġj Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrease Energy ( i , Ġj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. num Rows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 1 .. num Cols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Map [ i ][ j ]. reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfl ashes ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠPoint ( val Ġi : ĠInt , Ġval Ġj : ĠInt ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPoint . up Ġget () Ġ= ĠPoint ( i Ġ- Ġ 1 , Ġj ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPoint . down Ġget () Ġ= ĠPoint ( i Ġ+ Ġ 1 , Ġj ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPoint . left Ġget () Ġ= ĠPoint ( i , Ġj Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPoint . right Ġget () Ġ= ĠPoint ( i , Ġj Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPoint . up Right Ġget () Ġ= ĠPoint ( i Ġ+ Ġ 1 , Ġj Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPoint . down Right Ġget () Ġ= ĠPoint ( i Ġ- Ġ 1 , Ġj Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPoint . down Left Ġget () Ġ= ĠPoint ( i Ġ- Ġ 1 , Ġj Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPoint . up Left Ġget () Ġ= ĠPoint ( i Ġ+ Ġ 1 , Ġj Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPoint . adjacent Locations Ġget () Ġ= ĠlistOf ( up , Ġup Right , Ġright , Ġdown Right , Ġdown , Ġdown Left , Ġleft , Ġup Left ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠArray < Array < Oct opus >> . deep Copy () Ġ= ĠArray ( size ) Ġ{ Ġget ( it ). copyOf () Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠArray < Array < Oct opus >> . is All Reset () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Ġ{ Ġit . all Ġ{ Ġoct opus Ġ-> Ġoct opus . energy Ġ== Ġ 0 Ġ|| Ġoct opus Ġ== ĠOctopus . EMPTY Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠChar . to Oct opus (): ĠOctopus Ġ= ĠOctopus ( digit ToInt ()) Ċ } ĊĊ