Un nombre de Friedman est un nombre qui peut être exprimé en appliquant des opérations mathématiques de base (^, /, *, +, -) à tous ses chiffres. Les opérations n'ont pas besoin d'être appliquées à chaque chiffre individuel, mais tous les chiffres doivent être impliqués. Autrement dit, 121 = 11 ^ 2 -> tous les chiffres sont impliqués, mais 1 et 1 ont été groupés ensemble pour faire 11.
L'utilisation de parenthèses est autorisée, mais la solution triviale x= (x)
n'est pas une solution valide. Pas non plus valable, x= +x
.
- 25 = 5 ^ 2
- 121 = 11 ^ 2
- 343 = (3 + 4) ^ 3
- 2048 = (8 ^ 4) / 2 + 0
Écrivez un programme qui prendra deux entiers positifs et imprimera le nombre de nombres de Friedman dans cette plage (inclus), et les nombres avec les expressions dans les lignes suivantes.
Contribution -
n m | n, m integers, n>=0, m>n
Production -
count | number of Friedman numbers in the given range
fn1 exp1 | Friedman number, expression
fn2 exp2
fn3 exp3
.
.
.
Le code le plus court publié le dimanche 29 juillet à minuit GMT sera le gagnant.
/
fonctionne? Par exemple, qu'est-ce que c'est1/3
?-5
?Réponses:
Rubis,
456 438 408 390 370 349 344334 [fixe]Production:
De plus, cela fonctionne relativement rapidement pour de plus grands nombres:
la source
5 40
et a obtenu le résultat:[11, "11**1", 21, "21**1", 31, "31**1", 41, "41**1"]
. Aucun signe25
là-dedans et je pense que la bonne solution (par exemple pour21
) n'est2*1
pas21**1
'+-*/'.chars.to_a+['','**']
par["+","-","*","/","","**"]
Python 2,7 -
380 378 372 371 367 363 357 354 352 348336 caractèresJuste une simple recherche de force brute.
Exemple d'exécution:
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.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:
la source
if len(x)<2
cela fonctionnera jamaiss
. En outre, vous pouvez remplacer votreformat
par"a[Fraction(%s)%s%s]='(%s%s%s)'"%(x[:i],o,v,x[:i],o,A)
pour enregistrer 4 caractères.except:0
intelligent .. très intelligent. Je me souviendraiPython3
(436)(434)(443)C'était difficile. Je peux épargner certains caractères si je rend la sortie plus native.
Production
la source
"("+i+c+j+")"
et le remplacementlen(n)>1
par1<len(n)
après quoi vous pouvez supprimer l'espace après cette expression.for j in r:print(r[j],j)
pour enregistrer 7 caractères.Mathematica
456416402404400396 caractèresexemple :
Sortie :
la source