--- loncom/homework/default_homework.lcpm 2003/02/12 22:45:01 1.57 +++ loncom/homework/default_homework.lcpm 2003/10/23 13:56:07 1.68 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # used by lonxml::xmlparse() as input variable $safeinit to Apache::run::run() # -# $Id: default_homework.lcpm,v 1.57 2003/02/12 22:45:01 albertel Exp $ +# $Id: default_homework.lcpm,v 1.68 2003/10/23 13:56:07 ng Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,14 +42,14 @@ $"=' '; sub caparesponse_check { #not properly used yet: calc #not to be used: $ans_fmt - my ($answer,$type,$tol,$sig,$ans_fmt,$unit,$calc,$samples) = - eval $_[1]. - ';return ($answer,$type,$tol,$sig,$ans_fmt,$unit,$calc,$samples);'; + my ($type,$tol,$sig,$ans_fmt,$unit,$calc,$samples) = + eval $_[2]. + ';return ($type,$tol,$sig,$ans_fmt,$unit,$calc,$samples);'; my $tol_type=''; # gets it's value from whether tol has a % or not done my $sig_lbound=''; #done my $sig_ubound=''; #done - my ($response,$expr)=@_; + my ($answer,$response,$expr)=@_; #type's definitons come from capaParser.h @@ -62,6 +62,8 @@ sub caparesponse_check { $message .="no ws in :$response:\n"; } + if (length($response) > 500) { return "TOO_LONG: Answer too long"; } + if ($type eq '' ) { $message .= "Didn't find a type :$type:$expr: defaulting\n"; if ( $answer eq ($answer *1.0)) { $type = 2; @@ -82,7 +84,7 @@ sub caparesponse_check { #formula type setup the sample points if ($type eq '8') { ($id_list,$points)=split(/@/,$samples); - $message.="Found :$points: points\n"; + $message.="Found :$id_list:$points: points in $samples\n"; } if ($tol eq '') { $tol=0.0; @@ -134,15 +136,15 @@ sub get_array_args { my ($expr,$arg)=@_; # do these first, because who knows what varname the instructor might have used # but it probably isn't $CAPARESPONSE_CHECK_LIST_answer - my $CAPARESPONSE_CHECK_LIST_answer = eval $expr.';return $'.$arg; #' - my $GET_ARRAY_ARGS_result; + my $CAPARESPONSE_CHECK_LIST_answer = eval $expr.';return $'.$arg; #' stupid emacs + my $GET_ARRAY_ARGS_result="expr is $expr\narg is $arg\nfirst answer guess is $CAPARESPONSE_CHECK_LIST_answer\n"; my @GET_ARRAY_ARGS_list; if ($CAPARESPONSE_CHECK_LIST_answer =~ /^\s*[\$\@]/) { (@GET_ARRAY_ARGS_list) = eval $CAPARESPONSE_CHECK_LIST_answer; } $GET_ARRAY_ARGS_result.="error:$@:\n"; # if the eval fails just use what is in the answer exactly - if (!defined(@GET_ARRAY_ARGS_list) || !defined($GET_ARRAY_ARGS_list[0])) { + if (!(@GET_ARRAY_ARGS_list) || !defined($GET_ARRAY_ARGS_list[0])) { $GET_ARRAY_ARGS_result.="list zero is undefined\n"; $GET_ARRAY_ARGS_list[0]=$CAPARESPONSE_CHECK_LIST_answer; } @@ -151,16 +153,19 @@ sub get_array_args { sub caparesponse_check_list { my ($response,$expr)=@_; - my $result; - $expr =~ s/\\/\\\\/g; - $expr =~ s/\'/\\\'/g; - my ($result,@list) = &get_array_args($expr,'answer'); +# $expr =~ s/\\/\\\\/g; +# $expr =~ s/\'/\\\'/g; +# my ($result,@list) = &get_array_args($expr,'answer'); +# $expr =~ s/\\\'/\'/g; +# $expr =~ s/\\\\/\\/g; + my ($result,@list); + @list=@CAPARESPONSE_CHECK_LIST_answer; my $aresult=''; my $current_answer; my $answers=join(':',@list); $result.="Got response :$answers:\n"; my @responselist; - my $type =eval $expr.';return $answer;'; + my $type =eval $expr.';return $type;'; if ($type ne '' && $#list > 0) { (@responselist)=split /,/,$response; } else { @@ -168,7 +173,7 @@ sub caparesponse_check_list { } my $unit=''; $result.="Initial final response :$responselist['-1']:\n"; - if ($type eq '') { + if ($type eq '' || $type eq 'float') { #for numerical problems split off the unit if ( $responselist['-1']=~ /(.*[^\s])\s+([^\s]+)/ ) { $responselist['-1']=$1; @@ -183,14 +188,15 @@ sub caparesponse_check_list { for ($i=0; $i<@list;$i++) { $result.="trying answer :$list[$i]:\n"; my $thisanswer=$list[$i]; - $thisanswer=~ s/\\/\\\\/g; - $thisanswer =~ s/\'/\\\'/g; +# $thisanswer=~ s/\\/\\\\/g; +# $thisanswer =~ s/\'/\\\'/g; + $result.="trying answer :$thisanswer:\n"; if ($unit eq '') { - $aresult=&caparesponse_check($responselist[$i], - $expr.';my $answer=\''.$thisanswer.'\';'); + $aresult=&caparesponse_check($thisanswer,$responselist[$i], + $expr); } else { - $aresult=&caparesponse_check($responselist[$i]." $unit", - $expr.';my $answer=\''.$thisanswer.'\';'); + $aresult=&caparesponse_check($thisanswer,$responselist[$i]." $unit", + $expr); } my ($temp)=split /:/, $aresult; $awards.="$temp,"; @@ -202,15 +208,15 @@ sub caparesponse_check_list { sub tex { if ( $external::target eq "tex" ) { - return @_[0]; + return $_[0]; } else { - return @_[1]; + return $_[1]; } } sub var_in_tex { if ( $external::target eq "tex" ) { - return @_[0]; + return $_[0]; } else { return ""; } @@ -218,12 +224,12 @@ sub var_in_tex { sub web { if ( $external::target eq "tex" ) { - return @_[1]; + return $_[1]; } else { if ( $external::target eq "web" || $external::target eq "answer") { - return @_[2]; + return $_[2]; } else { - return @_[0]; + return $_[0]; } } } @@ -234,26 +240,27 @@ sub html { } } -sub problem { - return '1'; -} - sub hinton { return 0; } sub random { - my ($start,$end,$step)=@_; - if ( ! $hidden::RANDOMINIT ) { - if ($external::randomseed == 0) { $external::randomseed=1; } - &random_set_seed(1,int(abs($external::randomseed))); - &math_random_uniform(); - $hidden::RANDOMINIT=1; - } - if (!defined($step)) { $step=1; } - my $num=1+int(($end-$start)/$step); - my $result=$start + int(&math_random_uniform() * $num)*$step; - return $result; + my ($start,$end,$step)=@_; + if ( ! $hidden::RANDOMINIT ) { + if ($external::randomseed == 0) { $external::randomseed=1; } + if ($external::randomseed =~/,/) { + my ($num1,$num2)=split(/,/,$seed); + &random_set_seed(abs($num1),abs($num2)); + } else { + &random_set_seed(1,int(abs($external::randomseed))); + } + &math_random_uniform(); + $hidden::RANDOMINIT=1; + } + if (!defined($step)) { $step=1; } + my $num=1+int(($end-$start)/$step); + my $result=$start + int(&math_random_uniform() * $num)*$step; + return $result; } sub random_normal { @@ -424,15 +431,15 @@ sub log { log(shift) } sub atan2 { atan2($_[0],$_[1]) } sub sqrt { sqrt(shift) } -sub tan { sin($_[0]) / cos($_[0]) } +sub tan { CORE::sin($_[0]) / CORE::cos($_[0]) } #sub atan { atan2($_[0], 1); } #sub acos { atan2(sqrt(1 - $_[0] * $_[0]), $_[0] ); } #sub asin { atan2($_[0], sqrt(1- $_[0] * $_[0]) ); } -sub log10 { log($_[0])/log(10); } +sub log10 { CORE::log($_[0])/CORE::log(10); } sub factorial { - my $input = int(shift); + my $input = CORE::int(shift); return "Error - unable to take factorial of an negative number ($input)" if $input < 0; return "Error - factorial result is greater than system limit ($input)" if $input > 170; return 1 if $input == 0; @@ -475,14 +482,15 @@ sub sub_string { } sub pow {return $_[0] ** $_[1]; } -sub ceil {return (($_[0]-int($_[0]))== 0.0) ? $_[0] : (($_[0] > 0) ? (int($_[0])+ 1) : int($_[0])); } -sub floor {return (($_[0]-int($_[0]))== 0.0) ? $_[0] : (($_[0] > 0) ? int($_[0]) : (int($_[0])-1)); } +sub ceil {return (($_[0]-CORE::int($_[0]))== 0.0) ? $_[0] : (($_[0] > 0) ? (CORE::int($_[0])+ 1) : CORE::int($_[0])); } +sub floor {return (($_[0]-CORE::int($_[0]))== 0.0) ? $_[0] : (($_[0] > 0) ? CORE::int($_[0]) : (CORE::int($_[0])-1)); } #sub floor {return int($_[0]); } sub format { my ($value,$fmt)=@_; my $dollarmode; if ($fmt =~ /^\$(.*)/) { $fmt=$1; $dollarmode=1; } + $fmt=~s/e/E/g; my $result=sprintf('%.'.$fmt,$value); $result=~s/(E[+-]*)0/$1/; if ($dollarmode) {$result=&dollarmode($result);} @@ -495,12 +503,14 @@ sub prettyprint { my $dollarmode; if ($fmt =~ /^\$(.*)/) { $fmt=$1; $dollarmode=1; } if ($fmt) { $value=sprintf('%.'.$fmt,$value); } - if ($value =~ /([0-9\.\-\+]+)E([0-9\-\+]+)/ ) { + if ($value =~ /([0-9\.\-\+]+)E([0-9\-\+]+)/i ) { my $frac=$1; if ($dollarmode) { $frac=&dollarformat($frac); } my $exponent=$2; $exponent=~s/^\+0*//; $exponent=~s/^-0*/-/; + $exponent=~s/^-0*/-/; + if ($exponent eq '-') { undef($exponent); } if ($exponent) { if ($external::target eq 'web') { $result=$frac.'×10'.$exponent.''; @@ -719,7 +729,7 @@ sub array_moments { $kurt+=$x**4; } $output[2]=$var/($N-1); - $sdev=sqrt($output[2]); + $sdev=CORE::sqrt($output[2]); if ($sdev == 0) { $output[3]="inf-variance=0"; $output[4]="inf-variance=0";