Pascal's triangle

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
 }