From: dpvc v. a. <we...@ma...> - 2005-08-13 16:32:14
|
Log Message: ----------- Added sort methods to Union and Set that return objects with their data sorted. Modified Files: -------------- pg/lib/Value: AnswerChecker.pm Set.pm Union.pm Revision Data ------------- Index: Set.pm =================================================================== RCS file: /webwork/cvs/system/pg/lib/Value/Set.pm,v retrieving revision 1.4 retrieving revision 1.5 diff -Llib/Value/Set.pm -Llib/Value/Set.pm -u -r1.4 -r1.5 --- lib/Value/Set.pm +++ lib/Value/Set.pm @@ -110,12 +110,11 @@ # (return the resulting set or nothing for empty set) # sub subSetSet { - my @l = sort {$a <=> $b} (@{$_[0]->data}); - my @r = sort {$a <=> $b} (@{$_[1]->data}); + my @l = $_[0]->sort->value; my @r = $_[1]->sort->value; my @entries = (); while (scalar(@l) && scalar(@r)) { if ($l[0] < $r[0]) {push(@entries,shift(@l))} - else {if ($l[0] == $r[0]) {shift(@l)}; shift(@r)} + else {while ($l[0] == $r[0]) {shift(@l)}; shift(@r)} } push(@entries,@l); return () unless scalar(@entries); @@ -179,8 +178,7 @@ } if ($l->getFlag('reduceSetsForComparison')) {$l = $l->reduce; $r = $r->reduce} if ($flag) {my $tmp = $l; $l = $r; $r = $tmp}; - my @l = sort {$a <=> $b} $l->value; - my @r = sort {$a <=> $b} $r->value; + my @l = $l->sort->value; my @r = $r->sort->value; while (scalar(@l) && scalar(@r)) { my $cmp = shift(@l) <=> shift(@r); return $cmp if $cmp; @@ -194,13 +192,20 @@ sub reduce { my $self = shift; return $self if $self->{isReduced} || $self->length < 2; - my @data = (sort {$a <=> $b} ($self->value)); - my @set = (); + my @data = $self->sort->value; my @set = (); while (scalar(@data)) { push(@set,shift(@data)); shift(@data) while (scalar(@data) && $set[-1] == $data[0]); } - return $pkg->make(@set)->with(isReduced=>1); + return $self->make(@set)->with(isReduced=>1); +} + +# +# Sort the data for a set +# +sub sort { + my $self = shift; + return $self->make(sort {$a <=> $b} $self->value); } ########################################################################### Index: AnswerChecker.pm =================================================================== RCS file: /webwork/cvs/system/pg/lib/Value/AnswerChecker.pm,v retrieving revision 1.56 retrieving revision 1.57 diff -Llib/Value/AnswerChecker.pm -Llib/Value/AnswerChecker.pm -u -r1.56 -r1.57 --- lib/Value/AnswerChecker.pm +++ lib/Value/AnswerChecker.pm @@ -253,8 +253,8 @@ my $reduced = $student->reduce; return "Your$nth union can be written in a simpler form" unless $reduced->type eq 'Union' && $reduced->length == $student->length; - my @R = sort {$a <=> $b} $reduced->value; - my @S = sort {$a <=> $b} $student->value; + my @R = $reduced->sort->value; + my @S = $student->sort->value; foreach my $i (0..$#R) { return "Your$nth union can be written in a simpler form" unless $R[$i] == $S[$i]; Index: Union.pm =================================================================== RCS file: /webwork/cvs/system/pg/lib/Value/Union.pm,v retrieving revision 1.17 retrieving revision 1.18 diff -Llib/Value/Union.pm -Llib/Value/Union.pm -u -r1.17 -r1.18 --- lib/Value/Union.pm +++ lib/Value/Union.pm @@ -186,10 +186,12 @@ my ($l,$r,$flag) = @_; if ($l->promotePrecedence($r)) {return $r->compare($l,!$flag)} $r = promote($r); - if ($l->getFlag('reduceUnionsForComparison')) {$l = $l->reduce; $r = $r->reduce} + if ($l->getFlag('reduceUnionsForComparison')) { + $l = $l->reduce; $l = $pkg->make($l) unless $l->type eq 'Union'; + $r = $r->reduce; $r = $pkg->make($r) unless $r->type eq 'Union'; + } if ($flag) {my $tmp = $l; $l = $r; $r = $tmp}; - my @l = sort {$a <=> $b} $l->value; - my @r = sort {$a <=> $b} $r->value; + my @l = $l->sort->value; my @r = $r->sort->value; while (scalar(@l) && scalar(@r)) { my $cmp = shift(@l) <=> shift(@r); return $cmp if $cmp; @@ -212,7 +214,7 @@ else {push(@intervals,$x)} } my @union = (); my @set = (); my $prevX; - @intervals = (sort {$a <=> $b} @intervals); + @intervals = (CORE::sort {$a <=> $b} @intervals); ELEMENT: foreach my $x (@singletons) { next if defined($prevX) && $prevX == $x; $prevX = $x; foreach my $I (@intervals) { @@ -245,6 +247,15 @@ ############################################ # +# Sort a union lexicographically +# +sub sort { + my $self = shift; + $self->make(CORE::sort {$a <=> $b} $self->value); +} + +############################################ +# # Generate the various output formats # |