version 1.133, 2008/03/06 14:27:43
|
version 1.146, 2009/12/27 19:40:42
|
Line 217 sub caparesponse_check {
|
Line 217 sub caparesponse_check {
|
|
|
my $reterror=""; |
my $reterror=""; |
my $result; |
my $result; |
if ((($type eq '9') || ($type eq '8')) && ($response=~/\=/)) { return ('BAD_FORMULA','Please submit just an expression, not an equation.'); } |
if (($type eq '9') || ($type eq '8')) { |
|
if ($response=~/\=/) { |
|
return ('BAD_FORMULA','Please submit just an expression, not an equation.'); |
|
} elsif ($response =~ /\,/ and $response !~ /^\s*\{.*\}\s*$/) { |
|
return ('BAD_FORMULA'); |
|
} |
|
} |
if ($type eq '9') { |
if ($type eq '9') { |
$result = &maxima_check(&maxima_cas_formula_fix($response),&maxima_cas_formula_fix($answer),\$reterror); |
$result = &maxima_check(&maxima_cas_formula_fix($response),&maxima_cas_formula_fix($answer),\$reterror); |
} else { |
} else { |
Line 254 sub caparesponse_check {
|
Line 260 sub caparesponse_check {
|
|
|
&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 303 sub caparesponse_check_list {
|
Line 309 sub caparesponse_check_list {
|
|
|
&LONCAPA_INTERNAL_DEBUG("Initial final response :$responses->[0][-1]:"); |
&LONCAPA_INTERNAL_DEBUG("Initial final response :$responses->[0][-1]:"); |
my $unit; |
my $unit; |
if ($type eq '' || $type eq 'float') { |
if ($type eq 'float' || $type eq '') { |
#for numerical problems split off the unit |
#for numerical problems split off the unit |
# if ( $responses->[0][-1]=~ /(.*[^\s])\s+([^\s]+)/ ) { |
# if ( $responses->[0][-1]=~ /(.*[^\s])\s+([^\s]+)/ ) { |
if ( $responses->[0][-1]=~ /^([\d\.\,\s\$]*(?:(?:[xX\*]10[\^\*]*|[eE]*)[\+\-]*\d*)*(?:^|\S)\d+)([\$\s\w\^\*\/\(\)\+\-]*[^\d\.\s\,][\$\s\w\^\*\/\(\)\+\-]*)$/ ) { |
if ( $responses->[0][-1]=~ /^([\d\.\,\s\$]*(?:(?:[xX\*]10[\^\*]*|[eE]*)[\+\-]*\d*)*(?:^|\S)\d+)([\$\s\w\^\*\/\(\)\+\-]*[^\d\.\s\,][\$\s\w\^\*\/\(\)\+\-]*)$/ ) { |
Line 316 sub caparesponse_check_list {
|
Line 322 sub caparesponse_check_list {
|
$unit=~s/\s//; |
$unit=~s/\s//; |
foreach my $response (@$responses) { |
foreach my $response (@$responses) { |
foreach my $element (@$response) { |
foreach my $element (@$response) { |
$element =~ s/\s//g; |
if (($type eq 'float') || (($type eq '') && ($unit ne ''))) { |
|
$element =~ s/\s//g; |
|
} |
my $appendunit=$unit; |
my $appendunit=$unit; |
if ($unit=~/\%/) { |
# if (($unit=~/\%/) && ($answerunit ne '%')) { |
$element=$element/100; |
# $element=$element/100; |
$appendunit=~s/\%//; |
# $appendunit=~s/\%//; |
} |
# } |
if (($element==0) && ($unit!~/\w/) && ($answerunit=~/\w/)) { |
if (($element==0) && ($unit!~/\w/) && ($answerunit=~/\w/)) { |
$appendunit=$answerunit; |
$appendunit=$answerunit; |
} |
} |
Line 424 sub caparesponse_check_list {
|
Line 432 sub caparesponse_check_list {
|
} |
} |
|
|
sub cas { |
sub cas { |
my ($system,$input)=@_; |
my ($system,$input,$library)=@_; |
my $output; |
my $output; |
|
my $dump; |
if ($system eq 'maxima') { |
if ($system eq 'maxima') { |
$output=&maxima_eval($input); |
$output=&maxima_eval($input,$library); |
|
} elsif ($system eq 'R') { |
|
($output,$dump)=&r_eval($input,$library,0); |
|
} else { |
|
$output='Error: unrecognized CAS'; |
} |
} |
return $output; |
return $output; |
} |
} |
|
|
|
sub cas_hashref { |
|
my ($system,$input,$library)=@_; |
|
if ($system eq 'maxima') { |
|
return 'Error: unsupported CAS'; |
|
} elsif ($system eq 'R') { |
|
return &r_eval($input,$library,1); |
|
} else { |
|
return 'Error: unrecognized CAS'; |
|
} |
|
} |
|
|
|
# |
|
# cas_hashref_entry takes a list of indices and gets the entry in a hash generated by Rreturn. |
|
# Call: cas_hashref_entry(Rvalue, index1, index2, ...) where Rvalue is a hash returned by Rreturn. |
|
# Rentry will return the first scalar value it encounters (ignoring excess indices). |
|
# If an invalid key is given, it returns undef. |
|
# |
|
sub cas_hashref_entry { |
|
return &Rentry(@_); |
|
} |
|
|
|
# |
|
# cas_hashref_array takes a list of indices and gets a column array from a hash generated by Rreturn. |
|
# Call: cas_hashref_array(Rvalue, index1, index2, ...) where Rvalue is a hash returned by Rreturn. |
|
# If an invalid key is given, it returns undef. |
|
# |
|
sub cas_hashref_array { |
|
return &Rarray(@_); |
|
} |
|
|
sub tex { |
sub tex { |
if ( $external::target eq "tex" ) { |
if ( $external::target eq "tex" ) { |
return $_[0]; |
return $_[0]; |
Line 1024 sub sec {
|
Line 1067 sub sec {
|
return $sec; |
return $sec; |
} |
} |
|
|
|
sub submission { |
|
my ($partid,$responseid,$subnumber)=@_; |
|
my $sub=''; |
|
if ($subnumber) { $sub=$subnumber.':'; } |
|
return &EXT('user.resource.'.$sub.'resource.'.$partid.'.'.$responseid.'.submission'); |
|
} |
|
|
|
sub currentpart { |
|
return $external::part; |
|
} |
|
|
|
sub eval_time { |
|
my ($timestamp)=@_; |
|
unless ($timestamp) { return ''; } |
|
return &locallocaltime($timestamp); |
|
} |
|
|
sub open_date { |
sub open_date { |
my @dc = split(/\s+/,localtime(&EXT('resource.0.opendate'))); |
my ($partid)=@_; |
return '' if ($dc[0] eq "Wed" and $dc[2] == 31 and $dc[4] == 1969); |
unless ($partid) { $partid=0; } |
my @hm = split(/:/,$dc[3]); |
return &eval_time(&EXT('resource.'.$partid.'.opendate')); |
my $ampm = " am"; |
} |
if ($hm[0] > 12) { |
|
$hm[0]-=12; |
sub due_date { |
$ampm = " pm"; |
my ($partid)=@_; |
} |
unless ($partid) { $partid=0; } |
return $dc[0].', '.$dc[1].' '.$dc[2].', '.$dc[4].' at '.$hm[0].':'.$hm[1].$ampm; |
return &eval_time(&EXT('resource.'.$partid.'.duedate')); |
} |
|
|
|
sub due_date { |
|
my @dc = split(/\s+/,localtime(&EXT('resource.0.duedate'))); |
|
return '' if ($dc[0] eq "Wed" and $dc[2] == 31 and $dc[4] == 1969); |
|
my @hm = split(/:/,$dc[3]); |
|
my $ampm = " am"; |
|
if ($hm[0] > 12) { |
|
$hm[0]-=12; |
|
$ampm = " pm"; |
|
} |
|
return $dc[0].', '.$dc[1].' '.$dc[2].', '.$dc[4].' at '.$hm[0].':'.$hm[1].$ampm; |
|
} |
} |
|
|
sub answer_date { |
sub answer_date { |
my @dc = split(/\s+/,localtime(&EXT('resource.0.answerdate'))); |
my ($partid)=@_; |
return '' if ($dc[0] eq "Wed" and $dc[2] == 31 and $dc[4] == 1969); |
unless ($partid) { $partid=0; } |
my @hm = split(/:/,$dc[3]); |
return &eval_time(&EXT('resource.'.$partid.'.answerdate')); |
my $ampm = " am"; |
} |
if ($hm[0] > 12) { |
|
$hm[0]-=12; |
sub open_date_epoch { |
$ampm = " pm"; |
my ($partid)=@_; |
} |
unless ($partid) { $partid=0; } |
return $dc[0].', '.$dc[1].' '.$dc[2].', '.$dc[4].' at '.$hm[0].':'.$hm[1].$ampm; |
return &EXT('resource.'.$partid.'.opendate'); |
|
} |
|
|
|
sub due_date_epoch { |
|
my ($partid)=@_; |
|
unless ($partid) { $partid=0; } |
|
return &EXT('resource.'.$partid.'.duedate'); |
|
} |
|
|
|
sub answer_date_epoch { |
|
my ($partid)=@_; |
|
unless ($partid) { $partid=0; } |
|
return &EXT('resource.'.$partid.'.answerdate'); |
} |
} |
|
|
sub array_moments { |
sub array_moments { |