Python 2.7 - 380 378 372 371 367 363 357 354 352 348 336 caracteres
Solo una simple búsqueda de fuerza bruta.
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]
Ejemplo de ejecución:
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)
Explicación:
s(x)
es una función que toma una cadena que contiene una secuencia de dígitos y devuelve todas las expresiones usando esos dígitos en ese orden.
[x]['1'>x>'0':]
se evalúa como una lista que contiene x si x es '0' o una secuencia de dígitos que no comienza con '0'; de lo contrario, se evalúa como una lista vacía. Básicamente, esto maneja el caso donde unir todos los dígitos juntos.
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
básicamente divide x en dos partes (ambas de longitud distinta de cero), llama a s () en cada parte y une todos los resultados junto con algún operador entre ellos, usando product ().
E(e)
es básicamente una evaluación segura Devuelve el valor de e si e es válido y Ninguno de lo contrario.
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}
Básicamente, este código prueba todos los números en el rango, permuta sus dígitos y prueba cada expresión que s () genera para esa permutación, ignorando la primera expresión si x no comienza con '0', porque si x no comienza con ' 0 ', entonces la primera expresión será simplemente x.
Versión alternativa - 397 caracteres
Aquí está mi código si debe usar fracciones:
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","")
/funciona? Por ejemplo, ¿qué es1/3?