package Ġdays Ċ Ċ @ Ad vent Of Code P uzzle ( ĊĠĠĠ Ġname Ġ= Ġ" Like Ġa ĠGIF ĠFor ĠYour ĠY ard ", ĊĠĠĠ Ġurl Ġ= Ġ" https :// ad vent of code . com / 2 0 1 5 / day / 1 8 ", ĊĠĠĠ Ġdate Ġ= ĠDate ( day Ġ= Ġ 1 8 , Ġyear Ġ= Ġ 2 0 1 5 ) Ċ ) Ċ class ĠDay 1 8 ( input : ĠList < String >) Ġ: ĠP uzzle Ġ{ ĊĠĠĠ Ġprivate Ġval Ġgrid Ġ= ĠBoolean Grid . from ( input ) ĊĠĠĠ Ġinternal Ġvar Ġsteps Ġ= Ġ 1 0 0 ĊĊĠĠĠ Ġoverride Ġfun Ġpart One (): ĠInt Ġ= Ġ( 1 .. steps ) ĊĠĠĠĠĠĠĠ Ġ. fold ( grid ) Ġ{ Ġcurrent , Ġ_ Ġ-> Ġcurrent . next () Ġ} ĊĠĠĠĠĠĠĠ Ġ. lights () ĊĊĠĠĠ Ġoverride Ġfun Ġpart Two (): ĠInt Ġ= Ġ( 1 .. steps ) ĊĠĠĠĠĠĠĠ Ġ. fold ( grid ) Ġ{ Ġcurrent , Ġ_ Ġ-> Ġcurrent . turn C orners On (). next (). turn C orners On () Ġ} ĊĠĠĠĠĠĠĠ Ġ. lights () ĊĊĠĠĠ Ġinterface ĠGrid Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġturn On ( x : ĠInt , Ġy : ĠInt ) ĊĠĠĠĠĠĠĠ Ġfun Ġturn Off ( x : ĠInt , Ġy : ĠInt ) ĊĠĠĠĠĠĠĠ Ġfun Ġtoggle ( x : ĠInt , Ġy : ĠInt ) ĊĠĠĠĠĠĠĠ Ġfun Ġlights (): ĠInt ĊĠĠĠĠĠĠĠ Ġfun Ġon ( x : ĠInt , Ġy : ĠInt ): ĠBoolean ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠBoolean Grid . next (): ĠBoolean Grid Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= ĠBoolean Grid ( size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġsize ) Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on ( x , Ġy )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( neighbors ( x , Ġy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 , Ġ 3 Ġ-> Ġnew . turn On ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( neighbors ( x , Ġy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġnew . turn On ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnew ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠBoolean Grid . neighbors ( x : ĠInt , Ġy : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġon Ġ= Ġif Ġ( on ( x , Ġy )) Ġ- 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( dy Ġin Ġ- 1 .. 1 ) Ġfor Ġ( dx Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on ( x Ġ+ Ġdx , Ġy Ġ+ Ġdy )) Ġon ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġon ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠBoolean Grid . turn C orners On (): ĠBoolean Grid Ġ{ ĊĠĠĠĠĠĠĠ Ġturn On ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġturn On ( size Ġ- Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġturn On ( 0 , Ġsize Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġturn On ( size Ġ- Ġ 1 , Ġsize Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBoolean Grid ( val Ġsize : ĠInt ) Ġ: ĠGrid Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlights Ġ= Ġmutable Set Of < Point >() ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġturn On ( x : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlights Ġ+= ĠPoint ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġturn Off ( x : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlights Ġ-= ĠPoint ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtoggle ( x : ĠInt , Ġy : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPoint ( x , Ġy ). let Ġ{ Ġif Ġ( it Ġin Ġlights ) Ġlights Ġ-= Ġit Ġelse Ġlights Ġ+= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon ( x : ĠInt , Ġy : ĠInt ) Ġ= ĠPoint ( x , Ġy ) Ġin Ġlights ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlights () Ġ= Ġlights . size ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom ( lines : ĠCollection < String >): ĠBoolean Grid Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrid Ġ= ĠBoolean Grid ( lines . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines . forEach Indexed Ġ{ Ġy , Ġrow Ġ-> Ġrow . forEach Indexed Ġ{ Ġx , Ġc Ġ-> Ġif Ġ( c Ġ== Ġ'# ') Ġgrid . turn On ( x , Ġy ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgrid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }