in reply to How would you code this?

For the sample data, your y-values are monotonic. If this is generally true, there's no point in including them in the comparison.
my $modified = reduce{ my( $x1, $y1, $x2, $y2 ) = ( @{ @{ $a }[ -1 ] }, @$b ); $x2 < $x1 ? pop @{ $a } : push @{ $a }, $b; $a; } [ shift @points ], @points;
Assuming you necessarily hold all data in memory, you could also use splice in a while, which feels more natural to me:
my $i = 1; while ($i < @points) { if ($points[$i-1][0] > $points[$i][0]) { splice @points,$i-1,2; --$i or $i = 0; } else { $i++; } }
or just a streaming push/pop, which is algorithmically what you've done, but reads better, I think.
my $modified = []; for my $point (@points) { if (@$modified and $modified->[-1][0] > $point->[0]) { pop @$modified; } else { push @$modified, $point; } }
I'd like there to be a more streaming solution here, but there's no way to tell if the first point should have been accepted until you are past halfway in the list, and you don't a priori know how long the list is.

Golfed:

my @m; @m&&$m[-1][0]>$_->[0]?pop @m:push @m,$_ for @points;

#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

Replies are listed 'Best First'.
Re^2: How would you code this?
by BrowserUk (Patriarch) on Apr 07, 2016 at 14:55 UTC

    I like your 3rd version best; and that was going to be my choice before graff threw his spanner into my works.

    Now I've more research to do; and I'll look at adapting it once I decide which way I'm going to jump.

    Thank a lot for your input.


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
    In the absence of evidence, opinion is indistinguishable from prejudice.
    .