aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-09-29 11:46:52 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-09-29 11:46:52 +0100
commit659977df093cd33402856085fffbcba2b5d47dee (patch)
treec9c54afa4cbc0b3bb9712cebb9a201fe2a2af342
parent47107af7c6dd1fb9a67cd69349e0eed17e983915 (diff)
downloadperlweeklychallenge-club-659977df093cd33402856085fffbcba2b5d47dee.tar.gz
perlweeklychallenge-club-659977df093cd33402856085fffbcba2b5d47dee.tar.bz2
perlweeklychallenge-club-659977df093cd33402856085fffbcba2b5d47dee.zip
- Updated Perl solutions post Raku one.
-rw-r--r--challenge-080/mohammad-anwar/perl/ch-1.pl20
-rw-r--r--challenge-080/mohammad-anwar/perl/ch-1.t24
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;
}