四則そるばー

いやー 昨日つくろうって 頑張ってから欠陥が多くてですねー
なかなか思い通りに生きませんのですよー。

とりあえずコードうp

#coding:utf-8

def narabikae(list,x):           ## list!
	if list and x!=0:return [[h]+t for i,h in enumerate(list) for t in narabikae(list[:i]+list[i+1:],x-1)]
 	else:return [[]]                          


def set(a):
	res=[]
	while a:
		n=a.pop(0)
		res.append(n)
		for x in range(a.count(n)):a.remove(n)
	return res
		
def prime(lists,x):                 #len(lists)**x
	if x==0:return [[]]
	else: return [([h]+t) for h in lists for t in prime(lists,x-1)]

def cat(x):                       #4^(x-1)
	if x==1:return ['(n)']
	else:
		return  list(set(['('+a+'xn)' for a in cat(x-1)]+['(nx'+a+')' for a in cat(x-1)] + ['(n)x'+b for b in cat(x-1)] + [c+'x(n)' for c in cat(x-1)]))

def comb(num,enz,kak):
	shiki=""
	for i in kak:
		t=i
		if i=='x':t=str(enz.pop(0))
		elif i=='n':t=str(num.pop(0))
		shiki+=t	
	return shiki   
	
	

	
def solve(numlist,ans):
	numlist=map(float,numlist)
	numlists=narabikae(numlist,len(numlist))
	enzansi=prime(['/','+','-','*'],len(numlist)-1)	
	klist=cat(len(numlist))
	for a in numlists:                          
		for b in enzansi:                     
			for c in klist:               
				shiki=comb(a[:],b[:],c)
				try:exec ("TF=(-1/10000.0<"+shiki+"-ans<1/10000.0)")
				except ZeroDivisionError: continue
				if TF:return comb(map(int,a),b[:],c) 
				

いやー なんとも汚いものになってしまいましたー
思いっきり全探索です。
数字、演算子、括弧ぜんぶの並びを全通りやってますので 数字が6つになったあたりからオーダーが10^10位になってしまう
括弧の並びと演算子の並びをデータ化して無駄をなくせば何とかなりそうなんだがー

とりあえず実行

>>> solve([1,1,3,7,7],3.14)
 '((1/(((1)/7)+7))+3)'

5つまでなら数秒で答えが出るんですけどねー
またオーダーを減らしに頑張りたいと思います