In [ ]:
import time
def timer():
start = time.time()
def f(report=False):
elapsed = time.time() - start
if report:
print ("time elapsed %5.3f" % elapsed)
return elapsed
return f
We are only looking for combinations with $i<limit$
In [55]:
limit = 250
In [56]:
mytimer = timer()
can_reach = set()
numbers = set(range(1,100))
for i in range(0,limit):
for j in range (0,limit):
num = 4*i + 9*j
can_reach = can_reach | {num}
can_not_reach = numbers - can_reach
t_sqr = mytimer(True)
can_not_reach
Out[56]:
In [57]:
mytimer = timer()
can_reach = set()
numbers = set(range(1,100))
for i in range(0,limit):
for j in range (0,i+1):
num = 4*j + 9*(i-j)
#print ("%i = 4*%i + 9*%i" % (num,j,i-j))
can_reach = can_reach | {num}
can_not_reach = numbers - can_reach
t_tria = mytimer(True)
can_not_reach
Out[57]:
Here use a more pythonic functional style
In [58]:
from operator import add
from itertools import product
mytimer = timer()
fours = range(0,4*limit,4)
nines = range(0,9*limit,9)
fours_and_nines = product(fours, nines)
fours_plus_nines = map( lambda x: add (*x), fours_and_nines)
set(range(100)) - set(fours_plus_nines)
t_func = mytimer(True)
In [59]:
print ("triangle sum vs square sum = %2.0fx" % (t_sqr / t_tria))
print ("functional vs triangle sum = %2.0fx" % (t_tria / t_func))
print ("functional vs square sum = %2.0fx" % (t_sqr / t_func))
In [59]: