Stefan Behnel, 15.06.2010 14:23:
superpollo, 15.06.2010 13:49:
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

Pretty ugly, if you ask me. What about this:

s = 0
for i in range(1, 2011):
    if i%5 in (1,2,3):
        s += i**2
    else:
        s -= i**2

Here's the obvious one-liner:

s = sum(i**2 if i%5 in (1,2,3) else -i**2
    for i in range(1, 2011))

Runs in ~600 usecs for me according to timeit - pretty fast.

Just for the record, this Cython code runs in ~15 usecs for me:

    def makesum():
        return <int>sum(i**2 if i%5 in (1,2,3) else -i**2
                        for i in range(1, 2011))

using the latest Cython 0.13pre. The "<int>" cast is required to drop the sum() into efficient C code. Without it, the code runs in 55 usecs.

Stefan

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to