aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-077/mohammad-anwar/perl/ch-1.pl58
-rw-r--r--challenge-077/mohammad-anwar/perl/ch-1.t56
2 files changed, 114 insertions, 0 deletions
diff --git a/challenge-077/mohammad-anwar/perl/ch-1.pl b/challenge-077/mohammad-anwar/perl/ch-1.pl
new file mode 100644
index 0000000000..31f90e5555
--- /dev/null
+++ b/challenge-077/mohammad-anwar/perl/ch-1.pl
@@ -0,0 +1,58 @@
+#!/usr/bin/perl
+
+#
+# Perl Weekly Challenge - 077
+#
+# Task #1: Fibonacci Sum
+#
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-077
+#
+
+use strict;
+use warnings;
+use Algorithm::Combinatorics qw(combinations);
+
+my $N = $ARGV[0];
+
+print "USAGE: perl $0 <positive_number>\n" and exit
+ unless (defined $N && $N > 0);
+p(fibonacci_sum(fibonacci_series_upto($N), $N));
+
+#
+#
+# METHODS
+
+sub p {
+ my ($fibonacci_sum) = @_;
+
+ foreach (@$fibonacci_sum) {
+ print sprintf("%s\n", join ", ", @$_);
+ }
+}
+
+sub fibonacci_sum {
+ my ($fibonacci, $sum) = @_;
+
+ my $fibonacci_sum = [];
+ foreach my $i (1 .. $sum) {
+ last if ($i > @$fibonacci);
+ foreach my $comb (combinations($fibonacci, $i)) {
+ my $_sum = 0;
+ $_sum += $_ for @$comb;
+ push @$fibonacci_sum, $comb if ($_sum == $sum);
+ }
+ }
+
+ return $fibonacci_sum;
+}
+
+sub fibonacci_series_upto {
+ my ($num) = @_;
+
+ my @fibonacci = (1, 2);
+ while ($fibonacci[-1] + $fibonacci[-2] <= $num) {
+ push @fibonacci, ($fibonacci[-1] + $fibonacci[-2]);
+ }
+
+ return \@fibonacci;
+}
diff --git a/challenge-077/mohammad-anwar/perl/ch-1.t b/challenge-077/mohammad-anwar/perl/ch-1.t
new file mode 100644
index 0000000000..f2c682b33c
--- /dev/null
+++ b/challenge-077/mohammad-anwar/perl/ch-1.t
@@ -0,0 +1,56 @@
+#!/usr/bin/perl
+
+#
+# Perl Weekly Challenge - 077
+#
+# Task #1: Fibonacci Sum
+#
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-077
+#
+
+use strict;
+use warnings;
+use Test::More;
+use Test::Deep;
+use Algorithm::Combinatorics qw(combinations);
+
+is_deeply(fibonacci_sum(fibonacci_series_upto(6), 6),
+ [ [1,5], [1,2,3] ],
+ "fibonacci sum = 6");
+
+is_deeply(fibonacci_sum(fibonacci_series_upto(9), 9),
+ [ [1,8], [1,3,5] ],
+ "fibonacci sum = 9");
+
+done_testing;
+
+#
+#
+# METHODS
+
+sub fibonacci_sum {
+ my ($fibonacci, $sum) = @_;
+
+ my $fibonacci_sum = [];
+ foreach my $i (1 .. $sum) {
+ last if ($i > @$fibonacci);
+ foreach my $comb (combinations($fibonacci, $i)) {
+ my $_sum = 0;
+ $_sum += $_ for @$comb;
+ push @$fibonacci_sum, $comb if ($_sum == $sum);
+ }
+ }
+
+ return $fibonacci_sum;
+}
+
+sub fibonacci_series_upto {
+ my ($num) = @_;
+
+ my @fibonacci = (1, 2);
+ while ($fibonacci[-1] + $fibonacci[-2] <= $num) {
+ push @fibonacci, ($fibonacci[-1] + $fibonacci[-2]);
+ }
+
+ return \@fibonacci;
+}