One-dimensional cellular automata: Difference between revisions

Content added Content deleted
No edit summary
Line 3,103: Line 3,103:
(nil nil 1 nil nil)
(nil nil 1 nil nil)
(nil nil nil nil nil)</pre>
(nil nil nil nil nil)</pre>

===More sophisticated===
<lang python>def (uca l) # new datatype: unidim CA
(tag uca (list l len.l))

def (len l) :case (isa uca l) # how to compute its length
rep.l.1

defcoerce uca list # converting it to list
(fn(_) rep._.0)

def (pr l) :case (isa uca l) # how to print it
each x l
pr (if x "#" "_")

# (l i) returns ith cell when l is a uca, and nil when i is out-of-bounds
defcall uca (l i)
if (0 <= i < len.l)
rep.l.0.i

def (gens n l)
prn l
repeat n
zap! nextgen l
prn l

def (nextgen l)
uca+collect+for i 0 (i < len.l) ++i
yield (next (l i-1) l.i (l i+1))

# next state of b, given neighbors a and c
def (next a b c)
if (and a c) not.b
(or a c) b</lang>

Output is prettier now:

<pre>ready! type in an expression, then hit enter twice. ctrl-d exits.
gens 10 (uca '(nil 1 1 1 nil 1 1 nil 1 nil 1 nil 1 nil 1 nil nil 1 nil nil))

_###_##_#_#_#_#__#__
_#_#####_#_#_#______
__##___##_#_#_______
__##___###_#________
__##___#_##_________
__##____###_________
__##____#_#_________
__##_____#__________
__##________________
__##________________
__##________________</pre>


=={{header|XPL0}}==
=={{header|XPL0}}==