aboutsummaryrefslogtreecommitdiff
path: root/challenge-136/mohammad-anwar/python/ch-2.py
blob: 046d88ed535d0018b9d41d7c81b9ef050cdf3330 (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
59
60
61
62
63
#!/usr/bin/python3

'''

Week 136:

    https://theweeklychallenge.org/blog/perl-weekly-challenge-136

Task #2: Fibonacci Sequence

    You are given a positive number $n.

    Write a script to find how many different sequences you can create using Fibonacci numbers where the sum of unique numbers in each sequence are the same as the given number.

'''

import sys
import unittest
from itertools import combinations

#
#
# This is translated from my Perl solution for the same task:
#
# https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-136/mohammad-anwar/perl/ch-2.pl

def fibonacci_series_upto(_sum):
    fibonacci_series = [1, 2]
    while fibonacci_series[-1] + fibonacci_series[-2] <= _sum:
        fibonacci_series.append(fibonacci_series[-1] + fibonacci_series[-2])

    return fibonacci_series

def fibonacci_sequence(_sum):
    fibonacci_series = fibonacci_series_upto(_sum)
    fibonacci_sum    = []

    for i in range(1, _sum):
        if i > len(fibonacci_series):
            break

        for comb in combinations(fibonacci_series, i):
            if sum(comb) == _sum:
                fibonacci_sum.append(comb)

    return len(fibonacci_sum)

#
#
# Unit test class

class TestFibonacciSequence(unittest.TestCase):

    def test_example_1(self):
        self.assertEqual(fibonacci_sequence(16), 4, 'Example 1')

    def test_example_2(self):
        self.assertEqual(fibonacci_sequence(9),  2, 'Example 2')

    def test_example_3(self):
        self.assertEqual(fibonacci_sequence(15), 2, 'Example 3')

unittest.main()