| Bytes | Lang | Time | Link |
|---|---|---|---|
| 022 | TIBASIC TI84 Plus CE Python | 250912T162822Z | madeforl |
| 009 | Whispers v3 | 210401T144314Z | caird co |
| 047 | Java 7 | 160721T144558Z | Kevin Cr |
| 021 | Perl 6 | 180222T183420Z | Sean |
| 034 | R | 180204T222107Z | rturnbul |
| 016 | J | 160719T195817Z | Conor O& |
| 029 | Ruby | 160818T151211Z | Seims |
| 036 | R | 160818T145914Z | user5957 |
| 037 | R | 160720T084059Z | plannapu |
| 029 | Maple | 160722T025645Z | DSkoog |
| 061 | Racket | 160721T212611Z | Steven H |
| 029 | Mathematica | 160721T143524Z | Landak |
| 024 | PARI/GP | 160721T052945Z | Charles |
| 044 | MATLAB / Octave | 160720T170206Z | costrom |
| 016 | CJam | 160720T080022Z | Peter Ta |
| 035 | Perl 5 | 160720T034833Z | hobbs |
| 008 | Jelly | 160720T002815Z | Dennis |
| 017 | Julia | 160720T001604Z | Dennis |
| 008 | Jelly | 160720T000104Z | Dennis |
| 038 | Emacs Lisp | 160719T223708Z | Lord Yuu |
| 012 | MATL | 160719T193710Z | Luis Men |
| 026 | Javascript | 160719T200307Z | CShark |
| 013 | 05AB1E | 160719T192544Z | Emigna |
| 038 | C | 160719T202949Z | owacoder |
| 045 | Python 3 | 160719T201910Z | lynn |
| 009 | Jelly | 160719T201210Z | Leaky Nu |
| 021 | Mathematica | 160719T195501Z | LegionMa |
| 023 | Haskell | 160719T192737Z | nimi |
| 010 | Pyth | 160719T190657Z | Leaky Nu |
| 013 | Dyalog APL | 160719T191355Z | Adá |
TI-BASIC (TI-84 Plus CE Python), 22 bytes
Input N
While N>1
ln(N→N
C+1→C
End
C
Whispers v3, 9 bytes
>> ln*(L)
Note that I had to push a bug fix in order to make this work. The ln* function had already been added before September 1st 2020, but I hadn't noticed a bug in the parsing that was fixed today
This is a function, going by the standards defined here for Whispers functions. It can be called by appending the code in the Footer to the file.
Whispers v3 also has the slog, lg* (uses \$\log_2\$) and log* (uses \$\log_{10}\$) functions
Java 7, 47 bytes
int c(double n){return n>1?1+c(Math.log(n)):0;}
The recursive Java 7 style method above is 2 bytes shorter than an iterative Java 8 style lambda:
n->{int c=0;for(;n>1;c++)n=Math.log(n);return c;}
Explanation:
int c(double n){ // Method with double parameter and integer return-type
return n>1? // If the input is larger than 1:
1+ // Return 1 +
c(Math.log(n)) // A recursive call with log(input)
: // Else:
0; // Return 0 instead
n->{ // Method with double parameter and integer return-type
int c=0; // Create a counter, starting at 0
for(;n>1; // Loop as long as the input is still larger than 1:
c++) // Increase the counter by 1
n=Math.log(n); // And update the input to log(input)
return c;} // After the loop: return the counter as result
Perl 6, 21 bytes
{($_,*.log...1>=*)-1}
The parenthesized expression is a sequence. $_, the argument to the function, is the first element. *.log generates each successive element by taking the log of the previous element. The sequence continues until the ending condition, 1 >= *, is true: 1 is greater than or equal to the current element. Subtracting 1 from the sequence coerces it to a number: its length.
R, 34 bytes
f=pryr::f(`if`(n>1,1+f(log(n)),0))
A non-recursive approach is possible: 36 bytes and takes input from stdin.
n=scan()
while((n=log(n))>0)F=F+1
+F
J, 21 19 18 16 bytes
Saved 2 bytes to Leaky Nun, 1 byte to Galen Ivanov, and 2 bytes to FrownyFrog!
2#@}.(0>.^.)^:a:
Test cases
ls =: >:@$:@^.`0:@.(<:&1)
ls 0
0
ls 1
0
ls 2
1
ls 3
2
ls 4
2
ls 15
2
ls 16
3
ls 3814280
4
Ruby, 29 bytes
l=->n{n<=1?0:1+l[Math.log n]}
R, 36 bytes
Slightly different approach from Plannapus
->n;a=0;while(n>1){a=a+1;n=log(n)};a
Uses a right assign to run the code -- so the desired number must precede it. i.e.
10->n;a=0;while(n>1){a=a+1;n=log(n)};a
R, 38 37 bytes
f=function(x)if(x>1)1+f(log(x))else 0
Thanks @user5957401 for the extra byte!
Test cases:
> f(0)
[1] 0
> f(1)
[1] 0
> f(2)
[1] 1
> f(3)
[1] 2
> f(4)
[1] 2
> f(3814279)
[1] 3
> f(3814280)
[1] 4
Maple, 32,30 29 bytes
f:=x->`if`(x>1,1+f(log(x)),0)
Test cases:
> f(0.);
0
> f(1.);
0
> f(2.);
1
> f(3.);
2
> f(4.);
2
> f(3814279.);
3
> f(3814280.);
4
Racket, 61 bytes
(λ(x)(letrec([a(λ(b)(if(> b 1)(+ 1 (a(log b)))0))])(a x)))
Mathematica, 29 bytes
Simple as all hell, and works for comically large as well as negative inputs:
f[x_]:=If[x>1,1+f[Log[x]],0]
MATLAB / Octave, 44 bytes
function a=g(n);a=0;if n>1;a=1+g(log(n));end
Tried to do it all as one anonymous function, but I forgot that MATLAB/Octave continues to evaluate expressions even if they are multiplied by a boolean false (zero) value:
f=@(n)(n>1)*(1+f(log(n)))
CJam (16 bytes)
rd{_1>}{_ml}w],(
Simple while loop with pre-condition. (What I really want here is a Golfscript-style unfold operation, but CJam doesn't have one, and floating point in GolfScript is messy and not at all golfy).
Perl 5, 35 bytes
Very simple, requires -M5.016 (which is free) to enable the __SUB__ keyword for anonymous recursion.
sub{$_[0]>1?1+__SUB__->(log pop):0}
Another alternative is
sub{$_[0]>1?1+__SUB__->(log pop):0}
which is 34 bytes, and gives the same output for all inputs > 1, but returns the special false value for inputs <= 1. False is numerically equal to zero, but prints as "" (empty string), so it probably doesn't qualify.
Jelly, 8 bytes
-Ælß$Ị?‘
Straightforward implementation of the definition. Try it online! or verify all test cases.
How it works
-Ælß$Ị?‘ Main link. Argument: x
Ị Insignificant; test if |x| ≤ 1.
? If the result is 1:
- Return -1.
Else:
$ Execute the monadic chain formed by the two links to the left.
Æl Apply natural logarithm to x.
ß Recursively call the main link.
‘ Increment the result.
Jelly, 8 bytes
ÆlÐĿĊḊi1
Try it online! or verify all test cases.
Background
We start by successively taking natural logarithms of the input and the subsequent results until the result no longer changes. This works because the extension of the natural logarithm to the complex plane has a fixed point; if z = e-W(-1) ≈ 0.318 + 1.337i – where W denotes the Lambert W function – we have log(z) = z.
For input n, after computing [n, log(n), log(log(n)), …, z], we first apply the ceiling function to each of the results. Jelly's implementation (Ċ) actually computes the imaginary part of complex number instead†, but we're not interested in these anyway.
Once the kth application of log yields a value less than or equal to 1, Ċ will return 1 for the first time. The 0-based index of that first 1 is the desired result.
The straightforward implementation (compute 1-based index, decrement) fails because of edge case 0, which does not have a 1 in its list of logarithms. In fact, for input 0, the sequence of logarithms is
[0, None]
This is because Jelly's logarithm (Æl) is overloaded; it first tries math.log (real logarithm), then cmath.log (complex logarithm), and finally "gives up" and returns None. Fortunately, Ċ is similarly overloaded and simply returns it argument if it cannot round up or take an imaginary part.
Likewise, input 1 returns
[1, 0, None]
which may create problems in other approaches that do or do not involve Ċ.
One way to fix this problem is apply Ḋ (dequeue; removes first element) to the array of logarithms. This maps
0ÆlÐĿ -> [0, None] -> [None]
1ÆlÐĿ -> [1, 0, None] -> [0, None]
so neither list has a 1 now. This way, finding the index of the first 1 will return 0 (not found), which is the desired output for inputs 0 and 1.
How it works
ÆlÐĿĊḊi1 Main link. Argument: n (non-negative integer)
ÐĿ Apply the following link until the results are no longer unique.
Æl Natural logarithm.
Return the array of all unique results.
Ċ Round all resulting real numbers up to the nearest integer. This takes
the imaginary part of complex numbers and does nothing for non-numbers.
Ḋ Dequeue; remove the first item (n) of the array of results.
i1 Find the first index of 1 (0 if not found).
† This is one of the only three atoms in Jelly that are overloaded in a non-obvious manner.
Emacs Lisp, 38 bytes
(defun l(n)(if(> n 1)(1+(l(log n)))0))
Testcases:
(mapcar 'l '(0 1 2 3 4 15 16 3814279 3814280))
;; (0 0 1 2 2 2 3 3 4)
MATL, 15 12 bytes
0`ZetG>~}x@q
Try it online! Or verify all test cases (slightly modified version to handle several inputs).
How it works
Starting with 0, apply iterated exponentiation until exceeding the input. The output is the number of iterations minus 1.
0 % Push 0
` % Do...while loop
Ze % Exponential
t % Duplicate
G % Push input
>~ % Is current value less than or equal to the input? If so: next iteration
} % Finally (code executed at the end of the last iteration)
x % Delete
@q % Iteration index minus 1
% Implicitly end loop
% Implicitly display stack
Javascript, 45 27 26 bytes
l=a=>a>1&&1+l(Math.log(a))
Here is test suite (3rd rev)
Thanks @LeakyNun for saving 1 byte with conditional and then converting function to lambda, and @Neil for pointing out false is ok return value for <=1 (changed test to be == instead of ===)
05AB1E, 16 13 bytes
[Dî2‹#¼žr.n]¾
Explanation
# implicit input n
[ ] # infinite loop
Dî2‹# # break if n rounded up is less than 2
¼ # else, increase counter
žr.n # set next n = log(n)
¾ # push counter and implicitly print
Python 3, 45 bytes
import math
s=lambda x:x>1and-~s(math.log(x))
For x <= 1, this returns False (which is == 0 in Python).
Jelly, 9 bytes
Æl>1$пL’
Test suite. (Slightly modified.)
Explanation
Æl>1$пL’
п while loop, collect all intermediate results.
>1$ condition: z>1
Æl body: natural logarithm.
L length of the array containing all intermediate results,
meaning number of iterations
’ minus one.
Mathematica, 21 bytes
If[#>1,1+#0@Log@#,0]&
Recursive anonymous function. Takes an integer as input and returns its super-logarithm as output. Just uses the given definition.
Haskell, 23 bytes
l x|x>1=1+l(log x)|1<2=0
Usage example: l 3814280 -> 4.
