四則そるばー
いやー 昨日つくろうって 頑張ってから欠陥が多くてですねー
なかなか思い通りに生きませんのですよー。
とりあえずコードう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つまでなら数秒で答えが出るんですけどねー
またオーダーを減らしに頑張りたいと思います