Cela devrait être un simple défi.
Étant donné un nombre n >= 0
, sortez le super-logarithme (ou le log *, log-star ou logarithme itéré , qui sont équivalents car n
n'est jamais négatif pour ce défi.) De n
.
Il s'agit de l'une des deux fonctions inverses de la tétration . L'autre est la super-racine , qui est dans une question connexe .
Exemples
Input Output
0 0
1 0
2 1
3 2
4 2
...
15 2
16 3
...
3814279 3
3814280 4
Règles
- Vous n'avez pas besoin de prendre en charge les décimales, bien que vous puissiez le faire.
- Vous devez au moins prendre en charge la saisie
3814280 = ceiling(e^e^e)
. - Vous ne pouvez pas coder en dur les valeurs comme
3814280
. (Votre programme doit théoriquement prendre en charge des nombres plus élevés.) Je veux qu'un algorithme soit implémenté. - Le code le plus court gagne.
code-golf
math
code-golf
array-manipulation
sorting
code-golf
math
arithmetic
matrix
code-golf
string
kolmogorov-complexity
code-golf
string
code-golf
math
sequence
arithmetic
recursion
code-golf
math
ascii-art
sequence
code-golf
math
array-manipulation
code-golf
code-golf
kolmogorov-complexity
code-golf
string
code-golf
string
decision-problem
code-golf
array-manipulation
tips
javascript
json
code-golf
math
string
number
number-theory
code-golf
math
sequence
fibonacci
number
arithmetic
fastest-code
integer
code-golf
math
sequence
code-golf
string
file-system
tips
golfscript
code-golf
string
code-golf
string
natural-language
code-golf
string
file-system
code-golf
math
array-manipulation
code-challenge
image-processing
compression
code-golf
math
number
sequence
code-golf
math
combinatorics
regular-expression
code-golf
sequence
pi
code-golf
ascii-art
code-golf
string
array-manipulation
sorting
code-golf
string
graph-theory
code-golf
string
code-golf
string
ascii-art
code-challenge
compression
code-golf
code-golf
math
sequence
number-theory
code-golf
maze
graph-theory
code-golf
math
sequence
mbomb007
la source
la source
Réponses:
Gelée , 8 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Contexte
Nous commençons par prendre successivement les logarithmes naturels de l'entrée et des résultats suivants jusqu'à ce que le résultat ne change plus. Cela fonctionne parce que l'extension du logarithme naturel au plan complexe a un point fixe ; si z = e -W (-1) ≈ 0,318 + 1,337i - où W désigne le fonction Lambert W - nous avons log (z) = z .
Pour l'entrée n , après avoir calculé [n, log (n), log (log (n)),…, z] , nous appliquons d'abord la fonction de plafond à chacun des résultats. L'implémentation de Jelly (
Ċ
) calcule en fait la partie imaginaire du nombre complexe † , mais cela ne nous intéresse pas de toute façon.Une fois que la k ème application de log donne une valeur inférieure ou égale à 1 ,
Ċ
renvoie 1 pour la première fois. L'index basé sur 0 de ce premier 1 est le résultat souhaité.L'implémentation simple (calcul de l'index basé sur 1, décrémentation) échoue en raison du cas de bord 0 , qui n'a pas de 1 dans sa liste de logarithmes. En fait, pour l'entrée 0 , la séquence de logarithmes est
C'est parce que le logarithme de Jelly (
Æl
) est surchargé; il essaie d'abordmath.log
(logarithme réel), puiscmath.log
(logarithme complexe), et finalement "abandonne" et revientNone
. Heureusement, ilĊ
est également surchargé et renvoie simplement son argument s'il ne peut pas arrondir ou prendre une partie imaginaire.De même, l'entrée 1 renvoie
ce qui peut créer des problèmes dans d'autres approches qui impliquent ou non
Ċ
.Une façon de résoudre ce problème est d'appliquer
Ḋ
(retirer la file d'attente; supprime le premier élément) au tableau de logarithmes. Cette cartedonc aucune des listes n'a un 1 maintenant. De cette façon, trouver l'index du premier 1 retournera 0 (non trouvé), qui est la sortie souhaitée pour les entrées 0 et 1 .
Comment ça marche
† C'est l'un des trois seuls atomes de Jelly qui sont surchargés de manière non évidente.
la source
Gelée , 9 octets
Essayez-le en ligne!
Suite de tests.(Légèrement modifié.)
Explication
la source
C, 38 octets
Assez explicite.
Essayez-le sur ideone.
la source
Javascript,
452726 octetsVoici la suite de tests (3e rév)
Merci à @LeakyNun d'avoir enregistré 1 octet avec la fonction conditionnelle, puis de convertir la fonction en lambda, et @Neil pour avoir indiqué faux est une valeur de retour correcte pour <= 1 (le test a été changé en == au lieu de ===)
la source
false
au lieu de 0 (car il se convertit automatiquement en 0 dans une expression entière), auquel cas vous pouvez supprimer le|0
.Mathematica, 21 octets
Fonction anonyme récursive. Prend un entier en entrée et renvoie son super-logarithme en sortie. Utilise simplement la définition donnée.
la source
Dyalog APL , 13 octets
Traduction directe de OP:
TryAPL en ligne!
la source
Pyth, 10 octets
Suite de tests.
Cela définit une fonction.
la source
tl.u?>N1.l
;-)Haskell, 23 octets
Exemple d'utilisation:
l 3814280
->4
.la source
Python 3, 45 octets
Pour
x <= 1
, cela renvoieFalse
(qui est== 0
en Python).la source
False
peut être utilisé pour0
.and
plutôt qu'enif else
). Grats.05AB1E,
1613 octetsExplication
Essayez-le en ligne
la source
MATL ,
1512 octetsEssayez-le en ligne! Ou vérifiez tous les cas de test (version légèrement modifiée pour gérer plusieurs entrées).
Comment ça marche
En commençant par 0, appliquez l'exponentiation itérée jusqu'à dépasser l'entrée. La sortie est le nombre d'itérations moins 1.
la source
J ,
21191816 octetsEnregistré 2 octets à Leaky Nun, 1 octet à Galen Ivanov et 2 octets à FrownyFrog!
Essayez-le en ligne!
Cas de test
la source
2#@}.^.^:(0<])^:a:
(J'ai commencé à résoudre ce qui s'est avéré être un dup de ce problème.)2#@}.(0>.^.)^:a:
semble fonctionner.Julia, 17 octets
Essayez-le en ligne!
la source
MATLAB / Octave, 44 octets
function a=g(n);a=0;if n>1;a=1+g(log(n));end
J'ai essayé de tout faire comme une fonction anonyme, mais j'ai oublié que MATLAB / Octave continue d'évaluer les expressions même si elles sont multipliées par une valeur booléenne fausse (zéro):
f=@(n)(n>1)*(1+f(log(n)))
la source
R,
3837 octetsMerci @ user5957401 pour l'octet supplémentaire!
Cas de test:
la source
if(x>1)1+f(log(x))else 0
est un octet plus court.R , 34 octets
Essayez-le en ligne!
Une approche non récursive est possible: 36 octets et prend l'entrée de stdin.
la source
Java 7, 47 octets
Essayez-le en ligne.
La méthode récursive de style Java 7 ci-dessus est plus courte de 2 octets qu'une lambda itérative de style Java 8:
Essayez-le en ligne.
Explication:
la source
Emacs Lisp, 38 octets
Testcases:
la source
Gelée , 8 octets
Mise en œuvre simple de la définition. Essayez-le en ligne! ou vérifier tous les cas de test .
Comment ça marche
la source
Perl 5, 35 octets
Très simple, nécessite
-M5.016
(qui est gratuit) d'activer le__SUB__
mot - clé pour la récursivité anonyme.Une autre alternative est
qui est de 34 octets, et donne la même sortie pour toutes les entrées> 1, mais renvoie la valeur fausse spéciale pour les entrées <= 1. False est numériquement égal à zéro, mais s'affiche comme "" (chaîne vide), donc il ne le fait probablement pas '' t qualifier.
la source
sub{($_=pop)>1?1+__SUB__->(log):0}
cependantCJam (16 octets)
Démo en ligne
Boucle simple avec pré-condition. (Ce que je veux vraiment ici, c'est une opération de dépliage de style Golfscript, mais CJam n'en a pas, et la virgule flottante dans GolfScript est désordonnée et pas du tout golfy).
la source
PARI / GP , 24 octets
Juste la récursivité simple.
la source
Raquette, 61 octets
la source
Érable,
32,3029 octetsCas de test:
la source
R, 36 octets
Approche légèrement différente de Plannapus
Utilise une affectation à droite pour exécuter le code - le numéro souhaité doit donc le précéder. c'est à dire
la source
Mathematica, 29 octets
Simple comme l'enfer, et fonctionne pour les entrées comiques et négatives:
la source
Rubis, 29 octets
la source
n<=1?a:b
asn>1?b:a
et -1 octet supplémentaire avec des fonctions lambda anonymes .Perl 6 , 21 octets
Essayez-le en ligne!
L'expression entre parenthèses est une séquence.
$_
, l'argument de la fonction, est le premier élément.*.log
génère chaque élément successif en prenant le log de l'élément précédent. La séquence continue jusqu'à ce que la condition de fin,,1 >= *
soit vraie: 1 est supérieur ou égal à l'élément courant. Soustraire 1 de la séquence le contraint à un nombre: sa longueur.la source