Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: How would you code this?

by kennethk (Abbot)
on Apr 06, 2016 at 20:14 UTC ( [id://1159753]=note: print w/replies, xml ) Need Help??


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.
    .

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1159753]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having a coffee break in the Monastery: (3)
As of 2024-04-25 17:56 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found