Python 2.7-380378372371367363357354352 348336 karakter
Sadece basit bir kaba kuvvet araması.
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]
Örnek çalışma:
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)
Açıklama:
s(x)
bir basamak dizisi içeren bir dize alan ve bu basamakları bu sırayı kullanarak tüm ifadeleri döndüren bir işlevdir.
[x]['1'>x>'0':]
x '0' ise x içeren bir liste veya '0' ile başlamayan bir basamak dizisini değerlendirir; aksi takdirde boş bir liste olarak değerlendirilir. Temel olarak bu, tüm rakamları bir araya getirdiğim durumu ele alır.
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
temelde x'i iki parçaya ayırır (her ikisi de sıfırdan farklı uzunluktadır), her parçada s () öğesini çağırır ve product () öğesini kullanarak aralarındaki bazı işleçlerle tüm sonuçları birleştirir.
E(e)
temelde güvenli bir değerlendirmedir. E geçerliyse e değerini, aksi halde Yok değerini döndürür.
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}
Temel olarak bu kod aralıktaki tüm sayıları dener, basamaklarına izin verir ve s () 'nin ürettiği her ifadeyi o permütasyon için test eder, x' 0 'ile başlamazsa ilk ifadeyi yok sayar, çünkü x' 0 'ise ilk ifade x olur.
Alternatif versiyon - 397 karakter
Kesirler kullanmanız gerekirse benim kodum:
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","")
/çalıştığını açıklayabilir misiniz? Mesela nedir1/3?