--- loncom/homework/default_homework.lcpm 2006/11/10 17:45:52 1.120 +++ loncom/homework/default_homework.lcpm 2008/09/27 07:26:45 1.141 @@ -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.120 2006/11/10 17:45:52 albertel Exp $ +# $Id: default_homework.lcpm,v 1.141 2008/09/27 07:26:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -157,7 +157,7 @@ sub caparesponse_check { #&LONCAPA_INTERNAL_DEBUG(" type is $type "); if ($type eq 'cs' || $type eq 'ci') { - #for string answers make surec all places spaces occur, there is + #for string answers make sure all places spaces occur, there is #really only 1 space, in both the answer and the response $answer=~s/ +/ /g; $response=~s/ +/ /g; @@ -166,7 +166,7 @@ sub caparesponse_check { $response=~s/[\s,]//g; } if ($type eq 'float' && $unit=~/\$/) { - if ($response!~/^\$/) { return ('NO_UNIT', undef); } + if ($response!~/^\$|\$$/) { return ('NO_UNIT', undef); } $response=~s/\$//g; } if ($type eq 'float' && $unit=~/\,/ && (&check_commas($response)<0)) { @@ -217,6 +217,7 @@ sub caparesponse_check { my $reterror=""; 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') { $result = &maxima_check(&maxima_cas_formula_fix($response),&maxima_cas_formula_fix($answer),\$reterror); } else { @@ -253,53 +254,16 @@ 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(" $answer $response $result "); - return ($result,$reterror) + return ($result,$reterror); } -sub maxima_cas_formula_fix { - my ($expression)=@_; - return &implicit_multiplication($expression); -} - -sub capa_formula_fix { - my ($expression)=@_; - return &implicit_multiplication($expression); -} - -sub implicit_multiplication { - my ($expression)=@_; -# Escape scientific notation, so 3e8 does not become 3*e*8 -# 3e8 -> 3&8; 3e-8 -> 3&-8; 3E+8 -> e&+8 - $expression=~s/(\d+)e([\+\-]*\d+)/$1\&\($2\)/gsi; -# 3x10^8 -> 3&8; 3*10^-8 -> 3&-8 - $expression=~s/(\d+)(?:x|\*)10(?:\^|\*\*)([\+\-]*\d+)/$1\&\($2\)/gsi; -# Fill in multiplication signs -# a b -> a*b;3 b -> 3*b;3 4 -> 3*4 - $expression=~s/(\w)\s+(\w)/$1\*$2/gs; -# )( -> )*(; ) ( -> )*( - $expression=~s/\)\s*\(/\)\*\(/gs; -# 3a -> 3*a; 3( -> 3*(; 3 ( -> 3*(; 3A -> 3*A - $expression=~s/(\d)\s*([a-zA-Z\(])/$1\*$2/gs; -# a ( -> a*( - $expression=~s/(\w)\s+\(/$1\*\(/gs; -# a3 -> a*3; - $expression=~s/([a-zA-Z])(\d)/$1\*$2/gs; -# )a -> )*a; )3 -> )*3; ) 3 -> )*3 - $expression=~s/\)\s*(\w)/\)\*$1/gs; -# 3&8 -> 3e8; 3&-4 -> 3e-4 - $expression=~s/(\d+)\&\(([\+\-]*\d+)\)/$1e$2/gs; - return $expression; -} sub caparesponse_check_list { my $responses=$LONCAPA::CAPAresponse_args{'response'}; - &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)); my $type = $LONCAPA::CAPAresponse_args{'type'}; - &LONCAPA_INTERNAL_DEBUG("Got type :$type:\n"); + my $answerunit=$LONCAPA::CAPAresponse_args{'unit'}; + &LONCAPA_INTERNAL_DEBUG("Got type :$type: answer unit :$answerunit:\n"); my $num_input_lines = scalar(@{$LONCAPA::CAPAresponse_answer->{'answers'}}); @@ -324,8 +288,6 @@ sub caparesponse_check_list { $responses->[$which]=[$responses->[$which]]; } } - &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]}); @@ -341,21 +303,33 @@ sub caparesponse_check_list { &LONCAPA_INTERNAL_DEBUG("Initial final response :$responses->[0][-1]:"); my $unit; - if ($type eq '' || $type eq 'float') { + if ($type eq 'float' || $type eq '') { #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\^\*\/\(\)\+\-]*)$/ ) { $responses->[0][-1]=$1; - $unit=$2; + $unit=&capa_formula_fix($2); + &LONCAPA_INTERNAL_DEBUG("Found unit :$unit:"); } } &LONCAPA_INTERNAL_DEBUG("Final final response :$responses->[0][-1]:$unit:"); $unit=~s/\s//; - if ($unit ne '') { - foreach my $response (@$responses) { - foreach my $element (@$response) { - $element .= " $unit"; - } - } + foreach my $response (@$responses) { + foreach my $element (@$response) { + if (($type eq 'float') || (($type eq '') && ($unit ne ''))) { + $element =~ s/\s//g; + } + my $appendunit=$unit; + if (($unit=~/\%/) && ($answerunit ne '%')) { + $element=$element/100; + $appendunit=~s/\%//; + } + if (($element==0) && ($unit!~/\w/) && ($answerunit=~/\w/)) { + $appendunit=$answerunit; + } + $element .= " $appendunit"; + &LONCAPA_INTERNAL_DEBUG("Made response element :$element:"); + } } foreach my $thisanswer (@{ $LONCAPA::CAPAresponse_answer->{'answers'} }) { @@ -365,7 +339,7 @@ sub caparesponse_check_list { } - &LONCAPA_INTERNAL_DEBUG(&LONCAPA_INTERNAL_Dumper($responses)); +# &LONCAPA_INTERNAL_DEBUG(&LONCAPA_INTERNAL_Dumper($responses)); my %memoized; if ($LONCAPA::CAPAresponse_answer->{'type'} eq 'ordered') { for (my $i=0; $i 12) { - $hm[0]-=12; - $ampm = " pm"; - } - return $dc[0].', '.$dc[1].' '.$dc[2].', '.$dc[4].' at '.$hm[0].':'.$hm[1].$ampm; -} - -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; + my ($partid)=@_; + unless ($partid) { $partid=0; } + return &eval_time(&EXT('resource.'.$partid.'.opendate')); +} + +sub due_date { + my ($partid)=@_; + unless ($partid) { $partid=0; } + return &eval_time(&EXT('resource.'.$partid.'.duedate')); } sub answer_date { - my @dc = split(/\s+/,localtime(&EXT('resource.0.answerdate'))); - 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; + my ($partid)=@_; + unless ($partid) { $partid=0; } + return &eval_time(&EXT('resource.'.$partid.'.answerdate')); +} + +sub open_date_epoch { + my ($partid)=@_; + unless ($partid) { $partid=0; } + 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 {