aboutsummaryrefslogtreecommitdiff
path: root/challenge-077/mohammad-anwar/perl/ch-1.pl
blob: 31f90e5555ca6b9ac2b26fd874ddf5749cc3edfc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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;
}