Python 2.7 - 380 378 372 371 367 363 357 354 352 348 336 caracteres
Apenas uma simples pesquisa de força 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]
Exemplo de execução:
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)
Explicação:
s(x)
é uma função que pega uma sequência que contém uma sequência de dígitos e retorna todas as expressões usando esses dígitos nessa ordem.
[x]['1'>x>'0':]
avalia para uma lista que contém x se x é '0' ou uma sequência de dígitos que não começa com '0'; caso contrário, ele será avaliado como uma lista vazia. Basicamente, isso lida com o caso em que uno todos os dígitos.
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
basicamente divide as partições x em duas partes (ambas com comprimento diferente de zero), chama s () em cada parte e junta todos os resultados com algum operador entre elas, usando product ().
E(e)
é basicamente uma avaliação segura. Retorna o valor de e se e for válido e None caso contrário.
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}
Basicamente, esse código tenta todos os números no intervalo, permite seus dígitos e testa cada expressão que s () gera para essa permutação, ignorando a primeira expressão se x não começar com '0', porque se x não começar com ' 0 ', então a primeira expressão será apenas x.
Versão alternativa - 397 caracteres
Aqui está o meu código se você precisar usar frações:
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 exemplo, o que é1/3
?