ETOOBUSY 🚀 minimal blogging for the impatient
PWC201 - Missing Numbers
TL;DR
Here we are with TASK #1 from The Weekly Challenge #201. Enjoy!
The challenge
You are given an array of unique numbers.
Write a script to find out all missing numbers in the range
0..$n
where$n
is the array size.Example 1
Input: @array = (0,1,3) Output: 2 The array size i.e. total element count is 3, so the range is 0..3. The missing number is 2 in the given array.
Example 2
Input: @array = (0,1) Output: 2 The array size is 2, therefore the range is 0..2. The missing number is 2.
The questions
Is there a range of allowed values for the numbers in the array? Are they integers?
The solution
We’re turning the array into a set to make checking the numbers in the range efficient:
#!/usr/bin/env raku
use v6;
sub MAIN (*@args) { .put for missing-numbers(@args) }
sub missing-numbers (@array) {
my $present = @array».Str.Set;
return [(0 .. @array.elems).grep({ $_.Str ∉ $present })];
}
I struggled a bit before realizing that I had to turn everything to strings, just to be on the safe side.
The Perl version is just a little at a lower level:
#!/usr/bin/env perl
use v5.24;
use warnings;
use experimental 'signatures';
no warnings 'experimental::signatures';
say for missing_numbers(@ARGV);
sub missing_numbers (@array) {
my %set = map { $_ => 1 } @array;
grep { ! exists($set{$_}) } 0 .. @array;
}
That’s all folks!