bmat ← ##.life bmat ⍝ John Conway's "Game of Life". This version of John Conway's cellular automaton takes a boolean matrix argument representing a population of "creatures" and returns a boolean matrix of the succeeding generation. Each cell in the matrix may be occupied by a creature (1) or be empty (0). The two rules of life are: [1] An empty cell that has exactly 3 neighbouring occupied cells is "born" into in the next generation. [2] An occupied cell that has exactly 2 or 3 neighbouring occupied cells, sur- vives to the next generation. Otherwise, its occupant dies (of loneliness or overcrowding). In the following example, only the creature in the centre survives but new ones are born above and below it. The next generation thus has three creatures in a vertical line; the generation after that reverts to the horizontal; and so on. ┼───┼───┼───┼ ┼───┼───┼───┼ ┼───┼───┼───┼ │ · │ · │ · │ │ · │ ⍟ │ · │ │ · │ · │ · │ ┼───┼───┼───┼ ┼───┼───┼───┼ ┼───┼───┼───┼ │ ⍟ │ ⍟ │ ⍟ │ → │ · │ ⍟ │ · │ → │ ⍟ │ ⍟ │ ⍟ │ → ... ┼───┼───┼───┼ ┼───┼───┼───┼ ┼───┼───┼───┼ │ · │ · │ · │ │ · │ ⍟ │ · │ │ · │ · │ · │ ┼───┼───┼───┼ ┼───┼───┼───┼ ┼───┼───┼───┼ For more complex initial configurations, the sequence may develop for many gen- erations before repeating. The R-Pentomino is an example: ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ │ · │ · │ ⍟ │ · │ · │ │ · │ ⍟ │ ⍟ │ · │ · │ │ · │ ⍟ │ · │ ⍟ │ · │ │ · │ · │ ⍟ │ · │ · │ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ │ · │ · │ ⍟ │ ⍟ │ · │ │ · │ ⍟ │ ⍟ │ ⍟ │ · │ │ · │ ⍟ │ ⍟ │ · │ · │ │ · │ ⍟ │ ⍟ │ ⍟ │ · │ │ ⍟ │ · │ · │ ⍟ │ · │ │ ⍟ │ ⍟ │ · │ ⍟ │ ⍟ │ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ │ · │ ⍟ │ ⍟ │ · │ · │ → │ · │ ⍟ │ · │ · │ · │ → │ ⍟ │ · │ · │ ⍟ │ · │ → │ ⍟ │ · │ · │ ⍟ │ · │ → │ ⍟ │ · │ · │ ⍟ │ · │ → │ ⍟ │ · │ · │ ⍟ │ · │ → ... ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ │ · │ · │ ⍟ │ · │ · │ │ · │ ⍟ │ ⍟ │ · │ · │ │ · │ ⍟ │ ⍟ │ · │ · │ │ · │ ⍟ │ ⍟ │ · │ · │ │ · │ ⍟ │ ⍟ │ · │ · │ │ · │ ⍟ │ ⍟ │ · │ · │ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ ┼───┼───┼───┼───┼───┼ 2-manifolds ¯¯¯¯¯¯¯¯¯¯¯ In the coding in this workspace, the use of ⊖ and ⌽ render opposite edges of the creatures' rectangular universe adjacent. In effect, they live on the surface of a torus (doughnut). We illustrate this arrangement by using a little square dia- gram, which shows the orientations of the connections of corresponding edges: ┌─→─┐ torus: ⍋ ⍋ left side joined to right └─→─┘ lower edge joined to upper We can visualise the square, made from a very flexible material, being distorted so that the left and right sides are joined with their ⍋ arrows aligned to form a tube. We then stretch the tube and bend it to join its two circular ends with the → arrows aligned, to form a torus. To investigate universes (technically "2-manifolds") other than the torus, we can apply the life function under various operators, which adjust the edge con- nections. The possibilites are: plane←{ ⍝ ┌───┐ plane: ⍺⍺ block T block ⍵ ⍝ │ │ left and right disconnected } ⍝ └───┘ lower and upper disconnected cylinder←{ ⍝ ┌───┐ cylinder: ⍺⍺ join T block ⍵ ⍝ ⍋ ⍋ left and right joined } ⍝ └───┘ lower and upper disconnected torus←{ ⍝ ┌─→─┐ torus: ⍺⍺ join T join ⍵ ⍝ ⍋ ⍋ left and right joined } ⍝ └─→─┘ lower and upper joined möbius←{ ⍝ ┌─→─┐ möbius strip: ⍺⍺ block T twist ⍵ ⍝ │ │ left and right disconnected } ⍝ └─←─┘ lower and upper twist-joined klein←{ ⍝ ┌─→─┐ klein bottle: ⍺⍺ join T twist ⍵ ⍝ ⍋ ⍋ left and right joined } ⍝ └─←─┘ lower and upper twist-joined rp2←{ ⍝ ┌─→─┐ real projective plane: ⍺⍺ twist T twist ⍵ ⍝ ⍋ ⍒ left and right twist-joined } ⍝ └─←─┘ lower and upper twist-joined ⍝ where: join←{ ⍝ ┌─→─┐ identity operator: ⍺⍺ ⍵ ⍝ top and bottom joined } ⍝ └─→─┘ block←{ ⍝ ┌───┐ temporary 0-row: 1↓⍺⍺ 0⍪⍵ ⍝ top and bottom disconnected } ⍝ └───┘ (manifold-with-boundary) twist←{ ⍝ ┌─←─┐ temporary reversed rows: 1↓¯1↓⍺⍺(⌽¯1↑⍵)⍪⍵⍪⌽1↑⍵ ⍝ top and bottom twisted and } ⍝ └─→─┘ joined T←{⍉⍺⍺⍉⍵} ⍝ under transpose: column-wise ⍢⍉<V> So: glider ← 5 5↑ 3 3⍴ 0 0 1, 1 0 1, 0 1 1 show←{'·⍟'[⎕io+⍵]} ⍝ display function show glider ⍝ glider in small arena ··⍟·· ⍟·⍟·· ·⍟⍟·· ····· ····· Operator →traj← applies its operand cumulatively until a cycle is detected: show¨ life traj glider ⍝ life on a torus (default) ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │··⍟··│·⍟···│··⍟··│·····│·····│·····│·····│·····│·····│·····│·····│····⍟│⍟···⍟│⍟···⍟│⍟⍟··⍟│⍟⍟···│·⍟··⍟│·⍟⍟··│··⍟··│⍟·⍟··│ │⍟·⍟··│··⍟⍟·│···⍟·│·⍟·⍟·│···⍟·│··⍟··│···⍟·│·····│·····│·····│·····│·····│·····│·····│·····│⍟····│⍟⍟···│⍟⍟···│⍟⍟⍟··│·⍟⍟··│ │·⍟⍟··│·⍟⍟··│·⍟⍟⍟·│··⍟⍟·│·⍟·⍟·│···⍟⍟│····⍟│··⍟·⍟│····⍟│···⍟·│····⍟│·····│·····│·····│·····│·····│·····│·····│·····│·⍟···│ │·····│·····│·····│··⍟··│··⍟⍟·│··⍟⍟·│··⍟⍟⍟│···⍟⍟│··⍟·⍟│⍟···⍟│⍟····│⍟··⍟·│⍟····│····⍟│⍟····│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│···⍟·│···⍟⍟│···⍟⍟│⍟··⍟⍟│⍟···⍟│⍟··⍟·│⍟⍟···│·⍟···│·⍟··⍟│·⍟···│⍟····│·⍟···│·····│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ To save typing, we can distil the above expression into a "try" operator: try←{show¨ ⍺⍺ traj ⍵} ⍝ repeat until cycle detected. life torus try glider ⍝ life on a torus. ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │··⍟··│·⍟···│··⍟··│·····│·····│·····│·····│·····│·····│·····│·····│····⍟│⍟···⍟│⍟···⍟│⍟⍟··⍟│⍟⍟···│·⍟··⍟│·⍟⍟··│··⍟··│⍟·⍟··│ │⍟·⍟··│··⍟⍟·│···⍟·│·⍟·⍟·│···⍟·│··⍟··│···⍟·│·····│·····│·····│·····│·····│·····│·····│·····│⍟····│⍟⍟···│⍟⍟···│⍟⍟⍟··│·⍟⍟··│ │·⍟⍟··│·⍟⍟··│·⍟⍟⍟·│··⍟⍟·│·⍟·⍟·│···⍟⍟│····⍟│··⍟·⍟│····⍟│···⍟·│····⍟│·····│·····│·····│·····│·····│·····│·····│·····│·⍟···│ │·····│·····│·····│··⍟··│··⍟⍟·│··⍟⍟·│··⍟⍟⍟│···⍟⍟│··⍟·⍟│⍟···⍟│⍟····│⍟··⍟·│⍟····│····⍟│⍟····│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│···⍟·│···⍟⍟│···⍟⍟│⍟··⍟⍟│⍟···⍟│⍟··⍟·│⍟⍟···│·⍟···│·⍟··⍟│·⍟···│⍟····│·⍟···│·····│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ Now, spot the difference if we apply life under operator [plane]. As soon as the glider hits an edge, parts of it disappear and so it no longer flies: life plane try glider ⍝ life on a plane. ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │··⍟··│·⍟···│··⍟··│·····│·····│·····│·····│·····│·····│·····│·····│·····│ │⍟·⍟··│··⍟⍟·│···⍟·│·⍟·⍟·│···⍟·│··⍟··│···⍟·│·····│·····│·····│·····│·····│ │·⍟⍟··│·⍟⍟··│·⍟⍟⍟·│··⍟⍟·│·⍟·⍟·│···⍟⍟│····⍟│··⍟·⍟│····⍟│···⍟·│·····│·····│ │·····│·····│·····│··⍟··│··⍟⍟·│··⍟⍟·│··⍟⍟⍟│···⍟⍟│··⍟·⍟│····⍟│····⍟│···⍟⍟│ │·····│·····│·····│·····│·····│·····│·····│···⍟·│···⍟⍟│···⍟⍟│···⍟⍟│···⍟⍟│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ (the final ⍟⍟ is a stable configuration, as each cell has exactly 3 neighbours) ⍟⍟ life cylinder try 10 5↑glider ⍝ life on a cylinder. ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │··⍟··│·⍟···│··⍟··│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│ │⍟·⍟··│··⍟⍟·│···⍟·│·⍟·⍟·│···⍟·│··⍟··│···⍟·│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│ │·⍟⍟··│·⍟⍟··│·⍟⍟⍟·│··⍟⍟·│·⍟·⍟·│···⍟⍟│····⍟│··⍟·⍟│····⍟│···⍟·│····⍟│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│ │·····│·····│·····│··⍟··│··⍟⍟·│··⍟⍟·│··⍟⍟⍟│···⍟⍟│··⍟·⍟│⍟···⍟│⍟····│⍟··⍟·│⍟····│····⍟│⍟····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│···⍟·│···⍟⍟│···⍟⍟│⍟··⍟⍟│⍟···⍟│⍟··⍟·│⍟⍟···│·⍟···│·⍟··⍟│·⍟···│⍟····│·⍟···│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│····⍟│⍟···⍟│⍟···⍟│⍟⍟··⍟│⍟⍟···│·⍟··⍟│·⍟⍟··│··⍟··│⍟·⍟··│··⍟··│·⍟···│··⍟··│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│⍟····│⍟⍟···│⍟⍟···│⍟⍟⍟··│·⍟⍟··│⍟·⍟··│··⍟⍟·│···⍟·│·⍟·⍟·│···⍟·│··⍟··│···⍟·│·····│·····│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·⍟···│·⍟⍟··│·⍟⍟··│·⍟⍟⍟·│··⍟⍟·│·⍟·⍟·│···⍟⍟│····⍟│··⍟·⍟│····⍟│···⍟·│····⍟│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│··⍟··│··⍟⍟·│··⍟⍟·│··⍟⍟⍟│···⍟⍟│··⍟·⍟│⍟···⍟│⍟····│⍟··⍟·│⍟····│⍟···⍟│ │·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│···⍟·│···⍟⍟│···⍟⍟│⍟··⍟⍟│⍟···⍟│⍟···⍟│⍟···⍟│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ (again the final configuration is stable as the ⍟s are adjacent across the edge) life möbius try 5 10↑glider ⍝ life on a möbius strip. ┌──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┐ │··⍟·······│·⍟········│··⍟·······│··········│··········│··········│··········│··········│··········│··········│··········│·····⍟····│····⍟⍟····│····⍟⍟····│···⍟⍟⍟····│···⍟⍟·····│···⍟·⍟····│··⍟⍟······│··⍟·······│··⍟·⍟·····│··⍟·······│···⍟······│··⍟·······│··········│··········│··········│··········│··········│··········│··········│··········│··········│ │⍟·⍟·······│··⍟⍟······│···⍟······│·⍟·⍟······│···⍟······│··⍟·······│···⍟······│··········│··········│··········│··········│··········│··········│··········│··········│····⍟·····│···⍟⍟·····│···⍟⍟·····│··⍟⍟⍟·····│··⍟⍟······│··⍟·⍟·····│·⍟⍟·······│·⍟········│·⍟·⍟······│·⍟········│··⍟·······│·⍟········│··········│··········│··········│··········│··········│ │·⍟⍟·······│·⍟⍟·······│·⍟⍟⍟······│··⍟⍟······│·⍟·⍟······│···⍟⍟·····│····⍟·····│··⍟·⍟·····│····⍟·····│···⍟······│····⍟·····│··········│··········│··········│··········│··········│··········│··········│··········│···⍟······│··⍟⍟······│··⍟⍟······│·⍟⍟⍟······│·⍟⍟·······│·⍟·⍟······│⍟⍟········│⍟·········│⍟·⍟·······│⍟·········│·⍟········│··········│··········│ │··········│··········│··········│··⍟·······│··⍟⍟······│··⍟⍟······│··⍟⍟⍟·····│···⍟⍟·····│··⍟·⍟·····│····⍟⍟····│·····⍟····│···⍟·⍟····│·····⍟····│····⍟·····│·····⍟····│··········│··········│··········│··········│··········│··········│··········│··········│··⍟·······│·⍟⍟·······│·⍟⍟·······│⍟⍟⍟·······│⍟⍟········│⍟·⍟·······│⍟·········│⍟·········│⍟⍟········│ │··········│··········│··········│··········│··········│··········│··········│···⍟······│···⍟⍟·····│···⍟⍟·····│···⍟⍟⍟····│····⍟⍟····│···⍟·⍟····│·····⍟⍟···│······⍟···│····⍟·⍟···│······⍟···│·····⍟····│······⍟···│··········│··········│··········│··········│··········│··········│··········│··········│·⍟········│⍟⍟········│⍟⍟········│⍟⍟········│⍟⍟········│ └──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘ (notice how its direction changes as the glider crosses the lower edge) life klein try glider ⍝ life on a klein bottle. ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │··⍟··│·⍟···│··⍟··│·····│·····│·····│·····│·····│·····│·····│⍟····│⍟···⍟│⍟···⍟│⍟⍟··⍟│·⍟··⍟│·⍟···│·⍟··⍟│⍟····│·⍟···│·····│·····│·····│·····│·····│·····│·····│·····│···⍟·│···⍟⍟│···⍟⍟│···⍟⍟│····⍟│⍟··⍟·│⍟····│⍟⍟···│⍟⍟··⍟│·⍟···│·⍟⍟··│··⍟··│⍟·⍟··│ │⍟·⍟··│··⍟⍟·│···⍟·│·⍟·⍟·│···⍟·│··⍟··│···⍟·│·····│·····│⍟····│⍟····│⍟····│⍟····│·····│⍟····│·····│·····│·····│·····│·····│·····│·····│·····│··⍟··│··⍟⍟·│··⍟⍟·│··⍟⍟⍟│···⍟⍟│··⍟·⍟│····⍟│·····│···⍟·│·····│····⍟│·····│⍟····│⍟⍟···│⍟⍟···│⍟⍟⍟··│·⍟⍟··│ │·⍟⍟··│·⍟⍟··│·⍟⍟⍟·│··⍟⍟·│·⍟·⍟·│···⍟⍟│····⍟│··⍟·⍟│····⍟│···⍟·│····⍟│·····│·····│·····│·····│·····│·····│·····│·····│·⍟···│·⍟⍟··│·⍟⍟··│·⍟⍟⍟·│··⍟⍟·│·⍟·⍟·│···⍟⍟│····⍟│··⍟·⍟│····⍟│···⍟·│····⍟│·····│·····│·····│·····│·····│·····│·····│·····│·⍟···│ │·····│·····│·····│··⍟··│··⍟⍟·│··⍟⍟·│··⍟⍟⍟│···⍟⍟│··⍟·⍟│····⍟│·····│···⍟·│·····│····⍟│·····│⍟····│⍟⍟···│⍟⍟···│⍟⍟⍟··│·⍟⍟··│⍟·⍟··│··⍟⍟·│···⍟·│·⍟·⍟·│···⍟·│··⍟··│···⍟·│·····│·····│⍟····│⍟····│⍟····│⍟····│·····│⍟····│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│···⍟·│···⍟⍟│···⍟⍟│···⍟⍟│····⍟│⍟··⍟·│⍟····│⍟⍟···│⍟⍟··⍟│·⍟···│·⍟⍟··│··⍟··│⍟·⍟··│··⍟··│·⍟···│··⍟··│·····│·····│·····│·····│·····│·····│·····│⍟····│⍟···⍟│⍟···⍟│⍟⍟··⍟│·⍟··⍟│·⍟···│·⍟··⍟│⍟····│·⍟···│·····│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ life rp2 try 11 5↑glider ⍝ life on the real projective plane. ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │··⍟··│·⍟···│··⍟··│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│····⍟│····⍟│····⍟│·····│·····│ │⍟·⍟··│··⍟⍟·│···⍟·│·⍟·⍟·│···⍟·│··⍟··│···⍟·│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│···⍟·│···⍟⍟│···⍟⍟│···⍟⍟│····⍟│···⍟·│·····│·····│·····│ │·⍟⍟··│·⍟⍟··│·⍟⍟⍟·│··⍟⍟·│·⍟·⍟·│···⍟⍟│····⍟│··⍟·⍟│····⍟│···⍟·│····⍟│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│··⍟··│··⍟⍟·│··⍟⍟·│··⍟⍟⍟│···⍟⍟│··⍟·⍟│····⍟│·····│···⍟·│·····│····⍟│·····│·····│ │·····│·····│·····│··⍟··│··⍟⍟·│··⍟⍟·│··⍟⍟⍟│···⍟⍟│··⍟·⍟│····⍟│·····│···⍟·│·····│····⍟│·····│·····│·····│·····│·····│·⍟···│·⍟⍟··│·⍟⍟··│·⍟⍟⍟·│··⍟⍟·│·⍟·⍟·│···⍟⍟│····⍟│··⍟·⍟│····⍟│···⍟·│····⍟│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│···⍟·│···⍟⍟│···⍟⍟│···⍟⍟│····⍟│···⍟·│·····│·····│⍟···⍟│⍟⍟···│⍟⍟···│⍟⍟⍟··│·⍟⍟··│⍟·⍟··│··⍟⍟·│···⍟·│·⍟·⍟·│···⍟·│··⍟··│···⍟·│·····│·····│·····│·····│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│····⍟│⍟···⍟│⍟···⍟│⍟⍟··⍟│⍟⍟···│·⍟··⍟│·⍟⍟··│··⍟··│⍟·⍟··│··⍟··│·⍟···│··⍟··│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│⍟····│⍟····│⍟····│⍟⍟···│·⍟···│·⍟···│·⍟···│⍟····│·⍟···│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│·····│·····│⍟····│⍟····│⍟····│⍟····│·····│⍟····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│⍟····│⍟····│⍟····│⍟····│·····│·····│·····│ │·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│⍟····│⍟····│⍟····│⍟····│⍟····│·····│ │·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│·····│⍟····│·⍟···│·····│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ Library ------- If you are viewing this page from an APL session, you can generate a boolean matrix argument for life from any of the following patterns using these steps: 1. While pressing the _right_ mouse button, select the area within a box. 2. From this edit window menu, select Edit->Copy. 3. Open a new edit window to receive the character matrix: )ed -pattern 4. Select Edit->Paste in the new window, then close it. 5. Test using, for example: {⎕←'─'⍪'·⍟'[⎕io+⍵] ⋄ ∇ life ⍵} 20 50↑pattern='⍟' R-Pentomino Glider Glider Gun (Gosper) ┌───┐ ┌───┐ ┌────────────────────────────────────┐ │·⍟⍟│ │··⍟│ │························⍟···········│ │⍟⍟·│ │⍟·⍟│ │······················⍟·⍟···········│ │·⍟·│ │·⍟⍟│ │············⍟⍟······⍟⍟············⍟⍟│ └───┘ └───┘ │···········⍟···⍟····⍟⍟············⍟⍟│ │⍟⍟········⍟·····⍟···⍟⍟··············│ Bistable states │⍟⍟········⍟···⍟·⍟⍟····⍟·⍟···········│ ┌───┐ ┌────┐ │··········⍟·····⍟·······⍟···········│ │⍟⍟⍟│ │·⍟⍟⍟│ │···········⍟···⍟····················│ └───┘ │⍟⍟⍟·│ │············⍟⍟······················│ └────┘ └────────────────────────────────────┘ Stable states The glider gun generates a stream of ┌──┐ ┌────┐ gliders. │⍟⍟│ │·⍟⍟·│ │⍟⍟│ │⍟··⍟│ └──┘ │·⍟⍟·│ └────┘ Technical note -------------- The expression for the next generation in the life game: ↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵ ⍝ Expression for next generation. is developed in real time in YouTube video: http://www.youtube.com/watch?gl=GB&hl=en-GB&v=a9xAKttWgP4&fmt=18 The YouTube expression differs very slightly: +/+⌿ instead of +/, ⌽¨⊂ instead of ∘.⌽⊂ but is essentially the same. Golfing ------- Sometimes, it's fun to look for a shorter expression to do the same job, even at the expense of clarity. This is known as "golfing" - trying to achieve the same result but with fewer strokes. For example +/, is one character shorter than +/+⌿ and ⌽¨⊂ is shorter than ∘.⌽⊂. We can transform our coding into a marginally shorter, if somewhat more complex, expression by observing that: ⍺ ⊖ ⍵ ←→ ⍉ ⍺ ⌽⍉ ⍵ thus: ⍺ ⌽ ⍺ ⊖ ⍵ ←→ ⍺ ⌽ ⍉ ⍺ ⌽⍉ ⍵ ←→ ⍺ ⌽∘⍉ ⍺ ⌽∘⍉ ⍵ ←→ ⍺ ⌽∘⍉⍣2 ⍵ resulting in: ↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.(⌽∘⍉)⍣2⊂⍵ ⍝ Expression for next generation. APL, which can be viewed as an array _notation_, offers many opportunities for such expression transformation. This would be more difficult in a scalar- processing language with explicit loops. Examples: {'·⍟'[⎕io+⍵]}¨life traj 5 8↑3 3⍴0 0 1 1 0 1 0 1 1 ⍝ Glider. ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ │··⍟·····│·⍟······│··⍟·····│········│········│········│········│········│········│········│········│····⍟···│····⍟⍟··│····⍟⍟··│····⍟⍟⍟·│·····⍟⍟·│····⍟·⍟·│······⍟⍟│·······⍟│·····⍟·⍟│·······⍟│······⍟·│·······⍟│········│········│········│········│········│········│········│········│·⍟······│·⍟⍟·····│·⍟⍟·····│·⍟⍟⍟····│··⍟⍟····│·⍟·⍟····│···⍟⍟···│····⍟···│··⍟·⍟···│····⍟···│···⍟····│····⍟···│········│········│········│········│········│········│········│········│······⍟·│······⍟⍟│······⍟⍟│⍟·····⍟⍟│⍟······⍟│⍟·····⍟·│⍟⍟······│·⍟······│·⍟·····⍟│·⍟······│⍟·······│·⍟······│········│········│········│········│········│········│········│········│···⍟····│···⍟⍟···│···⍟⍟···│···⍟⍟⍟··│····⍟⍟··│···⍟·⍟··│·····⍟⍟·│······⍟·│····⍟·⍟·│······⍟·│·····⍟··│······⍟·│········│········│········│········│········│········│········│········│⍟·······│⍟⍟······│⍟⍟······│⍟⍟⍟·····│·⍟⍟·····│⍟·⍟·····│··⍟⍟····│···⍟····│·⍟·⍟····│···⍟····│··⍟·····│···⍟····│········│········│········│········│········│········│········│········│·····⍟··│·····⍟⍟·│·····⍟⍟·│·····⍟⍟⍟│······⍟⍟│·····⍟·⍟│⍟······⍟│⍟·······│⍟·····⍟·│⍟·······│·······⍟│⍟·······│········│········│········│········│········│········│········│········│··⍟·····│··⍟⍟····│··⍟⍟····│··⍟⍟⍟···│···⍟⍟···│··⍟·⍟···│····⍟⍟··│·····⍟··│···⍟·⍟··│·····⍟··│····⍟···│·····⍟··│········│········│········│········│········│········│········│········│·······⍟│⍟······⍟│⍟······⍟│⍟⍟·····⍟│⍟⍟······│·⍟·····⍟│·⍟⍟·····│··⍟·····│⍟·⍟·····│ │⍟·⍟·····│··⍟⍟····│···⍟····│·⍟·⍟····│···⍟····│··⍟·····│···⍟····│········│········│········│········│········│········│········│········│·····⍟··│·····⍟⍟·│·····⍟⍟·│·····⍟⍟⍟│······⍟⍟│·····⍟·⍟│⍟······⍟│⍟·······│⍟·····⍟·│⍟·······│·······⍟│⍟·······│········│········│········│········│········│········│········│········│··⍟·····│··⍟⍟····│··⍟⍟····│··⍟⍟⍟···│···⍟⍟···│··⍟·⍟···│····⍟⍟··│·····⍟··│···⍟·⍟··│·····⍟··│····⍟···│·····⍟··│········│········│········│········│········│········│········│········│·······⍟│⍟······⍟│⍟······⍟│⍟⍟·····⍟│⍟⍟······│·⍟·····⍟│·⍟⍟·····│··⍟·····│⍟·⍟·····│··⍟·····│·⍟······│··⍟·····│········│········│········│········│········│········│········│········│····⍟···│····⍟⍟··│····⍟⍟··│····⍟⍟⍟·│·····⍟⍟·│····⍟·⍟·│······⍟⍟│·······⍟│·····⍟·⍟│·······⍟│······⍟·│·······⍟│········│········│········│········│········│········│········│········│·⍟······│·⍟⍟·····│·⍟⍟·····│·⍟⍟⍟····│··⍟⍟····│·⍟·⍟····│···⍟⍟···│····⍟···│··⍟·⍟···│····⍟···│···⍟····│····⍟···│········│········│········│········│········│········│········│········│······⍟·│······⍟⍟│······⍟⍟│⍟·····⍟⍟│⍟······⍟│⍟·····⍟·│⍟⍟······│·⍟······│·⍟·····⍟│·⍟······│⍟·······│·⍟······│········│········│········│········│········│········│········│········│···⍟····│···⍟⍟···│···⍟⍟···│···⍟⍟⍟··│····⍟⍟··│···⍟·⍟··│·····⍟⍟·│······⍟·│····⍟·⍟·│······⍟·│·····⍟··│······⍟·│········│········│········│········│········│········│········│········│⍟·······│⍟⍟······│⍟⍟······│⍟⍟⍟·····│·⍟⍟·····│ │·⍟⍟·····│·⍟⍟·····│·⍟⍟⍟····│··⍟⍟····│·⍟·⍟····│···⍟⍟···│····⍟···│··⍟·⍟···│····⍟···│···⍟····│····⍟···│········│········│········│········│········│········│········│········│······⍟·│······⍟⍟│······⍟⍟│⍟·····⍟⍟│⍟······⍟│⍟·····⍟·│⍟⍟······│·⍟······│·⍟·····⍟│·⍟······│⍟·······│·⍟······│········│········│········│········│········│········│········│········│···⍟····│···⍟⍟···│···⍟⍟···│···⍟⍟⍟··│····⍟⍟··│···⍟·⍟··│·····⍟⍟·│······⍟·│····⍟·⍟·│······⍟·│·····⍟··│······⍟·│········│········│········│········│········│········│········│········│⍟·······│⍟⍟······│⍟⍟······│⍟⍟⍟·····│·⍟⍟·····│⍟·⍟·····│··⍟⍟····│···⍟····│·⍟·⍟····│···⍟····│··⍟·····│···⍟····│········│········│········│········│········│········│········│········│·····⍟··│·····⍟⍟·│·····⍟⍟·│·····⍟⍟⍟│······⍟⍟│·····⍟·⍟│⍟······⍟│⍟·······│⍟·····⍟·│⍟·······│·······⍟│⍟·······│········│········│········│········│········│········│········│········│··⍟·····│··⍟⍟····│··⍟⍟····│··⍟⍟⍟···│···⍟⍟···│··⍟·⍟···│····⍟⍟··│·····⍟··│···⍟·⍟··│·····⍟··│····⍟···│·····⍟··│········│········│········│········│········│········│········│········│·······⍟│⍟······⍟│⍟······⍟│⍟⍟·····⍟│⍟⍟······│·⍟·····⍟│·⍟⍟·····│··⍟·····│⍟·⍟·····│··⍟·····│·⍟······│··⍟·····│········│········│········│········│········│········│········│········│····⍟···│····⍟⍟··│····⍟⍟··│····⍟⍟⍟·│·····⍟⍟·│····⍟·⍟·│······⍟⍟│·······⍟│·····⍟·⍟│·······⍟│······⍟·│·······⍟│········│········│········│········│········│········│········│········│·⍟······│ │········│········│········│··⍟·····│··⍟⍟····│··⍟⍟····│··⍟⍟⍟···│···⍟⍟···│··⍟·⍟···│····⍟⍟··│·····⍟··│···⍟·⍟··│·····⍟··│····⍟···│·····⍟··│········│········│········│········│········│········│········│········│·······⍟│⍟······⍟│⍟······⍟│⍟⍟·····⍟│⍟⍟······│·⍟·····⍟│·⍟⍟·····│··⍟·····│⍟·⍟·····│··⍟·····│·⍟······│··⍟·····│········│········│········│········│········│········│········│········│····⍟···│····⍟⍟··│····⍟⍟··│····⍟⍟⍟·│·····⍟⍟·│····⍟·⍟·│······⍟⍟│·······⍟│·····⍟·⍟│·······⍟│······⍟·│·······⍟│········│········│········│········│········│········│········│········│·⍟······│·⍟⍟·····│·⍟⍟·····│·⍟⍟⍟····│··⍟⍟····│·⍟·⍟····│···⍟⍟···│····⍟···│··⍟·⍟···│····⍟···│···⍟····│····⍟···│········│········│········│········│········│········│········│········│······⍟·│······⍟⍟│······⍟⍟│⍟·····⍟⍟│⍟······⍟│⍟·····⍟·│⍟⍟······│·⍟······│·⍟·····⍟│·⍟······│⍟·······│·⍟······│········│········│········│········│········│········│········│········│···⍟····│···⍟⍟···│···⍟⍟···│···⍟⍟⍟··│····⍟⍟··│···⍟·⍟··│·····⍟⍟·│······⍟·│····⍟·⍟·│······⍟·│·····⍟··│······⍟·│········│········│········│········│········│········│········│········│⍟·······│⍟⍟······│⍟⍟······│⍟⍟⍟·····│·⍟⍟·····│⍟·⍟·····│··⍟⍟····│···⍟····│·⍟·⍟····│···⍟····│··⍟·····│···⍟····│········│········│········│········│········│········│········│········│·····⍟··│·····⍟⍟·│·····⍟⍟·│·····⍟⍟⍟│······⍟⍟│·····⍟·⍟│⍟······⍟│⍟·······│⍟·····⍟·│⍟·······│·······⍟│⍟·······│········│········│········│········│········│ │········│········│········│········│········│········│········│···⍟····│···⍟⍟···│···⍟⍟···│···⍟⍟⍟··│····⍟⍟··│···⍟·⍟··│·····⍟⍟·│······⍟·│····⍟·⍟·│······⍟·│·····⍟··│······⍟·│········│········│········│········│········│········│········│········│⍟·······│⍟⍟······│⍟⍟······│⍟⍟⍟·····│·⍟⍟·····│⍟·⍟·····│··⍟⍟····│···⍟····│·⍟·⍟····│···⍟····│··⍟·····│···⍟····│········│········│········│········│········│········│········│········│·····⍟··│·····⍟⍟·│·····⍟⍟·│·····⍟⍟⍟│······⍟⍟│·····⍟·⍟│⍟······⍟│⍟·······│⍟·····⍟·│⍟·······│·······⍟│⍟·······│········│········│········│········│········│········│········│········│··⍟·····│··⍟⍟····│··⍟⍟····│··⍟⍟⍟···│···⍟⍟···│··⍟·⍟···│····⍟⍟··│·····⍟··│···⍟·⍟··│·····⍟··│····⍟···│·····⍟··│········│········│········│········│········│········│········│········│·······⍟│⍟······⍟│⍟······⍟│⍟⍟·····⍟│⍟⍟······│·⍟·····⍟│·⍟⍟·····│··⍟·····│⍟·⍟·····│··⍟·····│·⍟······│··⍟·····│········│········│········│········│········│········│········│········│····⍟···│····⍟⍟··│····⍟⍟··│····⍟⍟⍟·│·····⍟⍟·│····⍟·⍟·│······⍟⍟│·······⍟│·····⍟·⍟│·······⍟│······⍟·│·······⍟│········│········│········│········│········│········│········│········│·⍟······│·⍟⍟·····│·⍟⍟·····│·⍟⍟⍟····│··⍟⍟····│·⍟·⍟····│···⍟⍟···│····⍟···│··⍟·⍟···│····⍟···│···⍟····│····⍟···│········│········│········│········│········│········│········│········│······⍟·│······⍟⍟│······⍟⍟│⍟·····⍟⍟│⍟······⍟│⍟·····⍟·│⍟⍟······│·⍟······│·⍟·····⍟│·⍟······│⍟·······│·⍟······│········│ └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ ⍝ Conway's automaton is best viewed as an animation. ⍝ Here is a (pretty rough) gui front end: gui←{⎕io←0 ⍝ Life animation. show←{'·⍟'[⍵]} ⍝ formatting function. f←⎕ns'' ⍝ localise class 9 name. _←'f'⎕wc'form' ''(2 48)('OnTop' 1) ⍝ make a form. _←'f.t'⎕wc'Text'(show ⍵)(0 0) ⍝ make a text box. f.t.(FontObj BCol)←'Dyalog Std'(3/255) ⍝ font and white background. ⍺←500 ⍝ default 500ms delay. ⍺ ⍺⍺{ ⍝ _←⎕dl ⍺÷1000 ⍝ delay ⍺ ms. next←⍺⍺ ⍵ ⍝ next generation. f.t.Text←show next ⍝ display new generation. ⍺ ∇ next ⍝ ... and so on. }⍵ } ⍝ Fix this function and the glider_gun as described in "Library" above ⍝ and then try: 100 life gui 30 80↑glider_gun='⍟' ⍝ glider gun on torus. ⍝ But beware: a glider gun in a torus is doomed because it inevitably shoots ⍝ itself in the back. Artillery in a finite manifold is a dangerous business. ⍝ ⍝ Aficionados of the 1979 arcade game "Asteroids", which took place on a ⍝ torus, will recall that the manufacturers thoughtfully gave their canon ⍝ a range just short of the screen's circumferences. ⍝ See: http://en.wikipedia.org/wiki/Asteroids_(video_game) See also: traj See also: http://www.youtube.com/watch?gl=GB&hl=en-GB&v=a9xAKttWgP4&fmt=18 Back to: contents Back to: Workspaces