superpollo <ute...@esempio.net> writes: > goal (from e.c.m.): evaluate > 1^2+2^2+3^2-4^2-5^2+6^2+7^2+8^2-9^2-10^2+...-2010^2, where each three > consecutive + must be followed by two - (^ meaning ** in this context) > > my solution: > >>>> s = 0 >>>> for i in range(1, 2011): > ... s += i**2 > ... if not (i+1)%5: > ... s -= 2*i**2 > ... if not i%5: > ... s -= 2*i**2
You compute i**2 too many times (7/5 times more than necessary) and twice too many modulos. I suggest: c = { 0:1, 1:1, 2:1, 3:-1, 4:-1 } #or, why not: c = lambda i : +1 if (i%5) < 3 else -1 s = 0 for i in range(1,2011): s += c[(i-1)%5]*(i**2) print s Or, as a one liner using a list comprehension: print sum( ( c[(i-1)%5]*i**2 for i in xrange(1,2011) ) ) I don't know which one is the fastest (between dict+loop, dict+compr, lambda+loop and lambda+compr). -- Alain. -- http://mail.python.org/mailman/listinfo/python-list