This code was an attempt on generic programming. Using
one piece of code that applies - by parametrization -
on different problems. I was surprised what one can
do with functional parametrization, but there are of course
more runtime-efficient ways.
#!/usr/bin/perl -w
use strict;
my $consolidate = sub {
my $rp1 = shift;
my $rp2 = shift;
my $p1 = $$rp1;
my $p2 = $$rp2;
return 1 if($p1 > $p2);
return 2 if($p2 > $p1);
return 3;
};
my $sortup = sub {
my $rp1 = shift;
my $rp2 = shift;
($$rp1,$$rp2) = ($$rp2,$$rp1) if($$rp1 > $$rp2);
return 3;
};
my $sortdn = sub {
my $rp1 = shift;
return &$sortup(shift,$rp1);
};
my $unique = sub {
my $rp1 = shift;
my $rp2 = shift;
return 1 if($$rp1 == $$rp2);
return 3;
};
my $maximum = sub {
my $rp1 = shift;
my $rp2 = shift;
my $p1 = $$rp1;
my $p2 = $$rp2;
return 1 if($p1 >= $p2);
return 2 if($p2 >= $p1);
return 3;
};
my $minimum = sub {
my $rp1 = shift;
return &$maximum(shift,$rp1);
};
my $unchanged = sub { return 3 };
my $first = sub { return 1 };
my $last = sub { return 2 };
my @set = (7,7,3,2,1,6,1,8,8,4,6,5);
my @conset = &compare_all($consolidate,@set);
my @maxset = &compare_all($maximum,@set);
my @minset = &compare_all($minimum,@set);
my @oriset = &compare_all($unchanged,@set);
my @fstset = &compare_all($first,@set);
my @lstset = &compare_all($last,@set);
my @sruset = &compare_all($sortup,@set);
my @srdset = &compare_all($sortdn,@set);
my @unqset = &compare_all($unique,@set);
print "Original List : ",@set,"\n";
print "Consolidated List: ",@conset,"\n";
print "Maximum Value : ",@maxset,"\n";
print "Minimum Value : ",@minset,"\n";
print "Unchanged List : ",@oriset,"\n";
print "First Value : ",@fstset,"\n";
print "Last Value : ",@lstset,"\n";
print "UpSorted List : ",@sruset,"\n";
print "DnSorted List : ",@srdset,"\n";
print "Unique list : ",@unqset,"\n";
print "Doubles Deleted : ",@dodset,"\n";
print "Doubles Kept : ",@kodset,"\n";
# {{{ compare_all Iterates all elements in a given list fo
+r comparison with eachother
# 1. Arg: Reference to the comparison/action function
# 2+ Arg: list to iterate
# Return: Modified list
sub compare_all {
my $func = shift;
my @set = @_;
my $size = scalar(@set);
my @back;
ca_outer_loop:
for(my $i=0; $i < $size; $i++) {
ca_inner_loop:
for(my $j=$i+1; $j < $size; $j++) {
my $val = &$func(\$set[$i],\$set[$j]);
if($val == 1) { # s[i] remains
splice(@set,$j,1); # => Thus s[j] is de
+leted
$j--; $size--; # ... array shrinks
next ca_inner_loop;
} elsif($val == 2) { # s[j] remains
splice(@set,$i,1); # => Thus s[i] is de
+leted
$i--; $size--; # ... array shrinks
next ca_outer_loop;
} elsif($val == 3) { # both s[i] and s[j]
+ remain
# We don't want to m
+odify the set
} else { # none remains
# We can do this, because here j > i is always true
print "Lösche $set[$i] und $set[$j]. I: $i J: $j\n";
splice(@set,$j,1); # => Thus s[j] is de
+leted
$j--; $size--; # ... array shrinks
splice(@set,$i,1); # => Thus s[i] is de
+leted
$i--; $size--; # ... array shrinks
next ca_outer_loop;
}
}
}
return @set;
}
# }}}