[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. [WikiDbImage pascal.jpg] 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 } ---- [[ [Category Toys] ]]