--- loncom/homework/response.pm 2004/05/07 17:20:19 1.98 +++ loncom/homework/response.pm 2004/11/06 21:30:35 1.105.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # various response type definitons response definition # -# $Id: response.pm,v 1.98 2004/05/07 17:20:19 albertel Exp $ +# $Id: response.pm,v 1.105.2.1 2004/11/06 21:30:35 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -46,7 +46,8 @@ sub start_response { push (@Apache::inputtags::response,$id); push (@Apache::inputtags::responselist,$id); @Apache::inputtags::inputlist=(); - if ($Apache::inputtags::part eq '') { + if ($Apache::inputtags::part eq '' && + !$Apache::lonhomework::ignore_response_errors) { &Apache::lonxml::error(&HTML::Entities::encode(&mt("Found a <*response> outside of a in a ed problem"),'<>&"')); } if ($Apache::inputtags::response_with_no_part && @@ -84,31 +85,68 @@ sub end_hintresponse { return ''; } -# used by response to set the non-safe space random number generator to something -# that is stable and unique based on the part number and response number +my @randomseeds; +sub pushrandomnumber { + my $rand_alg=&Apache::lonnet::get_rand_alg(); + if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' || + $rand_alg eq '64bit2') { + # do nothing + } else { + my @seed=&Math::Random::random_get_seed(); + push (@randomseeds,\@seed); + } + &Apache::response::setrandomnumber(); +} +sub poprandomnumber { + my $rand_alg=&Apache::lonnet::get_rand_alg(); + if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' || + $rand_alg eq '64bit2') { + return; + } + my $seed=pop(@randomseeds); + if ($seed) { + &Math::Random::random_set_seed(@$seed); + } else { + &Apache::lonxml::error("Unable to restore random algorithm."); + } +} sub setrandomnumber { my $rndseed; $rndseed=&Apache::structuretags::setup_rndseed(); if (!defined($rndseed)) { $rndseed=&Apache::lonnet::rndseed(); } &Apache::lonxml::debug("randseed $rndseed"); # $rndseed=unpack("%32i",$rndseed); - my $rndmod=(&Apache::lonnet::numval($Apache::inputtags::part) << 10); - if (defined($Apache::inputtags::response['-1'])) { - $rndmod+=&Apache::lonnet::numval($Apache::inputtags::response[-1]); - } - if ($rndseed =~/,/) { - { - use integer; - my ($num1,$num2)=split(/,/,$rndseed); - $num1+=$rndmod; - $num2+=$rndmod; - $rndseed="$num1,$num2"; + my $rand_alg=&Apache::lonnet::get_rand_alg(); + my $rndmod; + if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' || + $rand_alg eq '64bit2') { + $rndmod=(&Apache::lonnet::numval($Apache::inputtags::part) << 10); + if (defined($Apache::inputtags::response[-1])) { + $rndmod+=&Apache::lonnet::numval($Apache::inputtags::response[-1]); } } else { + $rndmod=(&Apache::lonnet::numval2($Apache::inputtags::part) << 10); + if (defined($Apache::inputtags::response[-1])) { + $rndmod+=&Apache::lonnet::numval2($Apache::inputtags::response[-1]); + } + } + if ($rndseed =~/([,:])/) { + my $char=$1; + use integer; + my ($num1,$num2)=split(/\Q$char\E/,$rndseed); + $num1+=$rndmod; + $num2+=$rndmod; + if($Apache::lonnet::_64bit) { $num1=(($num1<<32)>>32); $num2=(($num2<<32)>>32); } + $rndseed=$num1.$char.$num2; + } else { $rndseed+=$rndmod; + if($Apache::lonnet::_64bit) { + use integer; + $rndseed=(($rndseed<<32)>>32); + } } - &Apache::lonnet::setup_random_from_rndseed($rndseed); &Apache::lonxml::debug("randseed $rndseed"); + &Apache::lonnet::setup_random_from_rndseed($rndseed); return ''; } @@ -188,9 +226,16 @@ sub meta_part_order { if (@Apache::inputtags::partlist) { my @parts=@Apache::inputtags::partlist; shift(@parts); - return ''.join(',',@parts).''; + return ''.join(',',@parts).''."\n"; } else { - return '0'; + return '0'."\n"; + } +} + +sub meta_response_order { + if (@Apache::inputtags::responselist) { + return ''.join(',',@Apache::inputtags::responselist). + ''."\n"; } } @@ -460,12 +505,14 @@ sub answer_footer { } sub showallfoils { - my $return=0; - if (defined($ENV{'form.showallfoils'}) && - $ENV{'request.state'} eq 'construct') { - $return=1; + if (defined($ENV{'form.showallfoils'})) { + my ($symb)=&Apache::lonxml::whichuser(); + if ($ENV{'request.state'} eq 'construct' || + ($ENV{'user.adv'} && $symb eq '')) { + return 1; + } } - return $return; + return 0; } sub getresponse { @@ -490,7 +537,11 @@ sub getresponse { $Apache::lonhomework::results{"resource.$part.$id.scantron"}.= $response; if ($resulttype ne 'letter') { - $response = $let_to_num{$response}; + if ($resulttype eq 'A is 1') { + $response = $let_to_num{$response}+1; + } else { + $response = $let_to_num{$response}; + } } } else { $response = $ENV{$formparm};