Python 2,7 - 380 378 372 371 367 363 357 354 352 348 336 caractères
Juste une simple recherche de force brute.
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]
Exemple d'exécution:
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)
Explication:
s(x)
est une fonction qui prend une chaîne contenant une séquence de chiffres et renvoie toutes les expressions utilisant ces chiffres dans cet ordre.
[x]['1'>x>'0':]
évalue à une liste contenant x si x est «0» ou une séquence de chiffres ne commençant pas par «0»; sinon, il évalue à une liste vide. Fondamentalement, cela gère le cas où je joins tous les chiffres ensemble.
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
partitionne essentiellement x en deux parties (les deux étant de longueur non nulle), appelle s () sur chaque partie et joint tous les résultats avec un opérateur entre eux, en utilisant product ().
E(e)
est fondamentalement un eval sûr. Il renvoie la valeur de e si e est valide et None sinon.
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}
Fondamentalement, ce code essaie tous les nombres de la plage, permute leurs chiffres et teste chaque expression que s () génère pour cette permutation, ignorant la première expression si x ne commence pas par '0', parce que si x ne commence pas par ' 0 'alors la première expression sera simplement x.
Version alternative - 397 caractères
Voici mon code si vous devez utiliser des fractions:
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","")
/
fonctionne? Par exemple, qu'est-ce que c'est1/3
?