1

I have this code, which splits a number into groups of 5, puts them into a list, and then multiples them. This is Problem 8 in Project Euler, if you're confused. It's also not finished, as I need to find the other possible 5 consecutive integers.

def split_number(number, n):

    line = str(number)

    split = [line[i:i+n] for i in range(0, len(line), n)]

    return split

splitnum = split_number((extremely long number), 5)

for x in enumerate(splitnum[:-1]):
    split5 = split_number(splitnum[x], 1)
    for n in split5:
        splitproduct = reduce(lambda x, y: x*y, splitnum[n])
    if (splitproduct > solution):
        solution = splitproduct


print solution

When I try to run this, I get the error

TypeError: list indices must be integers, not tuple

I guess when I iterate through splitnum, x is a tuple. I need it to be an integer so I can use split5() correctly.


New code:

def split_number(number, n):

    line = str(number)

    split = [line[i:i+n] for i in range(1, len(line)-n+1, n)]

    return split


number =

while len(split_number(number,1)) is not 0:

    splitnum = split_number((number), 5)

    solution = 0

    for x in splitnum[:-1]:
        split5 = split_number(x, 1)
        for n in split5:
            splitproduct = reduce(lambda x, y: x*y, n)
        if (splitproduct > solution):
            solution = splitproduct

    number = split_number(number, 1)
    del number[0]



print solution

Now I'm getting a memory error on the 'split' line in function split_number. that's probably because of the extremely long number. But that isn't the topics question, I just wanted you guys to see how I implemented their solutions (which worked, because the program actually runs). :)

3
  • split_number([1, 2, 3, 4], 2) should yield 1, 2, 2, 3 and 3, 4, not 1, 2 and 3, 4. Commented Mar 9, 2013 at 0:10
  • 1
    To fix what Blender mentioned, change the step argument of the range inside split_number back to 1. Also you will want to set len(line)-n+1 as the maximum number so you don’t end up with four groups containing less than five numbers. Commented Mar 9, 2013 at 0:20
  • “Now I'm getting a memory error on the 'split' line” – The problem is that you calculate and store all the possible groups first and then want to go through it. If you combine it together and just look at a single element of the split-list (i.e. don’t calculate more), then you should be fine. Commented Mar 9, 2013 at 0:33

2 Answers 2

2

Enumerate returns tuples where the first element of the tuple is the index into the sequence.

I think you just want to iterate over splitnum, and not use enumerate, since you are not using the index anywhere (for x in splitnum[:-1]).

Sign up to request clarification or add additional context in comments.

2 Comments

When I try that, it gives me the same error on the split5 line; that's my problem. That's why I tried using enumerate.
@Tetramputechture When you do for x in splitnum[:-1], x will already be an element of that list. So you won’t do splitnum[x] but just x when you use it.
2

All you need to do is multiply together all 5-long substrings of your string and see which one is the biggest:

import operator

n = map(int, '7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450')

print max(reduce(operator.mul, n[i:i + 5]) for i in range(len(n) - 5))

1 Comment

Ok, so instead of pasting all of that and getting the answer, I actually looked at all of those functions to see what your thought process was on this. I really learned from it, thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.