/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġan ĠMIT - style Ċ Ġ* Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile Ġor Ġat Ċ Ġ* Ġhttps :// opensource . org / licenses / MIT . Ċ Ġ*/ Ċ Ċ package Ġdec 1 1 Ċ Ċ import Ġkotlin . time . Experimental Time Ċ import Ġkotlin . time . Time Source Ċ import Ġkotlin . time . measure Timed Value Ċ Ċ /* ĠInput : Ġgrid Ġof Ġfloor Ġ(. ), Ġopen Ġ( L ), Ġoccupied Ġ(# ) Ġse ats . ĠOutput Ġis Ġnumber Ġof Ġoccupied Ġse ats Ġafter Ċ Ġapplying Ġrules Ġrepeatedly Ġuntil Ġthey Ġstabil ize . Ġ*/ Ċ Ċ fun ĠList < String >. to Char Arrays () Ġ= ĠArray ( size ) Ġ{ Ġget ( it ). toCharArray () Ġ} Ċ Ċ object ĠPart 1 Ġ{ ĊĠ Ġfun Ġsolve ( input : ĠSequence < String >): ĠString Ġ{ ĊĠĠĠ Ġvar Ġgrid Ġ= ĠGrid ( input . toList (). to Char Arrays ()) ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnext Ġ= Ġgrid . ev olve () ĊĠĠĠĠĠ Ġif Ġ( next Ġ=== Ġgrid ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgrid . cells . map Ġ{ Ġit . count ('# ':: equals ) Ġ}. sum (). toString () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġgrid Ġ= Ġnext ĊĠĠĠĠĠ Ġ// Ġprintln ( grid . cells . map Ġ{ Ġit . join ToString ("") Ġ}. join ToString ("\ n ")) ĊĠĠĠĠĠ Ġ// Ġprintln () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/* ĠIf Ġopen Ġand Ġadjacent Ġto Ġno Ġclosed Ġsp ots , Ġspot Ġbecomes Ġoccupied . ĊĠ ĠIf Ġoccupied Ġand Ġadjacent Ġto Ġ>= Ġ 4 Ġoccupied , Ġbecomes Ġopen . Ġ*/ ĊĠ Ġclass ĠGrid ( val Ġcells : ĠArray < CharArray >) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġheight Ġ= Ġcells . size ĊĠĠĠ Ġprivate Ġval Ġwidth Ġ= Ġcells [ 0 ]. size ĊĊĠĠĠ Ġfun Ġev olve (): ĠGrid Ġ{ ĊĠĠĠĠĠ Ġval Ġnew Cells Ġ= ĠArray ( height ) Ġ{ ĠChar Array ( width ) Ġ} ĊĠĠĠĠĠ Ġvar Ġchanges Ġ= Ġ 0 ĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnew Cells [ i ][ j ] Ġ= Ġwhen Ġ( cells [ i ][ j ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' L ' Ġ-> Ġif Ġ( count Neighbors ( i , Ġj , Ġ'# ') Ġ== Ġ 0 ) Ġ'#' Ġelse Ġ' L ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'#' Ġ-> Ġif Ġ( count Neighbors ( i , Ġj , Ġ'# ') Ġ>= Ġ 4 ) Ġ' L ' Ġelse Ġ'#' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'.' Ġ-> Ġ'.' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġcharacter Ġin Ġ$ cells ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( cells [ i ][ j ] Ġ!= Ġnew Cells [ i ][ j ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanges ++ ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġif Ġ( changes Ġ== Ġ 0 ) Ġthis Ġelse ĠGrid ( new Cells ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcount Neighbors ( row : ĠInt , Ġcol : ĠInt , Ġc : ĠChar ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġvar Ġmatches Ġ= Ġ 0 ĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ(( row Ġ- Ġ 1 ) .. ( row Ġ+ Ġ 1 )). intersect ( 0 Ġuntil Ġheight )) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ(( col Ġ- Ġ 1 ) .. ( col Ġ+ Ġ 1 )). intersect ( 0 Ġuntil Ġwidth )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( cells [ i ][ j ] Ġ== Ġc Ġ&& Ġ( i Ġ!= Ġrow Ġ|| Ġj Ġ!= Ġcol )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatches ++ ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġmatches ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ object ĠPart 2 Ġ{ ĊĠ Ġfun Ġsolve ( input : ĠSequence < String >): ĠString Ġ{ ĊĠĠĠ Ġvar Ġgrid Ġ= ĠGrid ( input . toList (). to Char Arrays ()) ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnext Ġ= Ġgrid . ev olve () ĊĠĠĠĠĠ Ġif Ġ( next Ġ=== Ġgrid ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgrid . cells . map Ġ{ Ġit . count ('# ':: equals ) Ġ}. sum (). toString () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġgrid Ġ= Ġnext ĊĠĠĠĠĠ Ġ// Ġprintln ( grid . cells . map Ġ{ Ġit . join ToString ("") Ġ}. join ToString ("\ n ")) ĊĠĠĠĠĠ Ġ// Ġprintln () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/* ĠDec isions Ġare Ġmade Ġby Ġline - of - sight . Ġ ĠIf Ġopen Ġcan 't Ġsee Ġoccupied , Ġbecomes Ġoccupied . ĊĠ ĠIf Ġoccupied Ġand Ġsees Ġ>= Ġ 5 Ġoccupied , Ġbecomes Ġopen . Ġ*/ ĊĠ Ġclass ĠGrid ( val Ġcells : ĠArray < CharArray >) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġheight Ġ= Ġcells . size ĊĠĠĠ Ġprivate Ġval Ġwidth Ġ= Ġcells [ 0 ]. size ĊĊĠĠĠ Ġfun Ġev olve (): ĠGrid Ġ{ ĊĠĠĠĠĠ Ġval Ġnew Cells Ġ= ĠArray ( height ) Ġ{ ĠChar Array ( width ) Ġ} ĊĠĠĠĠĠ Ġvar Ġchanges Ġ= Ġ 0 ĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnew Cells [ i ][ j ] Ġ= Ġwhen Ġ( cells [ i ][ j ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' L ' Ġ-> Ġif Ġ( count Visible ( i , Ġj , Ġ'# ') Ġ== Ġ 0 ) Ġ'#' Ġelse Ġ' L ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'#' Ġ-> Ġif Ġ( count Visible ( i , Ġj , Ġ'# ') Ġ>= Ġ 5 ) Ġ' L ' Ġelse Ġ'#' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'.' Ġ-> Ġ'.' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġcharacter Ġin Ġ$ cells ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( cells [ i ][ j ] Ġ!= Ġnew Cells [ i ][ j ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanges ++ ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġif Ġ( changes Ġ== Ġ 0 ) Ġthis Ġelse ĠGrid ( new Cells ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcount Visible ( row : ĠInt , Ġcol : ĠInt , Ġc : ĠChar ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġvar Ġmatches Ġ= Ġ 0 ĊĠĠĠĠĠ Ġfor Ġ( ÎĶ r Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( ÎĶ c Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( ÎĶ r Ġ!= Ġ 0 Ġ|| ĠÎĶ c Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġrow Ġ+ ĠÎĶ r ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġcol Ġ+ ĠÎĶ c ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġin Ġ 0 Ġuntil Ġheight Ġ&& Ġj Ġin Ġ 0 Ġuntil Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cells [ i ][ j ] Ġ== Ġc ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatches ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( cells [ i ][ j ] Ġ!= Ġ'.') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= ĠÎĶ r ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj Ġ+= ĠÎĶ c ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġmatches ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ @ Experimental Time Ċ @ Suppress (" UNUSED _ PARAMETER ") Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠ Ġval Ġlines Ġ= Ġgenerate Sequence (:: readLine ). toList () ĊĠ Ġprintln (" Part Ġ 1 :") ĊĠ ĠTime Source . Mon otonic . measure Timed Value Ġ{ ĠPart 1 . solve ( lines . as Sequence ()) Ġ}. let Ġ{ ĊĠĠĠ Ġprintln ( it . value ) ĊĠĠĠ Ġprintln (" Completed Ġin Ġ${ it . duration }") ĊĠ Ġ} ĊĠ Ġprintln (" Part Ġ 2 :") ĊĠ ĠTime Source . Mon otonic . measure Timed Value Ġ{ ĠPart 2 . solve ( lines . as Sequence ()) Ġ}. let Ġ{ ĊĠĠĠ Ġprintln ( it . value ) ĊĠĠĠ Ġprintln (" Completed Ġin Ġ${ it . duration }") ĊĠ Ġ} Ċ } Ċ