Python 2.7 - 380 378 372 371 367 363 357 354 352 348 336 Zeichen
Nur eine einfache Brute-Force-Suche.
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]
Beispiellauf:
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)
Erläuterung:
s(x)
ist eine Funktion, die eine Zeichenfolge mit einer Folge von Ziffern verwendet und alle Ausdrücke mit diesen Ziffern in dieser Reihenfolge zurückgibt.
[x]['1'>x>'0':]
ergibt eine Liste mit x, wenn x '0' ist oder eine Folge von Ziffern, die nicht mit '0' beginnen; Andernfalls wird eine leere Liste ausgewertet. Grundsätzlich behandelt dies den Fall, in dem ich alle Ziffern zusammenfüge.
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
Grundsätzlich wird x in zwei Teile aufgeteilt (beide haben eine Länge ungleich Null), es wird s () für jeden Teil aufgerufen und alle Ergebnisse zusammen mit einem Operator zwischen ihnen zusammengefügt, indem product () verwendet wird.
E(e)
ist im Grunde eine sichere Bewertung. Es gibt den Wert von e zurück, wenn e gültig ist, und andernfalls 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}
Grundsätzlich versucht dieser Code alle Zahlen im Bereich, permutiert ihre Ziffern und testet jeden Ausdruck, den s () für diese Permutation generiert, wobei der erste Ausdruck ignoriert wird, wenn x nicht mit '0' beginnt, denn wenn x nicht mit 'beginnt' 0 'dann ist der erste Ausdruck nur x.
Alternative Version - 397 Zeichen
Hier ist mein Code, wenn Sie Brüche verwenden müssen:
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","")
/funktioniert? Was ist zum Beispiel1/3?