Python 2,7 - 380 378 372 371 367 363 357 354 352 348 336 znaków
Po prostu proste wyszukiwanie brutalnej siły.
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]
Przykładowy przebieg:
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)
Wyjaśnienie:
s(x)
to funkcja, która pobiera ciąg zawierający sekwencję cyfr i zwraca wszystkie wyrażenia korzystające z tych cyfr w tej kolejności.
[x]['1'>x>'0':]
ewaluuje do listy zawierającej x, jeśli x jest równe „0” lub ciąg cyfr nie rozpoczynający się od „0”; w przeciwnym razie przejdzie do pustej listy. Zasadniczo dotyczy to przypadku, w którym łączę wszystkie cyfry razem.
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
w zasadzie dzieli x na dwie części (obie o niezerowej długości), wywołuje s () na każdej części i łączy wszystkie wyniki wraz z pewnym operatorem między nimi za pomocą product ().
E(e)
jest w zasadzie bezpieczną ewaluacją. Zwraca wartość e, jeśli e jest poprawny, a Brak w przeciwnym razie.
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}
Zasadniczo ten kod wypróbowuje wszystkie liczby z zakresu, permutuje ich cyfry i testuje każde wyrażenie s () generuje dla tej permutacji, ignorując pierwsze wyrażenie, jeśli x nie zaczyna się od „0”, ponieważ jeśli x nie zaczyna się od „ 0 ', wówczas pierwszym wyrażeniem będzie po prostu x.
Wersja alternatywna - 397 znaków
Oto mój kod, jeśli musisz używać ułamków:
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","")
/działa? Na przykład co to jest1/3?