# depot / life.f

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67``` ```\ The Game of Life is a cellular automaton devised by the British mathematician \ John Horton Conway in 1970. It is the best-known example of a cellular \ automaton. \ Conway's game of life is described here: \ A cell C is represented by a 1 when alive or 0 when dead, in an m-by-m square \ array of cells. We calculate N - the sum of live cells in C's eight-location \ neighbourhood, then cell C is alive or dead in the next generation based on the \ following table: \ \ C N new C \ 1 0,1 -> 0 # Lonely \ 1 4,5,6,7,8 -> 0 # Overcrowded \ 1 2,3 -> 1 # Lives \ 0 3 -> 1 # It takes three to give birth! \ 0 0,1,2,4,5,6,7,8 -> 0 # Barren \ \ Assume cells beyond the boundary are always dead. \ The "game" is actually a zero-player game, meaning that its evolution is \ determined by its initial state, needing no input from human players. One \ interacts with the Game of Life by creating an initial configuration and \ observing how it evolves. \ Although you should test your implementation on more complex examples such as \ the glider in a larger universe, show the action of the blinker (three adjoining \ cells in a row all alive), over three generations, in a 3 by 3 grid. 64 constant w 16 constant h w h * constant size create univ0 size allot create univ1 size allot create old univ0 , create new univ1 , : clear univ0 size erase univ1 size erase ; : off w * + ; : u@ off old @ + c@ ; : .cols w 0 do i over u@ . loop drop ; : .old h 0 do cr i . i .cols loop ; : x+ ( xy-xy ) swap 1+ w mod swap ; : x- swap 1- dup w and + swap ; : y+ 1+ h mod ; : y- 1- dup h and + ; : alive? u@ ; : (-1,-1) y- x- alive? ; : (0,-1) y- alive? ; : (1,-1) y- x+ alive? ; : (-1,0) x- alive? ; : (1,0) x+ alive? ; : (-1,1) y+ x- alive? ; : (0,1) y+ alive? ; : (1,1) y+ x+ alive? ; : neighbours 2dup (-1,-1) -rot 2dup (0,-1) -rot 2dup (1,-1) -rot 2dup (-1,0) -rot 2dup (1,0) -rot 2dup (-1,1) -rot 2dup (0,1) -rot (1,1) + + + + + + + ; : step 2dup neighbours 3 = -rot alive? or if ." alive" else ." dead" then ; : test0 clear 1 1 0 off old @ + c! 1 2 1 off old @ + c! 1 1 neighbours . ; \ prints 2 : test1 1 0 1 off old @ + c! 1 1 step ; \ prints 'alive' ```