Étant donné un entier positif n et un nombre a , la n -ième tétration de a est définie comme un ^ ( a ^ ( a ^ (... ^ a ))), où ^ désigne l'exponentiation (ou la puissance) et l'expression contient le nombre a exactement n fois.
En d'autres termes, la tétration est une exponentiation itérative associative à droite. Pour n = 4 et a = 1,6, la tétration est de 1,6 ^ (1,6 ^ (1,6 ^ 1,6)) ≈ 3,5743.
La fonction inverse de la tétration par rapport à n est le super-logarithme . Dans l'exemple précédent, 4 est le super-logarithme de 3,5743 avec "super-base" 1,6.
Le défi
Étant donné un entier positif n , trouvez x tel que n est le super-logarithme de lui-même dans la super-base x . Autrement dit, trouver x tel que x ^ ( x ^ ( x ^ (... ^ x ))) (avec x apparaissant n fois) est égal à n .
Règles
Programme ou fonction autorisé.
Les formats d'entrée et de sortie sont flexibles comme d'habitude.
L'algorithme devrait théoriquement fonctionner pour tous les entiers positifs. En pratique, l'entrée peut être limitée à une valeur maximale en raison de restrictions de mémoire, de temps ou de type de données. Cependant, le code doit fonctionner pour les entrées jusqu'à 100
au moins en moins d'une minute.
L'algorithme devrait théoriquement donner le résultat avec 0.001
précision. En pratique, la précision de sortie peut être pire en raison des erreurs accumulées dans les calculs numériques. Cependant, la sortie doit être précise jusqu'à 0.001
pour les cas de test indiqués.
Le code le plus court gagne.
Cas de test
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Implémentation de référence
Voici une implémentation de référence dans Matlab / Octave (essayez-la sur Ideone ).
N = 10; % input
t = .0001:.0001:2; % range of possible values: [.0001 .0002 ... 2]
r = t;
for k = 2:N
r = t.^r; % repeated exponentiation, element-wise
end
[~, ind] = min(abs(r-N)); % index of entry of r that is closest to N
result = t(ind);
disp(result)
Car N = 10
cela donne result = 1.5085
.
Le code suivant est une vérification de la précision de sortie, à l'aide d'une arithmétique à précision variable:
N = 10;
x = 1.5085; % result to be tested for that N. Add or subtract 1e-3 to see that
% the obtained y is farther from N
s = num2str(x); % string representation
se = s;
for n = 2:N;
se = [s '^(' se ')']; % build string that evaluates to iterated exponentiation
end
y = vpa(se, 1000) % evaluate with variable-precision arithmetic
Cela donne:
- Pour
x = 1.5085
:y = 10.00173...
- Pour
x = 1.5085 + .001
:y = 10.9075
- Car
x = 1.5085 - .001
ça donney = 9.23248
.
1.5085
est donc une solution valable avec .001
précision.
x
Converge- t-il à l'n
approche de l'infini?Réponses:
Dyalog APL ,
3325 octetsBesoins
⎕IO←0
par défaut sur de nombreux systèmes.Calcule théoriquement pour tous les entiers, mais pratiquement limité à un très petit seul.
TryAPL en ligne!
la source
Haskell,
555452 octetsUsage:
Merci à @nimi pour 1 octet!
Merci à @xnor pour 2!
la source
[ ]!!0
au lieu d'head[ ]
enregistrer un octets n=[x|x<-[2,1.9999..],n>iterate(x**)1!!n]!!0
serait plus court si vous pouviez faire accepter à Haskell ses types.Javascript, ES6: 77 octets / ES7:
5753 octetsES6
ES7
Utilisation
**
comme suggéré par DanTheMan:Exemple
la source
**
place deMath.pow
.Mathematica,
4033 octetsMerci à murphy pour une économie de près de 20%!
Nest[x^#&,1,n]
produit la nième tétration de x. Teste doncNest[x^#&,1,#]<#
si la (entrée) e tétration de x est inférieure à (entrée). Nous commençons simplement à x = 1 et ajoutons 0,001 à plusieurs reprises jusqu'à ce que la tétration soit trop grande, puis sortons la dernière valeur x (donc la réponse est garantie d'être plus grande que la valeur exacte, mais dans 0,001).Comme j'apprends lentement:
//.x_:>y/;z
ou//.x_/;z:>y
signifie "rechercher tout ce qui correspond au modèle x, mais uniquement les choses pour lesquelles le test z renvoie vrai; puis opérer sur x par la règle y; à plusieurs reprises jusqu'à ce que rien ne change". Ici, le modèlex_
est simplement "n'importe quel nombre que je vois", bien que dans d'autres contextes, il puisse être encore plus contraint.Lorsque l'entrée est d'au moins 45, la tétration augmente si rapidement que cette dernière étape provoque une erreur de débordement; mais la valeur de x est toujours mise à jour et émise correctement. La diminution de la taille de pas de 0,001 à 0,0001 corrige ce problème pour les entrées jusqu'à 112, et donne une réponse plus précise au démarrage (et fonctionne toujours rapidement, en environ un quart de seconde). Mais c'est un octet supplémentaire, alors oubliez ça!
Version originale:
la source
1//.x_:>x+.001/;Nest[x^#&,1,#]<#&
//.
sans aide :)J,
393128 octetsBasé sur l'implémentation de référence. Il n'est précis qu'à trois décimales près.
8 octets enregistrés en utilisant la méthode de la solution de @ Adám .
Usage
Commandes supplémentaires utilisées pour formater plusieurs entrées / sorties.
Explication
la source
Python, 184 octets
Sortie de test (en ignorant les instructions d'impression réelles):
la source
s(1000000)
assez rapidementRaquette 187 octets
Essai:
Production:
Version détaillée:
la source
Perl 6 , 42 octets
(Traduction d'un exemple de code Matlab)
Tester:
la source
PHP, 103 octets
la source
Axiome 587 octets
moins de golf + numéros
la source
Lisp commun, 207 octets
L'utilisation de
reduce
with:from-end t
évite la nécessité de faire une lambda intermédiaire "exponentiation inversée" (en gros(lambda (x y) (expt y x))
, économiser 14 octets (12, si vous supprimez les espaces amovibles).Nous devons toujours gérer le débordement du flottant, mais un
ignore-errors
formulaire retournenil
si une erreur s'est produite, nous pouvons donc utiliseror
pour fournir une valeur par défaut.la source