Euler Project: Issue 8

n = # some ridiculously large number, omitted
N = [int(i) for i in str(n)]
maxProduct = 0
for i in range(0,len(N)-4):
    newProduct = 1
    is_cons = 0
    for j in range(i,i+4):
        if N[j] == N[j+1] - 1:
        is_cons += 1
    if is_cons == 5:
        for j in range(i,i+5):
            newProduct *= N[j]
        if newProduct > maxProduct:
            maxProduct = newProduct
print maxProduct

I have been working on this problem for hours, and I cannot get this to work. I tried making this algorithm on paper and it works great. Could you give me clues what is wrong?

+3
source share
7 answers

I think you misunderstood the problem. Where he says “5 consecutive digits”, it means only 5 digits that go one after the other - you are not to check that the values ​​of the digits are consecutive (that is, each is larger than the last). So throw away all the logic is_consand just check the product of each 5-digit block.

+3
source

, , . , max, ( , ) , 2/3 ( , product, , , )

+2

, : range(n, m) n m , .. range(N, N+4) ( ).

+1

, @tokland.

from itertools import islice
from operator import mul

def max_product(num, length=5):
    num_list = map(int, str(num))
    num_slices = (islice(num_list, x, x+length) for x in xrange(0, len(num_list)-length))
    return max(reduce(mul, y) for y in num_slices)

.

from itertools import izip, islice, imap, tee
from operator import mul

def max_product(num, length=5):
    num_lists = enumerate(tee(imap(int, str(num)), length))
    digit_slices = izip(*[islice(num_list, ord, None) for ord, num_list in num_lists])
    return max(reduce(mul, y) for y in digit_slices)
0

@tokeland, , , . , @delnan, (i, + 4) 4 . ,

 n = str([whatever number])
 maximum = 0
 for i in range(0,len(n)):
     substr = n[i:i+5]
     product = 1
     for digit in substr:
         product *= int(digit)
         if product > maximum:
              maximum = product
 return maximum
0

:

number = '\
73167176531330624919225119674426574742355349194934\
96983520312774506326239578318016984801869478851843\
85861560789112949495459501737958331952853208805511\
12540698747158523863050715693290963295227443043557\
66896648950445244523161731856403098711121722383113\
62229893423380308135336276614282806444486645238749\
30358907296290491560440772390713810515859307960866\
70172427121883998797908792274921901699720888093776\
65727333001053367881220235421809751254540594752243\
52584907711670556013604839586446706324415722155397\
53697817977846174064955149290862569321978468622482\
83972241375657056057490261407972968652414535100474\
82166370484403199890008895243450658541227588666881\
16427171479924442928230863465674813919123162824586\
17866458359124566529476545682848912883142607690042\
24219022671055626321111109370544217506941658960408\
07198403850962455444362981230987879927244284909188\
84580156166097919133875499200524063689912560717606\
05886116467109405077541002256983155200055935729725\
71636269561882670428252483600823257530420752963450'

print max([reduce(lambda accum, x : accum * x, [int(x) for x in number[i:i+5]]) for i in range(len(number) - 5)])
0

10 & #. 5 {. (}. ~ I. @(= > ./) @(5 & (*/))) 10 #. ^: _ 1

- J-, - .

, : , , , (, , , , , , . J - , , , . . , . . , .

I think the problems with 8 are really worked out, just head to Euler - they are simple, most of them are one liner in J.

I'm not sure that I did it as one liner the first time I could have an intermediate named variable, but since I did some of these problems, I think I know J much better than me, and I can formulate this phrase along with this without any problems, I know where to put the brackets. At the same time, the implementation of the Euler exercises was successful.

0
source

Source: https://habr.com/ru/post/1780044/


All Articles