DEV Community

oldtechaa
oldtechaa

Posted on

Perl Weekly Challenge #235 - Splicing and Dicing

Hi everybody, we've got another two challenges this week, so let's dive into them!

Remove One

The goal is to see if there's any one number that can be removed to make the set sorted in increasing order. Here's the code:

#!/usr/bin/perl
use v5.36;

my $success = 0;
REMOVAL: for my $removal (0 .. $#ARGV) {
    my @modified = @ARGV;
    splice(@modified, $removal, 1);
    for my $scan (1 .. $#modified) {
        if($modified[$scan] <= $modified[$scan - 1]) {
            next REMOVAL;
        }
    }
    $success = 1;
    last;
}

say ($success ? 'true' : 'false');
Enter fullscreen mode Exit fullscreen mode

We have a labelled outer loop for the numbers we choose to remove. $removal is set to the index of each number we attempt to remove, then we copy the array, remove that number, and scan the result to make sure they all are increasing. If they don't, we skip this number and move on.

If we succeed, we set our flag and exit the loops and print the result.

Duplicate Ones

The next one is an array shifting challenge. We want to insert a duplicate of each 0, shifting everything to the right, and popping off the list to keep the length the same.

Here's the code:

#!/usr/bin/perl
use v5.36;

my @ints = @ARGV;
for(my $i = 0; $i <= $#ints; $i++) {
    if($ints[$i] == 0) {
        splice(@ints, $i, 0, 0);
        pop(@ints);
        $i++;
    }
}

say('(', join(', ', @ints), ')');
Enter fullscreen mode Exit fullscreen mode

This one's also really quite simple. We scan the array, use splice to insert a 0, pop the last number off the end of the array, and skip over the 0 we just inserted. It's that simple!

Both of this week's solutions make use of splice() to insert and remove array elements, something I haven't used a lot before.

Stay tuned for next week's challenge, which should come out Monday!

Top comments (3)

Collapse
 
packy profile image
Packy Anderson

Your task 1 solution produces the correct results when there are 1 or more removals needed to produce a strictly increasing sequence, but it produces an incorrect result (true) when there are NO removals needed (because if the sequence is already strictly increasing, removing any one of the values will still leave the sequence strictly increasing).

Collapse
 
oldtechaa profile image
oldtechaa

I can see that interpretation, however technically it exactly meets the specifications of the challenge. The challenge is whether it's possible to get an increasing list of integers with no more than one removal, not whether a removal is actually needed.

Collapse
 
packy profile image
Packy Anderson

I guess I see that interpretation.