`use strict;
use warnings;
my @a = (10, 15, -20, -30);
my $highest = abs($a[-1]);
my @full = (0) x ($highest + 1);
# decrement all negative values by 1, otherwise
# we would exclude the end points:
for (@a) {
$_-- if $_ < 0;
}
my $count = 0;
for (0..$highest) {
if (abs $a[0] == $_) {
my $c = shift @a;
if ($c > 0) {
$count++;
} else {
$count--;
}
}
$full[$_] += $count;
}
print join('', @full), "\n";
`
This assumes that there are never two values of same magnitude in the array, ie never exactly matching start- and endpoints. You can generalize it on your own :-)
**Second update**: I've just realized that the extension is very simple:
Instead of `if (abs $a[0] == $_)` write `while (abs $a[0] == $_)`, and you're done. |
Comment onRe^2: Optimizing a double loop