import module namespace tf = "http://www.cems.uwe.ac.uk/xmlwiki/tf" at "../lib/tf.xqm"; declare variable $model := ; 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*,$base as xs:integer) as xs:integer { (: convert a sequence of $digits to an integer - $digits are in reverse order :) if (count($digits)=1) then $digits else $digits[last()] + local:digits-to-number(subsequence($digits,1,count($digits)-1), $base ) * $base }; declare function local:number-to-digits($n as xs:integer,$base 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 $base), $base),$n mod $base) }; declare function local:number-to-row ($number as xs:integer, $cols as xs:integer, $last as xs:boolean, $base as xs:integer) as element(td)* { (: convert an integer into a row of tds, with the last row styled :) let $digits := local:number-to-digits($number, $base) 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 the problem spec :) let $spec:= tf:get-parameter-values($model) (: generate the problem :) let $problem := for $i in (1 to xs:integer($spec/rows)) return local:digits-to-number(local:random-digits($spec/columns,$spec/min,$spec/max), $spec/base) let $sum := sum( $problem) (: the sum is the largest number :) let $cols := count(local:number-to-digits($sum,$spec/base)) return Math Problem Generator

Math Problem Generator

{tf:create-span-fields($spec)}

{ for $number at $i in $problem return {local:number-to-row($number,$cols,$i = count($problem),$spec/base)} } { local:number-to-row($sum,$cols,false(),$spec/base) }