2 min read

automata


For awhile now I have had more than a passing interest in a computer science phenomenon known as cellular automata.  These are computations that follow a set of rules (aka algorithms) to produce "cells" of that morph overtime and can make elaborate and often complex structures from relatively simple rules.  While these were discovered in the 1940's, the classic example of cellular automata is Conway's Game of Life (https://en.wikipedia.org/wiki/Conway's_Game_of_Life).

Note see that running on a Tandy 100 at my post here:

There happens to be several good books on cellular automata if you want a deeper dive.  Stephen Wolfram, of Wolfram Alpha, wrote an extensive treatise on the topic - https://www.wolframscience.com/nks/

In my exploration of the topic, I determined that the classic block building game Minecraft would be a great avenue to explore building a cellular automaton without too much code.  Using some Python I was able to generate Langton's Ant. Langton's Ant follows these rules:

  • at a white square, turn 90deg clockwise, flip color of square, move forward one step
  • at a black square, turn 90deg counter-clockwise, flip color of square, move forward one step
import time
    from mcpi.minecraft import Minecraft
    mc = Minecraft.create()
    
    while True:
        # Starting position
    	x = 2790
    	y = 90
    	z = 32560
    	deg = 0

        # Set blank canvas
    	mc.setBlocks(x - 500, y, z - 500, x + 500, y, z + 500, 0)

    	for a in range(1, 11000):
    		print(a)
    		block = mc.getBlock(x, y, z)
    		if block == 0:  # air
    		    mc.setBlock(x, y, z, 41)
    		    if deg == 0:
    		        deg = 90
    		        x = x + 1
    		    elif deg == 90:
    		        deg = 180
    		        z = z + 1
    		    elif deg == 180:
    		        deg = 270
    		        x = x - 1
    		    elif deg == 270:
    		        deg = 0
    		        z = z - 1
    		elif block == 41:  # gold
    		    mc.setBlock(x, y, z, 0)
    		    if deg == 0:
    		        deg = 270
    		        x = x - 1
    		    elif deg == 90:
    		        deg = 0
    		        z = z - 1
    		    elif deg == 180:
    		        deg = 90
    		        x = x + 1
    		    elif deg == 270:
    		        deg = 180
    		        z = z + 1	

Then I figured, why not build Martin, Odlyzko and Wolfram's rule 90? (doi:10.1007/BF01223745)
Rule 90 defined by this table:

111 110 101 100 011 010 001 000
0 1 0 1 1 0 1 0
import time
    from mcpi.minecraft import Minecraft
    mc = Minecraft.create()
    
    # Starting blocks
    x = 2719 
    y = 20 
    z = 32482 
    mc.setBlocks(x, y, z, x + 98, y, z + 98, 35)  # whool
    mc.setBlock(2769, y, z, 89)  # set initial gold block

    for b in range(1,99):
        blockminus = 0
        for a in range(1,99):
            # Read blocks
            blockminus = mc.getBlock(x - 1, y, z)
            block = mc.getBlock(x, y, z)
            blockplus = mc.getBlock(x + 1, y, z)
            
            # Set blocks for the automaton machine
            mc.setBlock(x, y + 1, z, block)
            mc.setBlock(x - 3, y + 1, z, 0)
          
            # Rule algorithm to set blocks
            if block == 57: # diamond
                break
            elif blockplus == 89 or blockminus == 89:  # gold block
                if blockplus == 89 and blockminus == 89:
                    mc.setBlock(x, y, z + 1, 35)  # whool
                else:
                    mc.setBlock(x, y, z + 1, 89)  # gold
            x = x + 1
            if a == 98:
                mc.setBlocks(x - 4, y + 1, z, x, y + 1, z, 0)

        x = 2719
        z = z + 1
        print(b)
    
    # Slow down
    time.sleep(3)
    
    # Reset starting blocks
    x = 2719
    y = 20
    z = 32482