declare function local:random-digits($length as xs:integer, $min as xs:integer, $max as xs:integer) as xs:integer* { (: generate a sequence of $length random digits in the range $min to $max inclusive :) let $range := $max + 1 - $min return for $i in (1 to $length) return floor(math:random()* $range) + $min }; declare function local:digits-to-number($digits as xs:integer*) as xs:integer { (: convert a sequence of $digits to an integer :) if (count($digits)=1) then $digits else $digits[last()] + local:digits-to-number(subsequence($digits,1,count($digits)-1) ) * 10 }; declare function local:number-to-digits($n as xs:integer ) as xs:integer* { (: generate a sequence of digits from an integer :) if ($n = 0) then () else (local:number-to-digits(floor($n div 10)),$n mod 10) }; declare function local:number-to-row ($number as xs:integer, $cols as xs:integer, $last as xs:boolean) as element(td)* { (: convert an integer into a row of tds, with the last row styled :) let $digits := local:number-to-digits($number) return (element td { if ($last) then "+" else ""}, for $pad in ( 1 to $cols -count($digits)) return element td {()}, for $digit in $digits return element td { if ($last) then attribute class {"underline"} else (), $digit } ) }; declare option exist:serialize "method=xhtml media-type=text/html"; (: get problem spec :) let $columns :=xs:integer(request:get-parameter("columns",4)) let $min := xs:integer(request:get-parameter("min",1)) let $max := xs:integer(request:get-parameter("max",6)) let $rows := xs:integer(request:get-parameter("rows",3)) (: generate the problem :) let $problem := for $i in (1 to $rows) return local:digits-to-number(local:random-digits($columns,$min,$max)) let $sum := sum( $problem) (: the sum is the largest number :) let $cols := count(local:number-to-digits($sum)) return