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;
}
|