I finished Project Euler 93 this morning.

I enjoyed reading Kristian’s blueprint to the problem at Mathblog, and I emulated his approach in generating all the brute force combinations of digits a**
**

Rather then writing code for the mathematical operators +,-,*,/ and figuring out how to write the priority of mathematical operators (i.e. scan from left to right, do operators within parentheses first, and do *,/ before doing +,-), I ended up mostly doing string operations and then sending the resulting string directly to the Python operator using the eval() function.

You have to be careful of the DIV/#0 error, so you have to write an exception handler for that error.

Also, you have to be careful because in python, all of the numbers are initially handled as integers, so when dividing, i.e. 4/3, Python will give you the result 1. So when dealing with division, you have to convert the numbers to float first, to get Python to return 4/3 = 1.3333.

Finally - we keep track of the maximum N and the combination that yields that maximum N.

Solution took 100 seconds, so it did violate the 1 minute rule for Project Euler. Oh well!

# euler 93 import time t0 = time.time() import itertools temp = itertools.combinations(’0123456789′,4) c = [] for i in temp: j = [x for x in i] c.append(j) op = [i for i in itertools.product('+-*/',repeat=3)] def calc(c, op): temp = c[0] + op[0] + c[1] + op[1] + c[2] + op[2] + c[3] return temp ## use string operations to insert parentheses def insParenth(s): #takes a+b+c+d a = s[:] b = s[:2] + ‘(‘ + s[2:5] + ‘)’ + s[5:] # a + (b+c) + d c = s[:4] + ‘(‘ + s[4:7] + ‘)’ # a+b+(c+d) d = s[:2] + ‘(‘ + s[2:7] + ‘)’ # a+(b+c+d) e = ‘(‘ + s[:3] + ‘)’ + s[3] + ‘(‘ + s[4:7] + ‘)’ #(a+b)+(c+d) return [a,b,c,d,e] def convToFloat(st): #if there is a divide operation, we need to convert to floating if ‘/’ in st: output = ” for i in st: if i in ’0123456789′: output += ‘float(‘ + i + ‘)’ else: output += i return output else: return st def evalP(par): output = [] for a in par: try: output.append(eval(a)) except ZeroDivisionError: output.append(None) return output largestSoFar = 0 for i in c: #unique combinations of a= 1: test.add(k) elif type(k) == float: if int(k) !=0: if k % int(k) == 0 and k >= 1: test.add(int(k)) ## print i, test startNum = 1 while startNum in test: startNum += 1 ## print “the first number not in the set is “, startNum mn = startNum – 1 ## print “the max number is “, mn if mn > largestSoFar: largestSoFar = mn answer = i print “the largest N so far is “, largestSoFar print “the answer so far is “, answer print “” t1 = time.time() print t1-t0, “seconds”