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');
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), ')');
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)
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).
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.
I guess I see that interpretation.