I've written a small parrot program which implements a simple deterministic cellular automata of the kind described in Stephen Wolfram's new book, A New Kind of Science.
Code is attached. You can also find it along with examples of output at http://andywardley.com/parrot/automata.html A
#------------------------------------------------------------------------ # # automata.pasm # # Parrot assembly program to implement a cellular automata of the form # described in Stephen Wolfram's book "A New Kind of Science", Wolfram # Media Inc., 2002, ISBN 1-57955-008-8, http:://www.wolframscience.com/ # # Written by Andy Wardley <[EMAIL PROTECTED]> # # This is free software; you can redistribute it and/or modify it under # the same terms as Perl and/or Parrot. # #------------------------------------------------------------------------ # -- configurable options -- # I0 specifies the automata rule as an integer from 0 to 255. # Some interesting rules are: 45, 57, 75, 86, 105, 109, 110, # 129, 131, 150, 154, 182, 225 set I0, 154 # I1 specifies the line width (x) # I2 the number of iterations (y) set I1, 78 set I2, 35 # for wide-terminal users set I1, 150 set I2, 60 # I3 defines the seed cell position which is, by default, the # middle of the row (I1 / 2). You might prefer to set it # manually, e.g. to 77 (the last cell, or I1 - 1) for rules # like 110 that only expand to the left div I3, I1, 2 # -- end of configurable options -- bsr init loop: bsr display bsr iterate dec I2 if I2, loop end #------------------------------------------------------------------------ # init # # Initialise P0 to be hold cells, P1 to define evolution rules. #------------------------------------------------------------------------ init: # define new array of line width new P0, .Array set P0, I1 # iterate over array to initialise set I10, 0 initloop: # at seed point? eq I10, I3, initon initoff: set P0, I10, 0 branch initnext initon: set P0, I10, 1 initnext: inc I10 ne I10, I1, initloop # For the 3 parent cells that we examine, there are 8 possible # states: 000, 001, 010, 011, 100, 101, 110, 111. Each bit of # the automata code number set in I0 indicates the state of the # next-generation cell for each of those states. We extract # these into the array P1 new P1, .Array set P1, 8 set I10, 0 # loop iterator set I11, 1 # bitmap maploop: and I12, I0, I11 set P1, I10, I12 inc I10 mul I11, I11, 2 lt I10, 8, maploop ret #------------------------------------------------------------------------ # iterate # # Perform an iteration of the cellular automata #------------------------------------------------------------------------ iterate: set I10, 0 # index of previous item set I11, 1 # index of current item set I12, 2 # index of next item set I20, P0, 1 # left parent, dup cell 1 first time round set I21, P0, 1 # above parent iterloop: set I22, P0, I12 # right parent # duplicate penultimate cell for last cell set I13, I12 inc I13 ne I13, I1, iteron set I13, I12 dec I13 set I22, P0, I13 iteron: # calculate function lookup number from parents # is there an easier way to do this? set I13, 0 bit1: unless I22, bit2 set I13, 1 bit2: unless I21, bit3 add I13, I13, 2 bit3: unless I20, bitend add I13, I13, 4 bitend: set I14, P1, I13 if I14, iterblack branch, iterwhite iterblack: set I14, 1 branch itermain iterwhite: set I14, 0 itermain: set I20, I21 set I21, I22 set P0, I11, I14 set I10, I11 inc I11 inc I12 lt I12, I1, iterloop ret #------------------------------------------------------------------------ # display # # Display the current state of the cellular automata. #------------------------------------------------------------------------ display: set I10, 0 disploop: set I11, P0, I10 if I11, dispon dispoff: print " " branch dispnext dispon: print "+" dispnext: inc I10 ne I10, I1, disploop print "\n" ret