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