diff options
| -rw-r--r-- | challenge-077/mohammad-anwar/perl/ch-1.pl | 58 | ||||
| -rw-r--r-- | challenge-077/mohammad-anwar/perl/ch-1.t | 56 |
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; +} |
