version 1.118, 2006/10/02 18:23:38
|
version 1.120, 2006/11/10 17:45:52
|
Line 152 sub caparesponse_check {
|
Line 152 sub caparesponse_check {
|
} |
} |
if ($response=~ /^\s|\s$/) { |
if ($response=~ /^\s|\s$/) { |
$response=~ s:^\s+|\s+$::g; |
$response=~ s:^\s+|\s+$::g; |
#&LONCAPA_INTERNAL_DEBUG("Removed ws now :$response:"); |
&LONCAPA_INTERNAL_DEBUG("Removed ws now :$response:"); |
} |
} |
|
|
#&LONCAPA_INTERNAL_DEBUG(" type is $type "); |
#&LONCAPA_INTERNAL_DEBUG(" type is $type "); |
Line 179 sub caparesponse_check {
|
Line 179 sub caparesponse_check {
|
if (length($response) > 500) { return ('TOO_LONG',undef); } |
if (length($response) > 500) { return ('TOO_LONG',undef); } |
|
|
if ($type eq '' ) { |
if ($type eq '' ) { |
#&LONCAPA_INTERNAL_DEBUG("Didn't find a type :$type: defaulting"); |
&LONCAPA_INTERNAL_DEBUG("Didn't find a type :$type: defaulting"); |
if ( $answer eq ($answer *1.0)) { $type = 2; |
if ( $answer eq ($answer *1.0)) { $type = 2; |
} else { $type = 3; } |
} else { $type = 3; } |
} else { |
} else { |
Line 199 sub caparesponse_check {
|
Line 199 sub caparesponse_check {
|
#formula type setup the sample points |
#formula type setup the sample points |
if ($type eq '8') { |
if ($type eq '8') { |
($id_list,$points)=split(/@/,$samples); |
($id_list,$points)=split(/@/,$samples); |
#&LONCAPA_INTERNAL_DEBUG("Found :$id_list:$points: points in $samples"); |
&LONCAPA_INTERNAL_DEBUG("Found :$id_list:$points: points in $samples"); |
} |
} |
if ($tol eq '') { |
if ($tol eq '') { |
$tol=0.0; |
$tol=0.0; |
Line 251 sub caparesponse_check {
|
Line 251 sub caparesponse_check {
|
elsif ($result =='15') { $result='UNIT_IRRECONCIBLE'; } |
elsif ($result =='15') { $result='UNIT_IRRECONCIBLE'; } |
else {$result = "ERROR: Unknown Result:$result:$@:";} |
else {$result = "ERROR: Unknown Result:$result:$@:";} |
|
|
#&LONCAPA_INTERNAL_DEBUG("RetError $reterror: Answer $answer: Response $response: type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|"); |
&LONCAPA_INTERNAL_DEBUG("RetError $reterror: Answer $answer: Response $response: type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|"); |
#&LONCAPA_INTERNAL_DEBUG(" $answer $response $result "); |
&LONCAPA_INTERNAL_DEBUG(" $answer $response $result "); |
return ($result,$reterror) |
return ($result,$reterror) |
} |
} |
|
|
Line 292 sub implicit_multiplication {
|
Line 292 sub implicit_multiplication {
|
} |
} |
|
|
sub caparesponse_check_list { |
sub caparesponse_check_list { |
my $response=$LONCAPA::CAPAresponse_args{'response'}; |
my $responses=$LONCAPA::CAPAresponse_args{'response'}; |
my $result="Got response :".join(':',@LONCAPA::CAPAresponse_answer).":\n"; |
&LONCAPA_INTERNAL_DEBUG(" answer is ". |
|
&LONCAPA_INTERNAL_Dumper($LONCAPA::CAPAresponse_answer).":\n"); |
|
&LONCAPA_INTERNAL_DEBUG(" respons is ". |
|
&LONCAPA_INTERNAL_Dumper($responses).":\n"); |
&LONCAPA_INTERNAL_DEBUG("args ".join(':',%LONCAPA::CAPAresponse_args)); |
&LONCAPA_INTERNAL_DEBUG("args ".join(':',%LONCAPA::CAPAresponse_args)); |
my @responselist; |
|
my $type = $LONCAPA::CAPAresponse_args{'type'}; |
my $type = $LONCAPA::CAPAresponse_args{'type'}; |
&LONCAPA_INTERNAL_DEBUG("Got type :$type:\n"); |
&LONCAPA_INTERNAL_DEBUG("Got type :$type:\n"); |
my $num_answers = scalar(@{$LONCAPA::CAPAresponse_answer->{'answers'}}); |
|
if ($type ne '' |
my $num_input_lines = |
&& $num_answers > 1) { |
scalar(@{$LONCAPA::CAPAresponse_answer->{'answers'}}); |
(@responselist)=split(/,/,$response); |
|
if (@responselist < $num_answers) { |
if ($type ne '' ) { |
|
if (scalar(@$responses) < $num_input_lines) { |
return 'MISSING_ANSWER'; |
return 'MISSING_ANSWER'; |
} |
} |
if (@responselist > $num_answers) { |
if (scalar(@$responses) > $num_input_lines) { |
return 'EXTRA_ANSWER'; |
return 'EXTRA_ANSWER'; |
} |
} |
} else { |
|
(@responselist)=($response); |
} |
|
|
|
foreach my $which (0..($num_input_lines-1)) { |
|
my $answer_size = |
|
scalar(@{$LONCAPA::CAPAresponse_answer->{'answers'}[$which]}); |
|
if ($type ne '' |
|
&& $answer_size > 1) { |
|
$responses->[$which]=[split(/,/,$responses->[$which])]; |
|
} else { |
|
$responses->[$which]=[$responses->[$which]]; |
|
} |
} |
} |
&LONCAPA_INTERNAL_DEBUG("Initial final response :$responselist['-1']:"); |
&LONCAPA_INTERNAL_DEBUG(" parsed response is ". |
|
&LONCAPA_INTERNAL_Dumper($responses).":\n"); |
|
foreach my $which (0..($num_input_lines-1)) { |
|
my $answer_size = |
|
scalar(@{$LONCAPA::CAPAresponse_answer->{'answers'}[$which]}); |
|
my $response_size = |
|
scalar(@{$responses->[$which]}); |
|
if ($answer_size > $response_size) { |
|
return 'MISSING_ANSWER'; |
|
} |
|
if ($answer_size < $response_size) { |
|
return 'EXTRA_ANSWER'; |
|
} |
|
} |
|
|
|
&LONCAPA_INTERNAL_DEBUG("Initial final response :$responses->[0][-1]:"); |
my $unit; |
my $unit; |
if ($type eq '' || $type eq 'float') { |
if ($type eq '' || $type eq 'float') { |
#for numerical problems split off the unit |
#for numerical problems split off the unit |
if ( $responselist['-1']=~ /(.*[^\s])\s+([^\s]+)/ ) { |
if ( $responses->[0][-1]=~ /(.*[^\s])\s+([^\s]+)/ ) { |
$responselist['-1']=$1; |
$responses->[0][-1]=$1; |
$unit=$2; |
$unit=$2; |
} |
} |
} |
} |
&LONCAPA_INTERNAL_DEBUG("Final final response :$responselist['-1']:$unit:"); |
&LONCAPA_INTERNAL_DEBUG("Final final response :$responses->[0][-1]:$unit:"); |
$unit=~s/\s//; |
$unit=~s/\s//; |
|
if ($unit ne '') { |
|
foreach my $response (@$responses) { |
|
foreach my $element (@$response) { |
|
$element .= " $unit"; |
|
} |
|
} |
|
} |
|
|
foreach my $thisanswer (@{ $LONCAPA::CAPAresponse_answer->{'answers'} }) { |
foreach my $thisanswer (@{ $LONCAPA::CAPAresponse_answer->{'answers'} }) { |
if (!defined($thisanswer)) { |
if (!defined($thisanswer)) { |
return ('ERROR','answer was undefined'); |
return ('ERROR','answer was undefined'); |
} |
} |
} |
} |
|
|
if ($unit ne '') { |
|
foreach my $response (@responselist) { |
|
$response .= " $unit"; |
|
} |
|
} |
|
|
|
|
&LONCAPA_INTERNAL_DEBUG(&LONCAPA_INTERNAL_Dumper($responses)); |
my %memoized; |
my %memoized; |
if ($LONCAPA::CAPAresponse_answer->{'type'} eq 'ordered') { |
if ($LONCAPA::CAPAresponse_answer->{'type'} eq 'ordered') { |
for (my $i=0; $i<scalar(@responselist);$i++) { |
for (my $i=0; $i<scalar(@$responses);$i++) { |
my $answer = $LONCAPA::CAPAresponse_answer->{'answers'}[$i]; |
my $answer = $LONCAPA::CAPAresponse_answer->{'answers'}[$i]; |
my $response = $responselist[$i]; |
my $response = $responses->[$i]; |
my $key = "$answer\0$response"; |
my $key = "$answer\0$response"; |
$memoized{$key} = [&caparesponse_check($answer, $response)]; |
my (@awards,@msgs); |
|
for (my $j=0; $j<scalar(@$response); $j++) { |
|
my ($award,$msg) = &caparesponse_check($answer->[$j], |
|
$response->[$j]); |
|
push(@awards,$award); |
|
push(@msgs, $msg); |
|
} |
|
my ($award,$msg) = |
|
&LONCAPA_INTERNAL_FINALIZEAWARDS(\@awards,\@msgs); |
|
$memoized{$key} = [$award,$msg]; |
} |
} |
} else { |
} else { |
foreach my $response (@responselist) { |
#FIXME broken with unorder responses where one is a <value> |
|
# and the other is a <vector> (need to delay parse til |
|
# inside the loop?) |
|
foreach my $response (@$responses) { |
|
my $response_size = scalar(@{$response}); |
foreach my $answer (@{ $LONCAPA::CAPAresponse_answer->{'answers'} }) { |
foreach my $answer (@{ $LONCAPA::CAPAresponse_answer->{'answers'} }) { |
my $key = "$answer\0$response"; |
my $key = "$answer\0$response"; |
$memoized{$key} = [&caparesponse_check($answer, $response)]; |
my $answer_size = scalar(@{$answer}); |
|
my ($award,$msg); |
|
if ($answer_size > $response_size) { |
|
$award = 'MISSING_ANSWER'; |
|
} elsif ($answer_size < $response_size) { |
|
$award = 'EXTRA_ANSWER'; |
|
} else { |
|
my (@awards,@msgs); |
|
for (my $j=0; $j<scalar(@$response); $j++) { |
|
my ($award,$msg) = &caparesponse_check($answer->[$j], |
|
$response->[$j]); |
|
push(@awards,$award); |
|
push(@msgs, $msg); |
|
} |
|
($award,$msg) = |
|
&LONCAPA_INTERNAL_FINALIZEAWARDS(\@awards,\@msgs); |
|
} |
|
$memoized{$key} = [$award,$msg]; |
} |
} |
} |
} |
} |
} |
|
|
my ($final_award,$final_msg); |
my ($final_award,$final_msg); |
&init_permutation(scalar(@responselist), |
&init_permutation(scalar(@$responses), |
$LONCAPA::CAPAresponse_answer->{'type'}); |
$LONCAPA::CAPAresponse_answer->{'type'}); |
|
|
# possible FIXMEs |
# possible FIXMEs |
Line 369 sub caparesponse_check_list {
|
Line 430 sub caparesponse_check_list {
|
my $order = &get_next_permutation(); |
my $order = &get_next_permutation(); |
my (@awards, @msgs, $i); |
my (@awards, @msgs, $i); |
foreach my $thisanswer (@{ $LONCAPA::CAPAresponse_answer->{'answers'} }) { |
foreach my $thisanswer (@{ $LONCAPA::CAPAresponse_answer->{'answers'} }) { |
my $key = "$thisanswer\0".$responselist[$order->[$i]]; |
my $key = "$thisanswer\0".$responses->[$order->[$i]]; |
push(@awards,$memoized{$key}[0]); |
push(@awards,$memoized{$key}[0]); |
push(@msgs,$memoized{$key}[1]); |
push(@msgs,$memoized{$key}[1]); |
$i++; |
$i++; |
|
|
} |
} |
|
&LONCAPA_INTERNAL_DEBUG(" all awards ".join(':',@awards)); |
|
|
my ($possible_award,$possible_msg) = |
my ($possible_award,$possible_msg) = |
&LONCAPA_INTERNAL_FINALIZEAWARDS(\@awards,\@msgs); |
&LONCAPA_INTERNAL_FINALIZEAWARDS(\@awards,\@msgs); |
|
&LONCAPA_INTERNAL_DEBUG(" pos awards ".$possible_award); |
push(@final_awards,$possible_award); |
push(@final_awards,$possible_award); |
push(@final_msg,$possible_msg); |
push(@final_msg,$possible_msg); |
} |
} |
|
|
|
&LONCAPA_INTERNAL_DEBUG(" all final_awards ".join(':',@final_awards)); |
my ($final_award,$final_msg) = |
my ($final_award,$final_msg) = |
&LONCAPA_INTERNAL_FINALIZEAWARDS(\@final_awards,\@final_msg,undef,1); |
&LONCAPA_INTERNAL_FINALIZEAWARDS(\@final_awards,\@final_msg,undef,1); |
return ($final_award,$final_msg); |
return ($final_award,$final_msg); |