: mmap ( m quot -- m' ) '[ _ map ] map ; inline : 2mmap ( m m2 quot -- m' ) '[ _ 2map ] 2map ; inline : aggregate ( v -- v' ) dup dup [ unclip drop f suffix ] bi@ [ 2array ] 2map [ swap prefix ] 2map [ sift ] map ; : neighbours ( m -- m ) [ aggregate ] map flip [ aggregate ] map [ concat ] mmap ; SYMBOLS: on off dying ; : step-cell ( state neighbours -- state' ) [ on = ] filter length swap { { on [ drop dying ] } { dying [ drop off ] } { off [ 2 = [ on ] [ off ] if ] } } case ; : random-world ( xy -- m ) first2 zero-matrix [ drop { on off dying } random ] mmap ; : step-world ( m -- m' ) dup neighbours [ step-cell ] 2mmap ;