package Ġe se . kotlin . basics . at _ gol _ grid _ board Ċ Ċ data Ġclass ĠPosition 2 d ( val Ġcolumn : ĠInt , Ġval Ġrow : ĠInt ) Ċ Ċ class ĠBoard ( val Ġcolumns : ĠInt , Ġval Ġrows : ĠInt ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcells : ĠArray < Array < Cell >> Ġ= ĠArray ( rows ) Ġ{ Ġ_ Ġ-> ĠArray ( columns ) Ġ{ ĠCell ( false ) Ġ} Ġ} ĊĊĠĠĠ Ġfun Ġcalculate Next Generation () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( row Idx , Ġrow ) Ġin Ġcells . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( col Idx , Ġcell ) Ġin Ġrow . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell . living Ne ighbours Ġ= Ġcount Living Ne ighbours ( col Idx , Ġrow Idx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġcells ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cell Ġin Ġrow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell . calculate Next Generation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcell At ( column : ĠInt , Ġrow : ĠInt ) Ġ= Ġcells [ row ][ column ] ĊĠĠĠ Ġfun Ġcell At ( position 2 d : ĠPosition 2 d ) Ġ= Ġcells [ position 2 d . row ][ position 2 d . column ] ĊĊĠĠĠ Ġfun Ġset Cells ( cell Definitions : ĠMap < Position 2 d , ĠBoolean >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( cell Definition Ġin Ġcell Definitions . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcell At ( cell Definition . key ). alive Ġ= Ġcell Definition . value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġtry Ġwith Ġ 1 0 0 0 x 1 0 0 0 Ġcells Ġ-> Ġtoo Ġmany Ġobjects Ġare Ġcreated Ġ-> ĠIter ators Ġetc . ĊĠĠĠ Ġ// ĠĠĠ Ġfun Ġcount Living Ne ighbours ( column : ĠInt , Ġrow : ĠInt ) Ġ= Ġ( row Ġ- Ġ 1 .. row Ġ+ Ġ 1 ) ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġrow Idx Ġ-> Ġ( column Ġ- Ġ 1 .. column Ġ+ Ġ 1 ). map Ġ{ Ġcolumn Idx Ġ-> ĠPosition 2 d ( column Idx , Ġrow Idx ) Ġ} Ġ} ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . column Ġin Ġ 0 Ġuntil Ġcolumns Ġ} Ġ// Ġprevent Ġarray Ġout Ġof Ġbounds ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . row Ġin Ġ 0 Ġuntil Ġrows Ġ} Ġ// Ġprevent Ġarray Ġout Ġof Ġbounds ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= ĠPosition 2 d ( column Ġ= Ġcolumn , Ġrow Ġ= Ġrow ) Ġ} Ġ// Ġdo Ġnot Ġcount Ġthe Ġcell Ġitself ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcell At ( it ) Ġ}. count Ġ{ Ġit . alive Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcell IsIn side Board And Alive ( column : ĠInt , Ġrow : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Ġ>= Ġ 0 Ġ&& Ġrow Ġ>= Ġ 0 Ġ&& Ġcolumn Ġ< Ġcolumns Ġ&& Ġrow Ġ< Ġrows Ġ&& Ġcell At ( column , Ġrow ). alive ĊĊĠĠĠ Ġfun Ġcount Living Ne ighbours ( column : ĠInt , Ġrow : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( current Row Ġin Ġrow Ġ- Ġ 1 .. row Ġ+ Ġ 1 ) Ġ{ Ġ// Ġfort un ately Ġthe ĠKotlin Ġcompiler Ġdoes Ġnot Ġcreate ĠRange Ġobjects Ġin Ġthis Ġcase ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( current Column Ġin Ġcolumn Ġ- Ġ 1 .. column Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cell IsIn side Board And Alive ( current Column , Ġcurrent Row ) Ġ&& Ġ!( current Row Ġ== Ġrow Ġ&& Ġcurrent Column Ġ== Ġcolumn )) Ġ// Ġdo Ġnot Ġcount Ġthe Ġcell Ġitself ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcount ĊĊĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ fun ĠString . cells (): ĠMap < Position 2 d , ĠBoolean > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < Position 2 d , ĠBoolean >() ĊĠĠĠ Ġfor Ġ(( row , Ġline ) Ġin Ġthis . lines (). with Index ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( column , Ġchar ) Ġin Ġline . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Position 2 d ( column , Ġrow )] Ġ= Ġ( char Ġ== Ġ'* ') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun ĠMap < Position 2 d , ĠBoolean >. translated To ( column : ĠInt , Ġrow : ĠInt ): ĠMap < Position 2 d , ĠBoolean > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < Position 2 d , ĠBoolean >() ĊĠĠĠ Ġfor Ġ( entry Ġin Ġthis . entries ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult [ Position 2 d ( entry . key . column Ġ+ Ġcolumn , Ġentry . key . row Ġ+ Ġrow )] Ġ= Ġentry . value ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } ĊĊ