Connexes: fonction phi (n) itérée .
Votre défi est de calculer la fonction phi itérée:
f(n) = number of iterations of φ for n to reach 1.
Où φ
est la fonction totiente d'Euler .
OEIS connexe .
En voici le graphique:
Règles:
Votre objectif est de sortir f(n)
de n=2
à n=100
.
C'est le code-golf, donc le code le plus court l'emporte.
Voici les valeurs que vous pouvez vérifier:
1, 2, 2, 3, 2, 3, 3, 3, 3, 4, 3, 4, 3, 4, 4, 5, 3, 4, 4, 4, 4, 5, 4, 5, 4, 4, 4, 5, 4, 5, 5, 5, 5, 5, 4, 5, 4, 5, 5, 6, 4, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 4, 6, 5, 5, 5, 6, 5, 6, 5, 5, 6, 6, 5, 6, 6, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 5, 6, 7, 5, 7, 5, 6, 6, 7, 5, 6, 6, 6, 6, 6, 6, 7, 5, 6, 6
code-golf
math
sequence
kolmogorov-complexity
number-theory
Art tout simplement magnifique
la source
la source
x
telles quephi(x)
c'est un nombre fixe particulier.f(n)
, plutôt que de l'exécuter sur une plage de nombres fixes. Cela fait également une différence entre les langages avec la possibilité d'appliquer des fonctions sur des plages avec moins d'octets (défi en partie de caméléon?)Réponses:
Haskell ,
5352 octetsMerci nimi d'avoir sauvé 1 octet!
Essayez-le en ligne!
sum[1|1<-gcd n<$>[1..n]]
donneφ(n)
(Tiré de flawr , merci!)f
est une fonction récursive qui calcule1+φ(n)
si n ne l'est pas1
et renvoie0
si elle l'n
est1
, car il n'y a plus d'itérations à effectuer pour atteindre1
f<$>[2..100]
Crée enfin une liste def
appliqués à chaque élément de[2..100]
la source
Haskell ,
70 6968 octetsLa fonction
(\n->sum[1|1<-gcd n<$>[1..n]])
est la fonction totiente, que nous appliquons à plusieurs reprises dans la fonction anonyme. Merci @laikoni pour -1 octet!EDIT: Je viens de découvrir que @xnor a utilisé cette fonction de totient exacte dans un défi précédent .
Essayez-le en ligne!
la source
MATL ,
1615 octetsEssayez-le en ligne!
Explication
Ancienne version, 16 octets
Essayez-le en ligne!
Explication
la source
2 3 3 4 3
, lorsque le défi dit qu'elles devraient l'être1 2 2 3 2
Gelée ,
1211109 octetsEssayez-le en ligne!
-1 octet grâce à HyperNeutrino!
-1 octet merci à M. Xcoder!
-1 octet grâce à Dennis
Comment ça fonctionne
Comme cela a été fait par Dennis, je (naturellement) ne sais pas pourquoi cela fonctionne, juste que cela fonctionne.
la source
f(n)
de2
à100
, et la question ne mentionne pas l' entrée, donc je pense que c'est la version correctef
den=2
lan=100
, non seulement une valeur.#
dans ce cas? Quelque chose comme ça (qui ne fonctionne clairement pas mais écrit par quelqu'un qui comprend clairement la syntaxe!)€
c'est généralement mieux que#
.APL (Dyalog) ,
502925 octetsRegardez-moi, pas de totient intégré!
4 octets enregistrés grâce à @ H.PWiz
Essayez-le en ligne!
Comment?
Apparemment, j'ai d'abord opté pour la formule totiente la plus longue (et la plus difficile). Voir l'historique des révisions.
⍳⍵
-1
àn
⍵∨
- gcd avecn
1=
- égal à 1?+/
- résume-les tousCeci est le totient. Tout le reste est enveloppant pour le comptage (
1+∇
) et l'application sur la plage2..100
(¨1+⍳99
).la source
Mathematica, 44 octets
-10 octets de @Misha Lavrov
-2 octets de @ user202729
Essayez-le en ligne!
la source
J REPL, 23 octets
Je n'ai pas vérifié, mais cela fonctionne probablement en J régulier si vous le définissez comme un nom (j'ai joué au golf sur mon téléphone sur le REPL).
Intégrés, yo.
Je dirais qu'il y a au moins 2-3 octets à raser (off-by-one à cause de la façon dont
a:
fonctionne, devoir utiliser|
comme noop, etc.).la source
+/*<:5&p:^:a:2+i.99
pour 19 octets Essayez-le en ligne!"+
au lieu de"0
, de sorte qu'il pourrait également devenir<:#@(5&p:^:a:)"+i.99
+/1<a:5&p:2+i.99
a:
dans votre code? Comment ça marche au lieu de^:
?(5&p:)^:a: m
peut être fait ena: 5&p: m
utilisant l'autre définition du&
moment où une dyade est liée à un nom, puis appelée dyadiquement.JavaScript (ES6),
115...10499 octetsLe codage en dur peut être plus court, mais essayons une approche purement mathématique.
la source
Python 2 , 80 octets
Essayez-le en ligne!
la source
Python 2 , 82 octets
Essayez-le en ligne!
Il utilise les observations qui:
f(a*b) = f(a) + f(b) - 1
, sauf que-1
est omis sia
etb
sont tous deux pairsf(p) = f(p-1) + 1
quandp
est premier, avecf(2)=1
These imply that if
n
has prime factorizationn = 2**a * 3**b * 5**c * 7**d * 11**e * ...
, thenf(n) = max(a,1) + b + 2*c + 2*d + 3*e + ...
, where eachp>2
in the factorization contributesf(p-1)
.I'm not sure if these continue to hold past
n=100
, but if they do, they give a way to define and calculatef
without usingφ
.la source
Bubblegum, 49 bytes
Try it online!
la source
PowerShell, 110 bytes
Try it online!
Mathematical approach.
Actually, looking through it, very similar to the C answer, but developed independently. Creates an array of
0
s, loops from2
to100
, then calculatesphi
using thegcd
formulation. The part in parens at the end both saves the result into$a
for the next go-round, and places a copy on the pipeline, which results in the implicit output.PowerShell, 112 bytes
Try it online!
Hard-coded. Ho-hum.
Shorter than I could get a mathematical approach by about 10-15 bytes.la source
Python 2, 83 bytes
Try it online!
Combines a heuristic estimate with a hardcoded constant that corrects each estimate as either
-0
or-1
.la source
Husk,
1017 bytesTry it online!
Edit: +7 bytes for actually mapping the function over the range that was asked for, before it was only the function computing A003434.
Explanation
The following computes A003434:
The
m(....)ḣ100
part just map that function over the range [2..100], not sure how I missed that part before :Sla source
PHP, 98 bytes
Try it online!
I packed all digits into a binary string. After unpacking it, converting it to a an array and then mergin the array again, i only had to prepend the 1,2 and append the 6 as those wouldnt fit or caused a control code to appear.
la source
Perl 6, 47 bytes
Try it online!
la source
05AB1E, 11 bytes
Try it online!
Explanation
la source
C, 112 bytes
Ungolfed:
Try it online!
la source
Alumin, 87 bytes
Try it online!
Explanation
la source
Pyth, 38 bytes (not competitive)
Try it on the Pyth Herokuapp, because it doesn't work on TIO for whatever reason.
I have no doubt the explicit Pyth solution is smaller, but I wanted to see how small I could get the code by compressing the sequence, and learn Pyth I guess. This uses the fact that an upper bound of the sequence is
log2(n)+1
.Explanation
I got the compressed string via
Ci_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3
, which is just the opposite of the code above with a few type conversions.la source
Ohm v2, 41 bytes
Try it online!
Literally completely hardcoded... I actually took the sequence above, stripped everything that wasn't a number, interpreted it as base 8, then turned it into Ohm's built-in base 255 number representation. That's what the quotes do. Then, the program simply turns that into base 8 again.
la source