I’ve been doing the Weekly
Challenges. The
latest
involved searching in lists of integers. (Note that this closes today.)
Task 1: Kill and Win
You are given a list of integers.
Write a script to get the maximum points. You are allowed to take
out (kill) any integer and remove from the list. However if you do
that then all integers exactly one-less or one-more would also be
removed. Find out the total of integers removed.
This is simpler than it looks, because the rules ensure that all
numbers will eventually be removed, either by direct choice or by
being adjacent to a direct choice - and both ways count towards the
score. Therefore, whatever order this happens in, the actual answer is
simply the sum of all the list values.
Raku:
sub killandwin(@a) {
return @a.sum;
}
Task 2: Number Collision
You are given an array of integers which can move in right direction
if it is positive and left direction when negative. If two numbers
collide then the smaller one will explode. And if both are same then
they both explode. We take the absolute value in consideration when
comparing.
All numbers move at the same speed, therefore any 2 numbers moving
in the same direction will never collide.
Write a script to find out who survives the collision.
I don't think there are any timing considerations - if elements 2
and/or 3 eliminate each other, their neighbours needn't be
reconsidered until the next pass. Standard clean/dirty flag loop.
Ruby:
def numbercollision(aa)
a = aa
dirty = true
while dirty do
b = []
dirty = false
i = 0
while i + 1 <= a.length do
If there's a collision at all:
if i + 1 < a.length && a[i] > 0 && a[i + 1] < 0 then
ab = a[i + 1].abs
Larger first number is retained
if a[i] > ab then
b.push(a[i])
Or larger second number is retained
elsif a[i] < ab then
b.push(a[i + 1])
end
Or nothing is, if they were equal.
i += 2
dirty = true
Or there wasn't a collision and we just copy.
else
b.push(a[i])
i += 1
end
end
a = b;
end
return a
end
Full code on
github.
Comments on this post are now closed. If you have particular grounds for adding a late comment, comment on a more recent post quoting the URL of this one.