Python 2.7 - 380 378 372 371 367 363 357 354 352 348 336 caratteri
Solo una semplice ricerca di forza 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]
Esempio di esecuzione:
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)
Spiegazione:
s(x)
è una funzione che accetta una stringa contenente una sequenza di cifre e restituisce tutte le espressioni usando quelle cifre in quell'ordine.
[x]['1'>x>'0':]
restituisce un elenco contenente x se x è '0' o una sequenza di cifre che non iniziano con '0'; in caso contrario, restituisce un elenco vuoto. Fondamentalmente questo gestisce il caso in cui unisco tutte le cifre insieme.
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
fondamentalmente partizioni x in due parti (entrambe di lunghezza diversa da zero), chiama s () su ciascuna parte e unisce tutti i risultati insieme ad alcuni operatori tra loro, utilizzando product ().
E(e)
è fondamentalmente una valutazione sicura. Restituisce il valore di e se e è valido e Nessuno altrimenti.
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}
Fondamentalmente questo codice prova tutti i numeri nell'intervallo, permette le loro cifre e verifica ogni espressione che s () genera per quella permutazione, ignorando la prima espressione se x non inizia con '0', perché se x non inizia con ' 0 'quindi la prima espressione sarà solo x.
Versione alternativa - 397 caratteri
Ecco il mio codice se ti viene richiesto di usare le frazioni:
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","")
/funziona? Ad esempio cos'è1/3?