from gmpy2 import mpq # not used, the formula is evaluted the python way, not mathematically from __future__ import division from itertools import * def powerset(iterable): "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" s = list(iterable) return chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) # originally, use the code from http://mattdodge.net/24-a-childhood-game-taken-to-the-next-level/ # but it is buggy, cannot find solution of [12,12,12,10] # so I wrote my own def ev(nums): if len(nums)==1: return {nums[0]:"%d"%nums[0], -nums[0]:"-%d"%nums[0]} rtn =dict() for idx in powerset(range(len(nums))): if len(idx) in (0, len(nums)): continue s1 = sorted(nums[i] for i in idx) s2 = sorted(nums[i] for i in range(len(nums)) if i not in idx) if s1>s2: continue r1, r2 = ev(s1), ev(s2) for a,a1 in r1.items(): for b,b1 in r2.items(): rtn[a+b]="(%s)+(%s)"%(a1,b1) rtn[a*b]="(%s)*(%s)"%(a1,b1) # the code is ugly because it was originally wrote for rational numbers (mpq) # but then, modified the code for floating numbers instead because of // operator try: rtn[a/b]="(%s)/(%s)"%(a1,b1) except: pass try: rtn[b/a]="(%s)/(%s)"%(b1,a1) except: pass try: rtn[a//b]="(%s)//(%s)"%(a1,b1) except: pass try: rtn[b//a]="(%s)//(%s)"%(b1,a1) except: pass rtn[a-b]="(%s)-(%s)"%(a1,b1) rtn[b-a]="(%s)-(%s)"%(b1,a1) try: if b< 100: # avoid very large power rtn[a**b]="(%s)**(%s)"%(a1,b1) except: pass try: if a< 100: rtn[b**a]="(%s)**(%s)"%(b1,a1) except: pass return rtn def solve(n, nums): n = float(n) rtn = ev(nums) for k,v in rtn.items(): if abs(k-n)<0.000000001: return v solve(24, [5,5,5,2]) import telnetlib import sys tel = telnetlib.Telnet("210.65.89.59",2424) print "start" sys.stdout.flush() for i in range(1,25): r = tel.read_until("Question (%d of 24): "%i) print r sys.stdout.flush() r = tel.read_until("]") nums = map(int, r[1:-1].split(",")) ans = solve(24, nums) print nums, ans sys.stdout.flush() tel.write("%s\n"%ans) print tel.read_all()