variable symbols 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ proc add_baseX {numA numB} { # add two numbers in any base that can be expressed as a string of # unique symbols # # John Ellson <ellson@lucent.com> variable symbols set base [string length $symbols] set idxA [string length $numA] set idxB [string length $numB] set carry 0 set result "" while {$idxA || $idxB || $carry} { if {$idxA} { set digA [string index $numA [incr idxA -1]] set decA [string first $digA $symbols] if {$decA < 0} { puts stderr "invalid digit \"$digA\"" return -1 } } else { set decA 0 } if {$idxB} { set digB [string index $numB [incr idxB -1]] set decB [string first $digB $symbols] if {$decB < 0} { puts stderr "invalid digit \"$digB\"" return -1 } } else { set decB 0 } set sumdec [expr {$decA + $decB + $carry}] if {$sumdec >= $base} { set carry 1 incr sumdec -$base } else { set carry 0 } set result [string index $symbols $sumdec]$result } return $result }