Inspirée des racines numériques, la racine factorielle principale d'un nombre est le nombre qui émerge lorsque vous prenez les facteurs premiers d'un nombre, les additionnez et répétez le processus sur le nombre résultant, en continuant jusqu'à ce que vous obteniez un nombre premier ( qui a lui-même comme seul facteur premier, et est donc sa propre racine factorielle). La racine factorielle première de 4 est 4, comme 2 * 2 = 2 + 2, et c'est la seule racine factorielle première non première d'un entier supérieur à 1 (ce qui est un autre cas spécial, car il n'a pas de facteurs premiers). La séquence OEIS formée par les racines factorielles principales est A029908 .
Par exemple, la racine factorielle principale de 24 est:
24=2*2*2*3
2+2+2+3=9=3*3
3+3=6=2*3
2+3=5, and the only prime factor of 5 is 5. Therefore, the prime factoral root of 24 is 5.
Ta tâche:
Écrivez un programme ou une fonction qui trouve la racine factorielle principale d'un entier en entrée.
Contribution:
Un entier, entré par toute méthode raisonnable, entre 2 et le plus grand entier pris en charge par votre langue (inclus). Plus précisément, le choix d'une langue dont la taille maximale maximale est déraisonnablement faible n'est pas autorisé (et viole également cette échappatoire standard )
Production:
Un entier, la racine factorielle principale de l'entrée.
Cas de test:
4 -> 4
24 -> 5
11 -> 11
250 -> 17
Notation:
C'est le code-golf , le score le plus bas en octets gagne!
4
dans les cas de test, car il s'agit d'une exception et il est facile de l'oublier lors du test d'une réponse?Réponses:
05AB1E , 3 octets
Essayez-le en ligne!
Explications:
la source
4
.Haskell , 61 octets
Essayez-le en ligne!
Explication
until=<<((==)=<<)
prend une fonctionf
et l'applique à l'entréex
jusqu'à ce qu'un point fixe soit atteint, c'est-à-diref x
égalx
.primeFactors
renvoie la liste des facteurs premiers d'un nombre,sum
donne la somme d'une liste de nombres.Mais attendez, pourquoi
until=<<((==)=<<)
le travail et si étrange?Si nous supposons
f=sum.primeFactors
, une définition plus naturelle seraituntil(\x->f x==x)f
, caruntil
prend un prédicat (une fonction qui renvoie un booléen), une fonction qui a le même type d'entrée et de retour (par exempleInt -> Int
) et la même valeur de ce type, puis applique la fonction à la jusqu'à ce que le prédicat soit rempli.until(\x->f x==x)f
est le même queuntil(\x->(==)(f x)x)f
, et comme ilg (h x) x
est le même que(g=<<h)x
, nous obtenonsuntil(\x->((==)=<<f)x)f
. Après la conversion Eta , cela devientuntil((==)=<<f)f
. Mais si nous traitons maintenant(==)=<<
comme une fonction qui est appliquée àf
, nous pouvons voir queuntil(((==)=<<)f)f
c'est encore de la formeg (h x) x
, avecg=until
,h=((==)=<<)
etx=f
, donc elle peut être réécrite en(until=<<((==)=<<))f
. L'utilisation de l'$
opérateur pour se débarrasser des parenthèses externes et le remplacementf
parsum.primeFactors
donne la solution d'en haut.la source
=<<((==)=<<)$
Whaaaaaat.Husk , 4 octets
Essayez-le en ligne!
Explication:
la source
Pyth , 3 octets
Essayez-le ici.
Explication:
la source
The trailing GQ is implicit
Python 2 , 84 octets
Essayez-le en ligne!
la source
f=lambda n,d=2:n>1and(n%d and f(n,d+1)or d+f(n/d))
marche? Je n'ai jamais programmé en Python (principalement Java et C #), donc je ne sais pas quel est le résultat de cette fonction. Cette fonction modifie-t-elle l'entréen
et la retourne-t-elle ensuite, ou est-elle similaire à un booléen oùn>1and(n%d and f(n,d+1)or d+f(n/d))
est soit 0 ou 1, soit 0 oun
, ou autre chose? J'essaie de visualiser à quoi ressemblerait un port en Java / C #, mais je ne peux pas car je ne comprends pas vraiment les lambdas Python comme celui-ci en général.n>1 ? (n%d!=0 ? f(n, d+1) : d+f(n/d)) : n>1
. En termes générauxx and y
est équivalent àx ? y : x
.x and y or z
est équivalent àx ? y : z
dans la plupart des cas.f=(n,d=2)->n>1?n%d>0?f(n,d+1):d+f(n/d):0
.x and y
êtrex ? y : x
de JavaScript. Merci!Java 8,
175144142141 141 octets-1 octet grâce à @Nevay .
Contrairement aux octets uniques dans certains des langages de golf, Java est assez verbeux pour les vérifications de prime, les facteurs premiers, les sommes numériques, etc., donc je suppose que moins de 200 n'est pas trop minable.
Peut très probablement encore être joué en combinant des boucles
et en n'utilisant pas une méthode récursive séparée pour la somme des chiffres.Explication:
Essayez-le ici.
la source
i,t=n,x
semble qu'il appartient à Python, hahaint
(contrairement à Python). ;)i++<n
place de++i<=n
.Gelée , 5 octets
Explications:
Essayez-le en ligne!
la source
Rétine , 30 octets
Entrée et sortie unaires .
Essayez-le en ligne! (Effectue une conversion décimale / unaire pour plus de commodité.)
Explication
Le programme
{
demande à Retina d'exécuter le programme entier en boucle jusqu'à ce qu'un passage complet ne parvienne pas à modifier la chaîne, c'est-à-dire jusqu'à ce qu'un point fixe soit atteint. Par conséquent, le programme lui-même calcule une étape de sommation des facteurs premiers de la valeur actuelle.Cette étape elle-même calcule la factorisation première de l'entrée. Le
+
est similaire à{
mais boucle uniquement cette étape jusqu'à ce qu'il arrête de changer la chaîne. La regex essaie de faire correspondre la séquence finale de1
s en faisant correspondre à plusieurs reprises la même sous-chaîne (c'est-à-dire le facteur). La façon dont cela est fait est un peu compliquée en raison de la référence directe\1
. Lors de la première itération, le groupe1
n'a encore rien capturé,\1
échoue donc sans condition. Au lieu de cela, nous devons faire correspondre\b11+?\B
quelle est la plus petite sous-chaîne possible qui commence au début de l'exécution, en contient au moins deux , c'est-à-dire la même sous-chaîne encore et encore. Ce processus doit frapper la fin de la chaîne exactement (1
s et ne couvre pas l'ensemble de l'exécution. Les itérations suivantes ne pourront plus utiliser cette alternative, en raison du\b
. Donc, pour toutes les autres itérations, nous faisons correspondre\1
$
) pour s'assurer que nous avons capturé et diviseur réel. L'avantage d'utiliser cette approche quelque peu délicate est que le groupe1
aura été utilisé exactement n / d fois, c'est-à-dire ce qui reste après la division du diviseur d .Nous remplaçons cette correspondance par d (
$1
), une séparation;
et n / d ($#1$*
, qui insère des$#1
copies de1
, où$#1
est le nombre de captures effectuées par groupe1
).Ce processus s'arrête une fois que l'exécution finale de la chaîne est elle-même un nombre premier, car alors l'expression régulière ne correspond plus.
Tout ce que nous devons faire pour additionner les nombres premiers est de supprimer tous les séparateurs.
la source
Ohm v2 , 4 octets
Essayez-le en ligne!
Explication:
la source
En fait , 7 octets
Essayez-le en ligne!
Explication:
la source
R + pracma , 53 octets
Essayez-le en ligne! (r-violon)
R n'a pas de facteurs premiers BUILTIN, mais de nombreux forfaits (
pracma
,numbers
, etc.) faire, donc j'ai choisi un court commodément.la source
Gelée , 6 octets
Cette réponse utilise l'un des nombreux prédéfinis de factorisation de Jelly, et le rapide pour
repeat until the results are no longer unique
.Essayez-le en ligne!
la source
1
is the only case where the number of steps needed is equal ton
(which is fine; with1
we only need to run it once), and there don't seem to be any cases where the number of steps is greater thann
(i.e. there don't seem to be any counterexamples). Ah well, I've been outgolfed :DMATL, 6 bytes
Utilise l'idée de scottinet de boucler plus de fois que nécessaire. Merci également à Shaggy d' avoir signalé une erreur, maintenant corrigée.
Essayez-le en ligne!
Explication
la source
4
.PowerShell, 124 bytes
Try it online!
PowerShell doesn't have any prime factorization built-ins, so this uses code from my answer on Prime Factors Buddies (the top line) to perform the factorization calculations.
The second line is the meat of this program. We take input from
$args
into$x
, thenfor
loop until$l
is-n
ote
qual to$x
. (The first iteration,$l
is$null
and$x
is an integer, so we'll loop at least once).Inside the loop, we set our
$l = $x
to determine if we've hit the end of the loop or not. Then we get the factors of$x
withf($x)
,-join
those together with+
and|iex
them (short forInvoke-Expression
and similar toeval
). That's stored back into$x
. Thus, we've hit the "end" where the prime factorization summed together is back to itself. Then, we simply place$x
on the pipeline and output is implicit.la source
Mathematica, 35 bytes
Try it online!
(Mathics does not support
Tr
. I have to implement it manually)la source
1##&
is short forTimes
andFixedPoint
can almost always be shortened with//.
:#//.x_:>Tr[1##&@@@FactorInteger@x]&
Times
, but I've not known about theFixedPoint
trick.Tr
to Mathics a while back.Ruby, 63 bytes
Try it online!
Uses the
-rprime
flag for +6 bytes to make use of Prime#prime_division.prime_division
returns pairs of[prime, exponent]
(for example, for 24 we have the factors[2, 2, 2, 3]
so it gives[[2, 3], [3, 1]]
) so in each step we just multiply the members of those pairs together and sum the results.la source
Javascript (ES6), 63 bytes
Ungolfed:
la source
Java 8, 101 bytes
Port of @ovs's amazing Python 2 answer.
Explanation:
Try it here.
la source