| 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
|
|||
| 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
|
|||
| 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
|
|||
| 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
|
|||
| 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
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
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 |
This check looks for lines that are too long. You can specify the maximum line length.