On Tue, Jun 15, 2010 at 6:21 AM, Alain Ketterlin <al...@dpt-info.u-strasbg.fr> wrote: > 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
In fact, most of them are unnecessary: from itertools import izip, cycle def squares(start, stop): square = start * start step = start * 2 + 1 for root in xrange(start, stop): yield square square += step step += 2 print sum(sign * square for sign, square in izip(cycle([1,1,1,-1,-1]), squares(1, 2011))) Now, anybody know how to make that version a one-liner without making it go quadratic in run-time? Cheers, Ian -- http://mail.python.org/mailman/listinfo/python-list