Diff for /loncom/homework/default_homework.lcpm between versions 1.115 and 1.116

version 1.115, 2006/07/28 15:22:28 version 1.116, 2006/09/29 20:55:33
Line 33  $pi=atan2(1,1)*4; Line 33  $pi=atan2(1,1)*4;
 $rad2deg=180.0/$pi;  $rad2deg=180.0/$pi;
 $deg2rad=$pi/180.0;  $deg2rad=$pi/180.0;
 $"=' ';  $"=' ';
   use strict;
   {
       my $n = 0;
       my $total = 0;
       my $num_left = 0;
       my @order;
       my $type;
   
       sub init_permutation {
    my ($size,$requested_type) = @_;
    @order = (0..$size-1);
    $n = $size;
    $type = $requested_type;
    if ($type eq 'ordered') {
       $total = $num_left = 1;
    } elsif ($type eq 'unordered') {
       $total = $num_left = &factorial($size);
    } else {
       die("Unkown type: $type");
    }
       }
   
       sub get_next_permutation {
    if ($num_left == $total) {
       $num_left--;
       return @order;
    }
   
    # Find largest index j with a[j] < a[j+1]
   
    my $j = scalar(@order) - 2;
    while ($order[$j] > $order[$j+1]) {
       $j--;
    }
   
    # Find index k such that a[k] is smallest integer
    # greater than a[j] to the right of a[j]
   
    my $k = scalar(@order) - 1;
    while ($order[$j] > $order[$k]) {
       $k--;
    }
   
    # Interchange a[j] and a[k]
   
    @order[($k,$j)] = @order[($j,$k)];
   
    # Put tail end of permutation after jth position in increasing order
   
    my $r = scalar(@order) - 1;
    my $s = $j + 1;
   
    while ($r > $s) {
       @order[($s,$r)]=@order[($r,$s)];
       $r--;
       $s++;
    }
   
    $num_left--;
    return(@order);
       }
       
       sub get_permutations_left {
    return $num_left;
       }
   }
   
 sub check_commas {  sub check_commas {
     my ($response)=@_;      my ($response)=@_;
Line 78  sub caparesponse_check { Line 144  sub caparesponse_check {
   
   
     #type's definitons come from capaParser.h      #type's definitons come from capaParser.h
     my $message='';  
     #remove leading and trailing whitespace      #remove leading and trailing whitespace
     if (!defined($response)) {      if (!defined($response)) {
  $response='';   $response='';
     }      }
     if ($response=~ /^\s|\s$/) {      if ($response=~ /^\s|\s$/) {
  $response=~ s:^\s+|\s+$::g;   $response=~ s:^\s+|\s+$::g;
  $message .="Removed ws now :$response:\n";   &LONCAPA_INTENAL_DEBUG("Removed ws now :$response:");
     } else {  
  $message .="no ws in :$response:\n";  
     }      }
   
     &LONCAPA_INTERNAL_DEBUG(" type is $type ");      &LONCAPA_INTERNAL_DEBUG(" type is $type ");
     if ($type eq 'cs' || $type eq 'ci') {      if ($type eq 'cs' || $type eq 'ci') {
  #for string answers make surec all places spaces occur, there is    #for string answers make surec all places spaces occur, there is 
Line 113  sub caparesponse_check { Line 178  sub caparesponse_check {
     if (length($response) > 500) { return "TOO_LONG: Answer too long"; }      if (length($response) > 500) { return "TOO_LONG: Answer too long"; }
   
     if ($type eq '' ) {      if ($type eq '' ) {
  $message .= "Didn't find a type :$type: defaulting\n";   &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 133  sub caparesponse_check { Line 198  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);
  $message.="Found :$id_list:$points: points in $samples\n";   &LONCAPA_INTERNAL_DEBUG("Found :$id_list:$points: points in $samples");
     }      }
     if ($tol eq '') {      if ($tol eq '') {
  $tol=0.0;   $tol=0.0;
Line 185  sub caparesponse_check { Line 250  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:$@:";}
   
     return ("$result:\nRetError $reterror:\nAnswer $answer:\nResponse $response:\n type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|\n$message",$reterror);      &LONCAPA_INTERNAL_DEBUG("RetError $reterror: Answer $answer: Response $response:  type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|",$reterror);
       return ($result,$reterror)
 }  }
   
 sub maxima_cas_formula_fix {  sub maxima_cas_formula_fix {
Line 229  sub caparesponse_check_list { Line 295  sub caparesponse_check_list {
     &LONCAPA_INTERNAL_DEBUG("args ".join(':',%LONCAPA::CAPAresponse_args));      &LONCAPA_INTERNAL_DEBUG("args ".join(':',%LONCAPA::CAPAresponse_args));
     my @responselist;      my @responselist;
     my $type = $LONCAPA::CAPAresponse_args{'type'};      my $type = $LONCAPA::CAPAresponse_args{'type'};
     $result.="Got type :$type:\n";      &LONCAPA_INTERNAL_DEBUG("Got type :$type:\n");
     if ($type ne '' && $#LONCAPA::CAPAresponse_answer > 0) {      my $num_answers = scalar(@{$LONCAPA::CAPAresponse_answer->{'answers'}});
       if ($type ne '' 
    && $num_answers > 1) {
  (@responselist)=split(/,/,$response);   (@responselist)=split(/,/,$response);
  if (@responselist < @LONCAPA::CAPAresponse_answer) {   if (@responselist < $num_answers) {
     return 'MISSING_ANSWER';      return 'MISSING_ANSWER';
  }   }
  if (@responselist > @LONCAPA::CAPAresponse_answer) {   if (@responselist > $num_answers) {
     return 'EXTRA_ANSWER';      return 'EXTRA_ANSWER';
  }   }
     } else {      } else {
  (@responselist)=($response);   (@responselist)=($response);
     }      }
     $result.="Initial final response :$responselist['-1']:\n";      &LONCAPA_INTERNAL_DEBUG("Initial final response :$responselist['-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
Line 250  sub caparesponse_check_list { Line 318  sub caparesponse_check_list {
     $unit=$2;      $unit=$2;
  }   }
     }      }
     $result.="Final final response :$responselist['-1']:$unit:\n";      &LONCAPA_INTERNAL_DEBUG("Final final response :$responselist['-1']:$unit:");
     $unit=~s/\s//;      $unit=~s/\s//;
   
     my ($awards, @msgs, $i);      #&reset_caparesponse_memoization();
     foreach my $thisanswer (@LONCAPA::CAPAresponse_answer) {      my ($final_award,$final_msg);
  my ($msg,$aresult);      &init_permutation(scalar(@responselist),
  $result.="trying answer :$thisanswer:\n";        $LONCAPA::CAPAresponse_answer->{'type'});
  if (defined($thisanswer)) {      while( &get_permutations_left() ) {
     if ($unit eq '') {   my @responses_ordered = @responselist[&get_next_permutation()];
  ($aresult,$msg)=&caparesponse_check($thisanswer,   my (@awards, @msgs, $i);
     $responselist[$i]);   foreach my $thisanswer (@{ $LONCAPA::CAPAresponse_answer->{'answers'} }) {
       my ($msg,$aresult);
       if (defined($thisanswer)) {
    my $response = $responses_ordered[$i];
    if ($unit eq '') {
       $response .= " $unit";
    }
    ($aresult,$msg)=&caparesponse_check($thisanswer,$response);
     } else {      } else {
  ($aresult,$msg)=&caparesponse_check($thisanswer,   $aresult='ERROR';
     $responselist[$i]." $unit");   $msg='answer was undefined';
     }      }
       #&LONCAPA_INTERNAL_DEBUG("after if $aresult -- $msg");
       my ($temp)=split(/:/, $aresult);
       push(@awards,$temp);
       push(@msgs,$msg);
       $i++;
    }
    my ($possible_award,$possible_msg) = 
       &LONCAPA_INTERNAL_FINALIZEAWARDS(\@awards,\@msgs);
    if ($final_award) {
       ($final_award,$final_msg) = 
    &LONCAPA_INTERNAL_FINALIZEAWARDS([$final_award,$possible_award],
    [$final_msg,$possible_msg],
    undef,1);
  } else {   } else {
     $aresult='ERROR';      ($final_award,$final_msg) = ($possible_award,$possible_msg);
     $msg='answer was undefined';  
  }   }
  &LONCAPA_INTERNAL_DEBUG("after if $aresult -- $msg");  
  my ($temp)=split(/:/, $aresult);  
  $awards.="$temp,";  
  $result.=$aresult;  
  push(@msgs,$msg);  
  $i++;  
     }      }
     chop($awards);      #&reset_caparesponse_memoization();
     return ("$awards:\n$result",@msgs);      return ($final_award,$final_msg);
 }  }
   
 sub tex {  sub tex {

Removed from v.1.115  
changed lines
  Added in v.1.116


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>