package Ġday 1 1 Ċ Ċ enum Ġclass ĠPlace Ġ{ ĊĠĠĠ ĠEMPTY , ĠT AK EN , ĠF LO OR Ċ } Ċ Ċ data Ġclass ĠGrid ( val Ġlayout : ĠList < List < Place >>) Ċ Ċ interface ĠSimulator Ġ{ ĊĠĠĠ Ġfun Ġrun Sim ulations ( grid : ĠGrid ): ĠGrid Ċ } Ċ Ċ fun Ġparse Input ( input : ĠList < String >): ĠGrid Ġ= ĊĠĠĠ Ġinput . as Sequence () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . trim () Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . toList () Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' L ' Ġ-> ĠPlace . EMPTY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'.' Ġ-> ĠPlace . FLO OR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'#' Ġ-> ĠPlace . TA KEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ("' $ it ' Ġwasn 't Ġexpected Ġhere ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. toList (). let Ġ{ ĠGrid ( it ) Ġ} Ċ Ċ open Ġclass ĠSimulator Impl Ġ: ĠSimulator Ġ{ ĊĠĠĠ Ġprotected Ġopen Ġval Ġthreshold Ġ= Ġ 4 ĊĊĠĠĠ Ġfinal Ġoverride Ġtail rec Ġfun Ġrun Sim ulations ( grid : ĠGrid ): ĠGrid Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Layout Ġ= Ġnext Layout ( grid ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( new Layout Ġ== Ġgrid . layout ) Ġgrid Ġelse Ġrun Sim ulations ( Grid ( new Layout )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠGrid . count Occup ied Ne ighbours ( row : ĠInt , Ġcolumn : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġoccupied Ne ighbours Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( ne ighbour Row Ġin Ġ( row Ġ- Ġ 1 ) .. ( row Ġ+ Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( ne ighbour Column Ġin Ġ( column Ġ- Ġ 1 ) .. ( column Ġ+ Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ne ighbour Column Ġ!= Ġcolumn Ġ|| Ġneighbour Row Ġ!= Ġrow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ne ighbour Row Ġin Ġlayout . indices Ġ&& Ġneighbour Column Ġin Ġlayout [ ne ighbour Row ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout [ ne ighbour Row ][ ne ighbour Column ] Ġ== ĠPlace . TA KEN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoccupied Ne ighbours Count Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoccupied Ne ighbours Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Layout ( grid : ĠGrid ): ĠList < List < Place >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Layout Ġ= Ġmutable ListOf < Mutable List < Place >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġgrid . layout . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Layout . add ( mutable ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( column Ġin Ġgrid . layout [ row ]. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Place Ġ= Ġwhen Ġ( val Ġplace Ġ= Ġgrid . layout [ row ][ column ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace . EMPTY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoccupied Ne ighbours Ġ= Ġgrid . count Occup ied Ne ighbours ( row , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( occup ied Ne ighbours Ġ== Ġ 0 ) ĠPlace . TA KEN Ġelse Ġplace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace . TA KEN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoccupied Ne ighbours Ġ= Ġgrid . count Occup ied Ne ighbours ( row , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( occup ied Ne ighbours Ġ>= Ġthreshold ) ĠPlace . EMPTY Ġelse Ġplace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġplace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Layout [ row ]. add ( new Place ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Layout ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Experimental Std lib Api Ċ class ĠCorrect Simulator Impl Ġ: ĠSimulator Impl () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġthreshold : ĠInt Ġ= Ġ 5 ĊĊĠĠĠ Ġoverride Ġfun ĠGrid . count Occup ied Ne ighbours ( row : ĠInt , Ġcolumn : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcenter Ġ= ĠPair ( row , Ġcolumn ) ĊĠĠĠĠĠĠĠ Ġval Ġneighbour Indexes Ġ= Ġgenerate Ne ighbour Indexes ( center ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġoccupied Ne ighbours Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġsequences Loop @ Ġfor Ġ( indexes Sequence Ġin Ġneighbour Indexes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( rowIndex , ĠcolumnIndex ) Ġin Ġindexes Sequence ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout [ rowIndex ][ column Index ] Ġ== ĠPlace . TA KEN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoccupied Ne ighbours Count Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ sequences Loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( layout [ rowIndex ][ column Index ] Ġ== ĠPlace . EMPTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ sequences Loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġoccupied Ne ighbours Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠGrid . generate Ne ighbour Indexes ( center : ĠPair < Int , ĠInt >) Ġ= ĊĠĠĠĠĠĠĠ Ġbuild List Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Step Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( column Step Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column Step Ġ!= Ġ 0 Ġ|| Ġrow Step Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindexes To Visit Ġ= Ġcenter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. coordinates Sequence ( row Step , Ġcolumn Step ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġit . first Ġin Ġlayout . indices Ġ&& Ġit . second Ġin Ġlayout [ it . first ]. indices Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( indexes To Visit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPair < Int , ĠInt >. coordinates Sequence ( row Step : ĠInt , Ġcolumn Step : ĠInt ): ĠSequence < Pair < Int , ĠInt >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrows Sequence Ġ= Ġgenerate Sequence ( this . first ) Ġ{ Ġit Ġ+ Ġrow Step Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcols Sequence Ġ= Ġgenerate Sequence ( this . second ) Ġ{ Ġit Ġ+ Ġcolumn Step Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrows Sequence . zip ( cols Sequence ). filter Ġ{ Ġit Ġ!= Ġthis Ġ} ĊĠĠĠ Ġ} Ċ }