A simple animation of Conway's Game of Life
A one line APL expression to calculate successive generations in Conway's Game of Life can be found here.
For a bit of fun, let's take the APL expression and display its output in a window, with a 1 second pause between generations.
Here's an example function using APLX (This example will work on Windows, Macintosh and Linux):
∇nextGeneration←Life currentGeneration
[1] ⍝⍝ Take a matrix of Booleans and returns one
[2] nextGeneration←⊃↑1 currentGeneration∨.^3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂
currentGeneration
∇
∇Animate gen;win
[1] win←'⎕' ⎕NEW 'window'
[2] win.title←'Game of Life'
[3] win.picture.New 'picture'
[4] win.picture.align←¯1
[5] win.picture.imagesize←10×⍴gen
[6] win.OnClose←'→0'
[7] win.Show
[8] :Repeat
[9] win.picture.bitmap←~10/10⌿gen
[10] gen←Life gen
[11] 0 0⍴⎕WE 1
[12] :EndRepeat
∇The Animate function makes use of two system classes, 'Window' and 'Picture'. It sets the picture to fill the whole window (align ¯1) and sets a callback to execute when the window's close button is clicked (→0). It then loops to display each generation as a bitmap using a 10x10 block for each cell.
Here is a sample pattern known as a pulsar, which oscillates between three generations
⍝ Upper-left quadrant of pulsar
pulsar←¯8 ¯8 ↑ 6 6⍴0 0 1 1 0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 0 1 1 1 0
⍝ Fill in other quadrants
pulsar←pulsar∨⊖pulsar←pulsar∨⌽pulsar←17 17 ↑pulsar
⍝ Start the animation
Animate pulsarHere's a screen snapshot of the three generations:
Here's another sample pattern which starts off only one row high but grows indefinitely.
⍝ One row pattern
gun←0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 0
⍝ Use a big grid to see how it evolves
grid←50 50⍴0
grid[25;]←50↑grid
Animate gridHere's a screenshot showing various stages of the pattern's evolution
Author: SimonMarsden
APL Wiki