introduction
Votre objectif est de trouver le moins de nombres dont vous avez besoin d'ajouter ou de multiplier ensemble pour obtenir la valeur d'entrée, c'est A005245 .
Contribution
Un nombre entier positif N .
Sortie
Le plus petit nombre de ceux qui doivent être ajoutés / multiplié pour obtenir N .
Exemple d'entrée
7
Exemple de sortie
6
Explication
(
1
+1
+1
) * (1
+1
) +1
= 7Parce que cela en nécessite
6
, la sortie est6
Cas de test
1 1
2 2
3 3
5 5
10 7
20 9
50 12
Comme il s'agit d'un défi de code-golf , le plus petit nombre d'octets gagne.
code-golf
sequence
arithmetic
integer
expression-building
Spyrali Chyuu
la source
la source
f(x) != x.primeFactorisation().sum()
sauf 1?Réponses:
Python 2 ,
7470 octetsEssayez-le en ligne!
Version alternative, 59 octets (non vérifié)
Cela fonctionne au moins jusqu'à n = 1 000 000 , mais je dois encore prouver que cela fonctionne pour tous les n positifs .
Essayez-le en ligne!
la source
n=a*j+b
avecb<j
, mais pourrions-nous avoir besoinb>=j
?b>=j
etb>=a
. Mais vous avez raison, il n'est pas évident que cela ne se produira pas.a*b+c*d
aveca,b,c,d
toutes les expressions de sommation et est très efficace.Gelée ,
1614 octetsMerci Dennis d'avoir économisé 2 octets!
Essayez-le en ligne!
Explication logique
Étant donné un nombre n :
1
, la réponse est1
. Autrement:La représentation est soit
a + b
oua × b
, oùa
etb
sont des expressions.Tenez compte de toutes les valeurs possibles de
a
etb
:a + b
, alorsa
etb
sont dans la plage[1 .. n-1]
.a × b
,a
etb
sont des diviseurs propresn
supérieurs à1
.Dans les deux cas, la liste
[[<proper divisors of n larger than 1>], [1, 2, ..., n-1]]
est calculée (ÆḌḊ,Ṗ
), mappez le lien actuel sur chaque nombre߀€
, ajoutez les paires correctes ensemble (+U$
) et obtenez la valeur minimale (FṂo
).Explication du code
la source
JavaScript (ES6),
10896 octetsTrès inefficace;
Array(n>>1)
l'accélère légèrement au prix d'un octet. Explication:n%++i
est non nul sii
n'est pas un facteur, il enn%++i/0
est de mêmeInfinity
(et donc véridique, et certainement pas minimal) sii
n'est pas un facteur, maisNaN
(et donc falsifié) sii
est un facteur. Edit: 12 octets enregistrés avec l'inspiration de @ edc65.la source
f(50)
mais malheureusement, Windows Update a redémarré mon PC avant qu'il ne puisse terminer.a
tableau. Vous ne pouvez pas fusionner les évaluations dans les 2 lambdas et prendre le min?(i+=2)
par un autre,++i
donc j'économise 12 octets au total, merci!Pari / GP , 66 octets
Un port de la réponse Python de Dennis :
Essayez-le en ligne!
Pari / GP , 72 octets
Plus long, mais plus efficace:
Essayez-le en ligne!
la source
f(n)=vecmin(concat(n,[f(j)+f(n\j)+f(n%j)|j<-[2..n-1]]))
.Pari / GP , 213 octets
Edit: j'ai été sévèrement battu .
Essayez-le en ligne!
la source
Python 2 , 181 octets
Essayez-le en ligne!
la source
f
doit pas être anonyme, car elle s'appelle récursivement.Wolfram Language (Mathematica) , 59 octets
Enregistré 3 octets grâce à Martin Ender. Utilisation du codage CP-1252, où
±
est un octet.Essayez-le en ligne!
la source
±
au lieu d'f
enregistrer 3 octets en supposant que la source est codée dans CP 1252: tio.run/##y00syUjNTSzJTE78///QRkNbQ@tDG/PirWx9M/…Perl 5 , -p 78 octets
79 octets en comptage à l'ancienne (
+1
pour-p
)Le fait que perl doive utiliser un extra
$
pour tous les accès scalaires nuit vraiment à la longueur des golfs qui font beaucoup d'arithmétique ...Cette méthode est principalement similaire aux autres déjà publiées (essayez la multiplication et l'ajout pour construire un nombre cible, prenez le moins cher). Cependant, il ne recuit pas de manière répétée, il peut donc être utilisé pour des entrées relativement importantes.
Il n'essaie pas non plus de minimiser le coût de construction d'un nombre par addition ou par multiplication, car perl 5 n'a pas de tri intégré
min
et numérique est looooooong (comme le montre le tri toujours dans le code). Au lieu de cela, je suppose simplement que si un nombre est un facteur de la cible, j'utiliserai la multiplication. C'est sûr car si par exemple3
est un facteur de12
(donc il résume le coût de3
et12/3
) plus tard dans la boucle, il considérera9=12-3
ce qui ne sera pas un facteur, donc9+3
avec le même coût que celui qui3+9
sera essayé de toute façon. Cependant, cela peut échouer pour les cibles<= 4
(cela ne fonctionne que pour1
et2
). Ajout$_
à la liste pour minimiser les correctifs. Ce qui est regrettable car je n'ai pas vraiment besoin de cela pour les cas de base car j'ai déjà initialisé@;
avec les valeurs de départ appropriées, donc cela coûte 3 octets.Essayez-le en ligne!
la source