Une fonction semi-exponentielle est une fonction qui, lorsqu'elle est composée d'elle-même, donne une fonction exponentielle. Par exemple, si f(f(x)) = 2^x
, alors f
serait une fonction semi-exponentielle. Dans ce défi, vous calculerez une fonction semi-exponentielle spécifique.
Plus précisément, vous calculerez la fonction des entiers non négatifs aux entiers non négatifs avec les propriétés suivantes:
Croissance monotone: si
x < y
, alorsf(x) < f(y)
Au moins demi-exponentielle: pour tous
x
,f(f(x)) >= 2^x
Le plus petit lexicographiquement: parmi toutes les fonctions possédant les propriétés ci-dessus, sortez celle qui minimise
f(0)
, ce qui étant donné que ce choix minimisef(1)
, puisf(2)
, et ainsi de suite.
Les valeurs initiales de cette fonction, pour les entrées 0, 1, 2, ...
sont:
[1, 2, 3, 4, 8, 9, 10, 11, 16, 32, 64, 128, 129, 130, 131, 132, 256, 257, ...]
Vous pouvez générer cette fonction via l'une des méthodes suivantes, soit en tant que fonction, soit en tant que programme complet:
Prenez
x
comme entrée, sortief(x)
.Prendre
x
en entrée, sortir les premièresx
valeurs def
.Sortie infinie de tout
f
.
Si vous voulez prendre x
et sortir f(x)
, x
doit être indexé zéro.
C'est le code golf - le code le plus court en octets gagne. Les failles standard sont interdites, comme toujours.
Réponses:
JavaScript (ES7),
5148 octetsSauvegardé 3 octets grâce à @Arnauld
Prend en n et délivre en sortie la n -ième élément de la séquence.
JavaScript (ES7),
706864 octetsUne fonction récursive qui prend
x
et renvoie les premiersx
éléments de la séquence sous forme de tableau.Comment ça marche
Le tableau a est généré de manière procédurale, un élément à la fois, jusqu'à ce qu'il atteigne la longueur souhaitée. (Un portage de la technique infinie utilisée dans l'excellente réponse Python de xnor serait probablement plus court.)
On peut faire l'observation suivante pour chaque indice i (indexé 0):
Cela est vrai car f (f (j)) doit être d'au moins 2 j , et f (f (j)) est équivalent à a [a [j]] , qui est à son tour équivalent à a [i] .
Normalement, l'option correcte est exactement 2 j . Cependant, pour le cas singulier i = 2 , 2 existe dans le tableau à l'indice j = 1 , ce qui signifie que 2 j serait 2 - mais cela signifie que nous aurions 2 à la fois à [1] et à [2] . Pour contourner cela, nous prenons le maximum de 2 j et un [i-1] + 1 (un de plus que l'item précédent), ce qui donne 3 pour i = 2 .
Cette technique arrive également à prendre soin de décider si j existe ou non - si ce n'est pas le cas, la
.indexOf()
méthode de JS renvoie -1 , ce qui conduit à prendre le maximum de [i-1] + 1 et 2 -1 = 0,5 . Étant donné que tous les éléments de la séquence sont au moins 1 , cela retournera toujours l'élément précédent plus un.(J'écris cette explication tard dans la nuit, alors faites-moi savoir si quelque chose prête à confusion ou si j'ai raté quelque chose)
la source
272
et les versions supérieures donnent des réponses incorrectes en raison de problèmes de dépassement d'entier. C'est très bien, car cela fonctionne jusqu'à la limite du type de données.2**
plutôt que1<<
nous espérons résoudre le problème..99
tue la solution. Mais pourquoi utiliser+.99
et pas seulement+.9
? Quelle est la différence?Math.log2(...)
et a dû calculer le plafond. Maintenant, ce n'est plus du tout nécessaire. Merci! J'examinerai la2**
chose - j'utilisais à l'2**...+.99|0
origine, mais1<<
c'était plus court parce que je n'en avais pas besoin|0
. Maintenant, je pense qu'il n'y a pas de différence ...Python 2 , 60 octets
Essayez-le en ligne!
Imprime pour toujours.
Python , 61 octets
Essayez-le en ligne!
Une fonction. Sorties
True
à la place de1
.la source
Perl 5, 53 + 1 (
-p
) = 54 octetsEssayez-le en ligne
la source
Bash, 66 octets
Essayez-le en ligne
la source
Gelée , 14 octets
Essayez-le en ligne!
Comment ça marche
la source
Python 2 , 111 octets
Essayez-le en ligne!
Il s'agit d'une modification importante de la réponse de user202729 . J'aurais posté cette amélioration en tant que commentaire, mais la réponse est supprimée et les commentaires sont donc désactivés.
la source
x**2
est trop petit.x=1000
. Vous voudrez peut-être essayer2**x
- terriblement grand, mais codegolf est codegolf.2**x
crée une plage beaucoup trop grande pour que Python continue.Swift , 137 octets
Prend l'entrée comme
Int
(entier) et imprime comme[Int]
(tableau entier).Version non golfée
la source
?
?