Arjen Markus 2004-02-17 - Elaborating on RS's algorithm to calculate a row in Pascal's triangle (see Pascal) I created the script below. It is a one-dimensional cellular automaton with a few very simple rules.
Variations: the number of colours (variable mod) and the size of the squares (variable size)
# Turn Pascal's triangle into a cellular automaton # # RS's original: # proc pascal {{lastrow ""}} { set res 1 foreach a [lrange $lastrow 1 end] b $lastrow { lappend res [expr $a+$b] } set res } ;# RS # # AM's modulo version # proc pascalam {mod {lastrow ""}} { set res 1 foreach a [lrange $lastrow 1 end] b $lastrow { lappend res [expr ($a+$b)%$mod] } set res } # # Translate the result into colours # proc tocolours {row} { set rowcols {} foreach a $row { lappend rowcols [lindex {white black blue green yellow orange red} $a] } set rowcols } # # Show a row # proc showrow {rowcols xc yc} { global size set xoff [expr {$xc-(([llength $rowcols]+1)/2)*$size}] set x1 $xoff set y1 $yc set y2 [expr {$yc+$size-1}] foreach a $rowcols { set x2 [expr {$x1+$size-1}] .c create rectangle $x1 $y1 $x2 $y2 -fill $a -outline $a set x1 [expr {$x1+$size}] } } # # Create the canvas and show the rows # pack [canvas .c -bg white -width 400 -height 400] -fill both set row 1 set mod 5 set size 2 set xc 200 set yc 0 for { set i 0 } { $i < [expr {400/$size}] } { incr i } { showrow [tocolours [set row [pascalam $mod $row]]] $xc $yc incr yc $size }