Python 2.7-380 378 372 371 367 363 357 354 352 348 336文字
単純なブルートフォース検索。
from itertools import*
s=lambda x:[x]['1'>x>'0':]+['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
def E(e):
try:return eval(e.replace("^","**"))
except:0
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
print len(A)
for v in A:print v,A[v]
実行例:
1
300
9
128 (2^(8-1))
289 ((9+8)^2)
216 (6^(1+2))
121 (11^2)
153 (3*51)
25 (5^2)
125 (5^(2+1))
126 (6*21)
127 ((2^7)-1)
説明:
s(x)
は、一連の数字を含む文字列を受け取り、それらの数字をこの順序で使用してすべての式を返す関数です。
[x]['1'>x>'0':]
xが「0」または「0」で始まらない一連の数字の場合、xを含むリストとして評価されます。それ以外の場合は、空のリストとして評価されます。基本的に、これはすべての桁を結合する場合を処理します。
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
基本的に、xを2つの部分(両方とも長さがゼロでない部分)に分割し、各部分でs()を呼び出し、product()を使用してすべての結果をいくつかの演算子で結合します。
E(e)
基本的に安全な評価です。eが有効な場合はeの値を返し、それ以外の場合はNoneを返します。
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
基本的に、このコードは範囲内のすべての数値を試し、桁を並べ替え、s()がその順列について生成する各式をテストします。xが「0」で始まらない場合、最初の式を無視します。 0 'の場合、最初の式は単にxになります。
代替バージョン-397文字
分数を使用する必要がある場合のコードは次のとおりです。
from fractions import*
from itertools import*
s=lambda x:["Fraction(%s)"%x]['1'>x>'0':]+['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
def E(e):
try:return eval(e.replace("^","**"))
except:0
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
print len(A)
for v in A:print v,A[v].replace("Fraction","")
/仕組みを説明できますか?たとえば何1/3ですか?