diff options
| -rw-r--r-- | challenge-080/mohammad-anwar/perl/ch-1.pl | 20 | ||||
| -rw-r--r-- | challenge-080/mohammad-anwar/perl/ch-1.t | 24 |
2 files changed, 21 insertions, 23 deletions
diff --git a/challenge-080/mohammad-anwar/perl/ch-1.pl b/challenge-080/mohammad-anwar/perl/ch-1.pl index 15a961862b..cbd1935ab6 100644 --- a/challenge-080/mohammad-anwar/perl/ch-1.pl +++ b/challenge-080/mohammad-anwar/perl/ch-1.pl @@ -10,31 +10,27 @@ use strict; use warnings; -use Data::Dumper; my $N = $ARGV[0] || "2, 3, 7, 6, 8, -1, -10, 15"; printf("%s => %d\n", $N, smallest_positive_number(get_list($N))); # # -# METHODS +# SUBROUTINES sub smallest_positive_number { - my ($array) = @_; + my ($arrayref) = @_; - my %numbers = (); - foreach my $n (@$array) { - next unless $n > 0; - $numbers{$n} = 1; - } + my @positive_numbers = sort(grep $_ > 0, @$arrayref); + return 1 unless (@positive_numbers); my $i = 0; - foreach my $j (sort {$a <=> $b} keys %numbers) { - next if (++$i == $j); - return $i; + for my $n (1 .. $positive_numbers[-1]) { + next if ($n == $positive_numbers[$i++]); + return $n; } - return ++$i; + return $positive_numbers[-1]+1; } sub get_list { diff --git a/challenge-080/mohammad-anwar/perl/ch-1.t b/challenge-080/mohammad-anwar/perl/ch-1.t index 4312d4a022..7bd3ce5355 100644 --- a/challenge-080/mohammad-anwar/perl/ch-1.t +++ b/challenge-080/mohammad-anwar/perl/ch-1.t @@ -12,12 +12,17 @@ use strict; use warnings; use Test::More; +# examples from the task +is (smallest_positive_number([5, 2, -2, 0]), 1, "testing (5, 2, -2, 0)"); +is (smallest_positive_number([1, 8, -1]), 2, "testing (1, 8, -1)"); +is (smallest_positive_number([2, 0, -1]), 1, "testing (2, 0, -1)"); + +# some other test cases is (smallest_positive_number([1, 2, 0]), 3, "testing (1, 2, 0)"); is (smallest_positive_number([-8, -7, -6]), 1, "testing (-8, -7, -6)"); is (smallest_positive_number([3, 4, -1, 1]), 2, "testing (3, 4, -1, 1)"); is (smallest_positive_number([2, 3, 7, 6, 8, -1, -10, 15]), 1, "testing (2, 3, 7, 6, 8, -1, -10, 15)"); - done_testing; # @@ -25,19 +30,16 @@ done_testing; # METHODS sub smallest_positive_number { - my ($array) = @_; + my ($arrayref) = @_; - my %numbers = (); - foreach my $n (@$array) { - next unless $n > 0; - $numbers{$n} = 1; - } + my @positive_numbers = sort(grep $_ > 0, @$arrayref); + return 1 unless (@positive_numbers); my $i = 0; - foreach my $j (sort {$a <=> $b} keys %numbers) { - next if (++$i == $j); - return $i; + for my $n (1 .. $positive_numbers[-1]) { + next if ($n == $positive_numbers[$i++]); + return $n; } - return ++$i; + return $positive_numbers[-1]+1; } |
