Greg Christian's weblog

May 5, 2011

Project Euler – Problem # 43 – Solved with Python

Filed under: Project Euler: 40, 41, 42, 43, 44, 45,Python — Greg Christian @ 9:52 am
Tags: , ,

Problem:

The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a rather interesting sub-string divisibility property.

Let d1 be the 1st digit, d2 be the 2nd digit, and so on. In this way, we note the following:

  • d2d3d4=406 is divisible by 2
  • d3d4d5=063 is divisible by 3
  • d4d5d6=635 is divisible by 5
  • d5d6d7=357 is divisible by 7
  • d6d7d8=572 is divisible by 11
  • d7d8d9=728 is divisible by 13
  • d8d9d10=289 is divisible by 17

Find the sum of all 0 to 9 pandigital numbers with this property.

One Possible Solution:

# Python version = 2.7.1
# Platform = win32
"""run_time was 36 seconds"""

import itertools
import time

def get_divisibles(s):
    """Get the 7 divisibles"""
    x = list(str(s))
    L = []
    for i in xrange(1, 8):
        d = x[i] + x[i + 1] + x[i + 2]
        L.append(d)
    return L

def isdivisible(y, LL):
    """Check the 7 divisibles"""
    if int(y[0]) % int(LL[0]) == 0 and int(y[1]) % int(LL[1]) == 0 \
       and int(y[2]) % int(LL[2]) == 0 and int(y[3]) % int(LL[3]) == 0 \
       and int(y[4]) % int(LL[4]) == 0 and int(y[5]) % int(LL[5]) == 0 \
       and int(y[6]) % int(LL[6]) == 0:
        return True
    else:
        return False

def main():
    """Main Program"""
    start_time = time.time()
    summer = 0
    x = itertools.permutations('0123456789', 10)
    for n in x:
        s = ''.join(n)
        y = get_divisibles(s)
        LL = [2, 3, 5, 7, 11, 13, 17]
        z = isdivisible(y, LL)
        if z == True:
            summer = summer + int(s)
        else:
            continue
    print "Answer = ", summer
    stop_time = time.time()
    run_time = stop_time - start_time
    print "run_time = ", run_time
        
if __name__ == '__main__':
    main()

3 Comments »

  1. String slicing might help. Here’s my solution:

    import itertools

    sum = 0
    for s in itertools.permutations(“1234567890″):
    s = “”.join(s)
    if int(s[1:4]) % 2 == 0 and \
    int(s[2:5]) % 3 == 0 and \
    int(s[3:6]) % 5 == 0 and \
    int(s[4:7]) % 7 == 0 and \
    int(s[5:8]) % 11 == 0 and \
    int(s[6:9]) % 13 == 0 and \
    int(s[7:10]) % 17 == 0:
    sum += int(s)

    print “Answer:”, sum

    Comment by Dave — December 29, 2011 @ 1:39 pm | Reply

  2. Crap, my white space got eaten by wordpress. You can use your imagination I hope. :)

    Comment by Dave — December 29, 2011 @ 1:40 pm | Reply


RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Theme: Rubric. Blog at WordPress.com.

Follow

Get every new post delivered to your Inbox.