Diff for /loncom/homework/default_homework.lcpm between versions 1.172 and 1.177

version 1.172, 2017/01/04 19:54:47 version 1.177, 2019/11/06 16:20:06
Line 29 Line 29
   
 #init some globals  #init some globals
 $hidden::RANDOMINIT=0;  $hidden::RANDOMINIT=0;
   $hidden::RANDOMINITTRYPART='';
 $pi=atan2(1,1)*4;  $pi=atan2(1,1)*4;
 $rad2deg=180.0/$pi;  $rad2deg=180.0/$pi;
 $deg2rad=$pi/180.0;  $deg2rad=$pi/180.0;
Line 309  sub caparesponse_check_list { Line 310  sub caparesponse_check_list {
  #for numerical problems split off the unit   #for numerical problems split off the unit
         my $part1;          my $part1;
         my $part2;          my $part2;
           my $match_algebra = qr{^(.*[^\s])\s+([^\s]+)$};
           # FIXME: with the above regexp, algebra with spaces will not be evaluated correctly
           my $match_numerical_units = qr{^([\d\.\,\s\$]*(?:(?:[xX\*]10[\^\*]*|[eE]*)[\+\-]*\d*)*(?:^|\S)\d+)([\$\s\w\^\*\/\(\)\+\-]*[^\d\.\s\,][\$\s\w\^\*\/\(\)\+\-]*)$};
         if ($allowalgebra) {          if ($allowalgebra) {
            ($part1,$part2)=($responses->[0][-1]=~ /^(.*[^\s])\s+([^\s]+)$/);              ($part1,$part2) = ($responses->[0][-1] =~ /$match_algebra/); 
         } else {          } else {
            ($part1,$part2)=($responses->[0][-1]=~ /^([\d\.\,\s\$]*(?:(?:[xX\*]10[\^\*]*|[eE]*)[\+\-]*\d*)*(?:^|\S)\d+)([\$\s\w\^\*\/\(\)\+\-]*[^\d\.\s\,][\$\s\w\^\*\/\(\)\+\-]*)$/);             ($part1,$part2) = ($responses->[0][-1] =~ /$match_numerical_units/);
         }          }
         if (defined($part1) && defined($part2)) {          if (defined($part1) && defined($part2)) {
     $responses->[0][-1]=$part1;      $responses->[0][-1]=$part1;
Line 327  sub caparesponse_check_list { Line 331  sub caparesponse_check_list {
                     }                      }
                 }                  }
             }              }
               if (scalar(@$responses) > 0 && defined $answerunit) {
                   # there are several response values, units should be the same for all
                   $part2 =~ s/^\s+|\s+$//g;
                   for (my $i=1; $i<scalar(@$responses); $i++) {
                       my $element = $responses->[$i][-1];
                       my ($part1i, $part2i);
                       if ($allowalgebra) {
                           ($part1i, $part2i) = ($element =~ /$match_algebra/); 
                       } else {
                           ($part1i, $part2i) = ($element =~ /$match_numerical_units/);
                       }
                       $part2i =~ s/^\s+|\s+$//g;
                       if (!defined $part2i) {
                           return 'NO_UNIT';
                       } elsif ($part2i ne $part2) {
                           return ('UNIT_FAIL', "$part2 $part2i");
                       } else {
                           $responses->[$i][-1] = $part1i;
                       }
                   }
               }
  }   }
     }      }
     $unit=~s/\s//;      $unit=~s/\s//;
Line 631  sub hinton { Line 656  sub hinton {
   
 sub random {  sub random {
     my ($start,$end,$step)=@_;      my ($start,$end,$step)=@_;
     if ( ! $hidden::RANDOMINIT ) {      if (( ! $hidden::RANDOMINIT ) ||
  if ($external::randomseed == 0) { $external::randomseed=1; }          (($external::randomizetrypart ne '') &&
  if ($external::randomseed =~/,/) {           ($hidden::RANDOMINITTRYPART ne $external::randomizetrypart))) {
     my ($num1,$num2)=split(/,/,$external::randomseed);          if ($external::randomseed == 0) { $external::randomseed=1; }
     &random_set_seed(1,abs($num1));          if ($external::randomseed =~/,/) {
  } elsif ($external::randomseed =~/:/) {              my ($num1,$num2) = map { abs($_); } split(/,/,$external::randomseed);
     my ($num1,$num2)=split(/:/,$external::randomseed);              if ((!$num1) || ($num1 > 2147483398)) {
     &random_set_seed(abs($num1),abs($num2));                  &random_set_seed_from_phrase($external::randomseed);
  } else {              } else {
     &random_set_seed(1,int(abs($external::randomseed)));                  &random_set_seed(1,$num1);
  }              }
           } elsif ($external::randomseed =~/:/) {
               my ($num1,$num2) = map { abs($_); } split(/:/,$external::randomseed);
               if ((!$num1) || (!$num2) || ($num1 > 2147483562) || ($num2 > 2147483398)) {
                   &random_set_seed_from_phrase($external::randomseed);
               } else {
                   &random_set_seed($num1,$num2);
               }
           } else {
               my $num1 = int(abs($external::randomseed));
               if ((!$num1) || ($num1 > 2147483398)) {
                   &random_set_seed_from_phrase($external::randomseed);
               } else {
                   &random_set_seed(1,$num1);
               }
           }
  &math_random_uniform();   &math_random_uniform();
  $hidden::RANDOMINIT=1;   $hidden::RANDOMINIT=1;
           $hidden::RANDOMINITTRYPART=$external::randomizetrypart;
     }      }
     if (!defined($step)) { $step=1; }      if (!defined($step)) { $step=1; }
     my $num=1+int(($end-$start)/$step);      my $num=1+int(($end-$start)/$step);
Line 952  sub chemparse { Line 993  sub chemparse {
     return &xmlparse($formula);      return &xmlparse($formula);
 }  }
   
   sub conv_eng_format {
       my ($ans,$baseunit)=@_;
       my ($value,$answer,$unit);
       $baseunit =~ s{[^\w/\-\.]}{}g; 
       eval {
              $value = &number_format_pref($ans);
       };
       my ($answer,$prefix) = ($value=~ /^(.+)(\w)$/);
       my $unit = $prefix.$baseunit;
       return($answer,$unit);
   } 
   
 sub prettyprint {  sub prettyprint {
     my ($value,$fmt,$target)=@_;      my ($value,$fmt,$target)=@_;
     my $result;      my $result;

Removed from v.1.172  
changed lines
  Added in v.1.177


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