solutions.problem43   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 66
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 15
dl 0
loc 66
rs 10
c 0
b 0
f 0
wmc 5

1 Function

Rating   Name   Duplication   Size   Complexity  
A solve() 0 14 5
1
"""
2
Project Euler Problem 43: Sub-String Divisibility
3
=================================================
4
5
.. module:: solutions.problem43
6
   :synopsis: My solution to problem #43.
7
8
The source code for this problem can be
9
`found here <https://bitbucket.org/nekedome/project-euler/src/master/solutions/problem43.py>`_.
10
11
Problem Statement
12
#################
13
14
The number, :math:`1406357289`, is a :math:`0` to :math:`9` pandigital number because it is made up of each of the
0 ignored issues
show
Coding Style introduced by
This line is too long as per the coding-style (114/100).

This check looks for lines that are too long. You can specify the maximum line length.

Loading history...
15
digits :math:`0` to :math:`9` in some order, but it also has a rather interesting sub-string divisibility property.
0 ignored issues
show
Coding Style introduced by
This line is too long as per the coding-style (115/100).

This check looks for lines that are too long. You can specify the maximum line length.

Loading history...
16
17
Let :math:`d_1` be the :math:`1^{st}` digit, :math:`d_2` be the :math:`2^{nd}` digit, and so on. In this way, we note
0 ignored issues
show
Coding Style introduced by
This line is too long as per the coding-style (117/100).

This check looks for lines that are too long. You can specify the maximum line length.

Loading history...
18
the following:
19
20
- :math:`d_2 d_3 d_4 = 406` is divisible by :math:`2`
21
- :math:`d_3 d_4 d_5 = 063` is divisible by :math:`3`
22
- :math:`d_4 d_5 d_6 = 635` is divisible by :math:`5`
23
- :math:`d_5 d_6 d_7 = 357` is divisible by :math:`7`
24
- :math:`d_6 d_7 d_8 = 572` is divisible by :math:`11`
25
- :math:`d_7 d_8 d_9 = 728` is divisible by :math:`13`
26
- :math:`d_8 d_9 d_{10} = 289` is divisible by :math:`17`
27
28
Find the sum of all :math:`0` to :math:`9` pandigital numbers with this property.
29
30
Solution Discussion
31
###################
32
33
Nothing sophisticated here. Simply iterate through all :math:`0` through :math:`9` pandigital numbers and test for the
0 ignored issues
show
Coding Style introduced by
This line is too long as per the coding-style (118/100).

This check looks for lines that are too long. You can specify the maximum line length.

Loading history...
34
required divisibility properties. Accumulate the sum of qualifying candidate pandigital numbers.
35
36
Solution Implementation
37
#######################
38
39
.. literalinclude:: ../../solutions/problem43.py
40
   :language: python
41
   :lines: 44-
42
"""
43
44
from itertools import permutations
45
46
from lib.digital import digits_to_num
47
48
49
def solve():
50
    """ Compute the answer to Project Euler's problem #43 """
51
52
    divisors = [2, 3, 5, 7, 11, 13, 17]
53
54
    answer = 0
55
    for digits in permutations(range(10)):
56
        for i, divisor in enumerate(divisors):
57
            z = sum([100 * digits[i + 1] + 10 * digits[i + 2] + digits[i + 3]])
0 ignored issues
show
Coding Style Naming introduced by
The name z does not conform to the variable naming conventions ((([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$).

This check looks for invalid names for a range of different identifiers.

You can set regular expressions to which the identifiers must conform if the defaults do not match your requirements.

If your project includes a Pylint configuration file, the settings contained in that file take precedence.

To find out more about Pylint, please refer to their site.

Loading history...
58
            if z % divisor != 0:
59
                break  # one of the divisibility constraints doesn't hold, skip over this pandigital
60
        else:
61
            answer += digits_to_num(list(digits))
62
    return answer
63
64
65
expected_answer = 16695334890
0 ignored issues
show
Coding Style Naming introduced by
The name expected_answer does not conform to the constant naming conventions ((([A-Z_][A-Z0-9_]*)|(__.*__))$).

This check looks for invalid names for a range of different identifiers.

You can set regular expressions to which the identifiers must conform if the defaults do not match your requirements.

If your project includes a Pylint configuration file, the settings contained in that file take precedence.

To find out more about Pylint, please refer to their site.

Loading history...
66