The Weekly Challenge - 201

TASK #1: Missing Numbers
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.

#!/usr/bin/perl
use strict;
use warnings;

# Assumptions:
# - Input values are within 0..n
# - No duplicates
# If those assumptions break, behavior might be unexpected

sub missing_values {

    my ($arr) = @_;
 
    my %seen = map {$_ => 1} @$arr;    
    my @res;
    
    for my $val (0 .. @$arr) {
    
        push @res, $val unless $seen{$val};
    
    }
    return \@res;
    
}

# Alternative solution

sub missing_values_alt{

    my ($arr) = @_;
 
    my %seen = map {$_ => 1} @$arr;    
    return grep { !exists $seen{$_} } 0 .. @$arr;
    
}

# Tests

# Example 1
print join(", ", @{ missing_values([0,1,3]) }), "\n"; # Output: 2

# Example 1
print join(", ", @{ missing_values([0,1]) }), "\n"; # Output: 2

# Example 1
print join(", ", @{ missing_values([0,2,4,6,8]) }), "\n"; # Output: 1, 3, 5