This code is so sloppy, but it works. It’s really a combinatorics problem. But I don’t yet know how to do combinatoric things with the algebraic functions +,-,*,/ as I can with integers.
from itertools import *
def target(l):
ans = []
for s in permutations(list(l)):
a = float(s[0]); b = float(s[1]); c = float(s[2]); d = float(s[3])
ans.append(((a+b)-c)*d)
ans.append(((a+b)-c)/d)
ans.append(((a+b)*c)-d)
ans.append(((a+b)*c)/d)
ans.append(((a+b)/c)-d)
ans.append(((a+b)/c)*d)
ans.append(((a-b)+c)*d)
ans.append(((a-b)+c)/d)
ans.append(((a-b)*c)+d)
ans.append(((a-b)*c)/d)
ans.append(((a-b)/c)+d)
ans.append(((a-b)/c)*d)
ans.append(((a*b)+c)-d)
ans.append(((a*b)+c)/d)
ans.append(((a*b)-c)+d)
ans.append(((a*b)-c)/d)
ans.append(((a*b)/c)+d)
ans.append(((a*b)/c)-d)
ans.append(((a/b)+c)-d)
ans.append(((a/b)+c)*d)
ans.append(((a/b)-c)+d)
ans.append(((a/b)-c)*d)
ans.append(((a/b)*c)+d)
ans.append(((a/b)*c)-d)
ans.append(((a+b)+c)-d)
ans.append(((a+b)-c)+d)
ans.append(((a-b)+c)+d)
ans.append(((a+b)+c)*d)
ans.append(((a+b)*c)+d)
ans.append(((a*b)+c)+d)
ans.append(((a+b)+c)/d)
ans.append(((a+b)/c)+d)
ans.append(((a/b)+c)+d)
ans.append(((a-b)-c)*d)
ans.append(((a-b)*c)-d)
ans.append(((a*b)-c)-d)
ans.append(((a-b)-c)/d)
ans.append(((a-b)/c)-d)
ans.append(((a/b)-c)-d)
ans.append(((a*b)*c)/d)
ans.append(((a*b)/c)*d)
ans.append(((a/b)*c)*d)
ans.append(((a-b)-c)+d)
ans.append(((a-b)+c)-d)
ans.append(((a+b)-c)-d)
ans.append(((a*b)*c)+d)
ans.append(((a*b)+c)*d)
ans.append(((a+b)*c)*d)
ans.append(((a/b)/c)+d)
ans.append(((a/b)+c)/d)
ans.append(((a+b)/c)/d)
ans.append(((a*b)*c)-d)
ans.append(((a*b)-c)*d)
ans.append(((a-b)*c)*d)
ans.append(((a/b)/c)-d)
ans.append(((a/b)-c)/d)
ans.append(((a-b)/c)/d)
ans.append(((a/b)/c)*d)
ans.append(((a/b)*c)/d)
ans.append(((a*b)/c)/d)
ans.append(((a+b)+c)+d)
ans.append(((a-b)-c)-d)
ans.append(((a*b)*c)*d)
ans.append(((a/b)/c)/d)
ans.append((a+b)-(c*d))
ans.append((a+b)-(c/d))
ans.append((a+b)*(c-d))
ans.append((a+b)*(c/d))
ans.append((a+b)/(c-d))
ans.append((a+b)/(c*d))
ans.append((a-b)+(c*d))
ans.append((a-b)+(c/d))
ans.append((a-b)*(c+d))
ans.append((a-b)*(c/d))
ans.append((a-b)/(c+d))
ans.append((a-b)/(c*d))
ans.append((a*b)+(c-d))
ans.append((a*b)+(c/d))
ans.append((a*b)-(c+d))
ans.append((a*b)-(c/d))
ans.append((a*b)/(c+d))
ans.append((a*b)/(c-d))
ans.append((a/b)+(c-d))
ans.append((a/b)+(c*d))
ans.append((a/b)-(c+d))
ans.append((a/b)-(c*d))
ans.append((a/b)*(c+d))
ans.append((a/b)*(c-d))
ans.append((a+b)+(c-d))
ans.append((a+b)-(c+d))
ans.append((a-b)+(c+d))
ans.append((a+b)+(c*d))
ans.append((a+b)*(c+d))
ans.append((a*b)+(c+d))
ans.append((a+b)+(c/d))
ans.append((a+b)/(c+d))
ans.append((a/b)+(c+d))
ans.append((a-b)-(c*d))
ans.append((a-b)*(c-d))
ans.append((a*b)-(c-d))
ans.append((a-b)-(c/d))
ans.append((a-b)/(c-d))
ans.append((a/b)-(c-d))
ans.append((a*b)*(c/d))
ans.append((a*b)/(c*d))
ans.append((a/b)*(c*d))
ans.append((a-b)-(c+d))
ans.append((a-b)+(c-d))
ans.append((a+b)-(c-d))
ans.append((a*b)*(c+d))
ans.append((a*b)+(c*d))
ans.append((a+b)*(c*d))
ans.append((a/b)/(c+d))
ans.append((a/b)+(c/d))
ans.append((a+b)/(c/d))
ans.append((a*b)*(c-d))
ans.append((a*b)-(c*d))
ans.append((a-b)*(c*d))
ans.append((a/b)/(c-d))
ans.append((a/b)-(c/d))
ans.append((a-b)/(c/d))
ans.append((a/b)/(c*d))
ans.append((a/b)*(c/d))
ans.append((a*b)/(c/d))
ans.append((a+b)+(c+d))
ans.append((a-b)-(c-d))
ans.append((a*b)*(c*d))
ans.append((a/b)/(c/d))
return sorted(clean(ans))
def clean(l):
ans = set()
for n in l:
if n%1 == 0 and n > 0:
ans.add(int(n))
return list(ans)
def longest(l):
i = 0
for n in l:
i += 1
if n != i:
return i-1
big = [0,0]
for l in combinations(range(1, 10), 4):
this = longest(target(l))
if this > big[0]:
big = [this, l]
print l, big
print big