Esto debería ser un simple desafío.
Dado un número n >= 0
, genera el superlogaritmo (o el logaritmo log *, log-star o iterado , que son equivalentes ya n
que nunca es negativo para este desafío) n
.
Esta es una de las dos funciones inversas de la tetración . El otro es la superraíz , que está en una pregunta relacionada .
Ejemplos
Input Output
0 0
1 0
2 1
3 2
4 2
...
15 2
16 3
...
3814279 3
3814280 4
Reglas
- No necesita admitir decimales, aunque puede hacerlo.
- Debe admitir la entrada de al menos
3814280 = ceiling(e^e^e)
. - No puede codificar los valores como
3814280
. (Su programa debe teóricamente apoyar a los números más altos.) Quiero un algoritmo para ser implementado. - El código más corto gana.
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
fuente
fuente
Respuestas:
Jalea , 8 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Fondo
Comenzamos tomando sucesivamente logaritmos naturales de la entrada y los resultados posteriores hasta que el resultado ya no cambie. Esto funciona porque la extensión del logaritmo natural al plano complejo tiene un punto fijo ; si z = e -W (-1) ≈ 0.318 + 1.337i - donde W denota la función Lambert W - tenemos log (z) = z .
Para la entrada n , después de calcular [n, log (n), log (log (n)),…, z] , primero aplicamos la función de techo a cada uno de los resultados. La implementación de Jelly (
Ċ
) en realidad calcula la parte imaginaria del número complejo en su lugar † , pero de todos modos no estamos interesados en esto.Una vez que el k ésimo aplicación de registro se obtiene un valor menor que o igual a 1 ,
Ċ
devolverá 1 por primera vez. El índice basado en 0 de ese primer 1 es el resultado deseado.La implementación sencilla (calcular el índice basado en 1, decremento) falla debido al caso límite 0 , que no tiene un 1 en su lista de logaritmos. De hecho, para la entrada 0 , la secuencia de logaritmos es
Esto se debe a que el logaritmo de Jelly (
Æl
) está sobrecargado; primero intentamath.log
(logaritmo real), luegocmath.log
(logaritmo complejo) y finalmente "se rinde" y regresaNone
. Afortunadamente,Ċ
se sobrecarga de manera similar y simplemente le devuelve el argumento si no puede redondear o tomar una parte imaginaria.Del mismo modo, la entrada 1 devuelve
lo cual puede crear problemas en otros enfoques que involucran o no
Ċ
.Una forma de solucionar este problema es aplicar
Ḋ
(eliminar; elimina el primer elemento) a la matriz de logaritmos. Este mapasentonces ninguna de las listas tiene un 1 ahora. De esta manera, encontrar el índice del primer 1 devolverá 0 (no encontrado), que es la salida deseada para las entradas 0 y 1 .
Cómo funciona
† Este es uno de los únicos tres átomos en Jelly que están sobrecargados de una manera no obvia.
fuente
Jalea , 9 bytes
Pruébalo en línea!
Banco de pruebas. (Ligeramente modificado.)
Explicación
fuente
C, 38 bytes
Bastante autoexplicativo.
Pruébalo con ideone.
fuente
Javascript,
452726 bytesAquí está la suite de prueba (3ª rev.)
Gracias @LeakyNun por guardar 1 byte condicional y luego convertir la función a lambda, y @Neil por señalar falso es el valor de retorno correcto para <= 1 (la prueba cambiada es == en lugar de ===)
fuente
false
lugar de 0 (ya que se convierte automáticamente a 0 en una expresión entera) en cuyo caso puede soltar el|0
.Mathematica, 21 bytes
Función anónima recursiva. Toma un entero como entrada y devuelve su superlogaritmo como salida. Solo usa la definición dada.
fuente
Dyalog APL , 13 bytes
Traducción directa de OP:
TryAPL en línea!
fuente
Pyth, 10 bytes
Banco de pruebas.
Esto define una función.
fuente
tl.u?>N1.l
;-)Haskell, 23 bytes
Ejemplo de uso:
l 3814280
->4
.fuente
Python 3, 45 bytes
Para
x <= 1
, esto vuelveFalse
(que está== 0
en Python).fuente
False
se puede usar para0
.and
lugar deif else
). Grats05AB1E,
1613 bytesExplicación
Pruébalo en línea
fuente
MATL ,
1512 bytesPruébalo en línea! O verifique todos los casos de prueba (versión ligeramente modificada para manejar varias entradas).
Cómo funciona
Comenzando con 0, aplique exponenciación iterada hasta exceder la entrada. La salida es el número de iteraciones menos 1.
fuente
J ,
21191816 bytes¡Ahorré 2 bytes a Leaky Nun, 1 byte a Galen Ivanov y 2 bytes a FrownyFrog!
Pruébalo en línea!
Casos de prueba
fuente
2#@}.^.^:(0<])^:a:
(comencé a sovlar lo que resultó ser un duplicado de este problema).2#@}.(0>.^.)^:a:
parece funcionar.Julia, 17 bytes
Pruébalo en línea!
fuente
MATLAB / Octave, 44 bytes
function a=g(n);a=0;if n>1;a=1+g(log(n));end
Intenté hacerlo todo como una función anónima, pero olvidé que MATLAB / Octave continúa evaluando expresiones incluso si se multiplican por un valor booleano falso (cero):
f=@(n)(n>1)*(1+f(log(n)))
fuente
R,
3837 bytes¡Gracias @ user5957401 por el byte extra!
Casos de prueba:
fuente
if(x>1)1+f(log(x))else 0
es decir, es un byte más corto.R , 34 bytes
Pruébalo en línea!
Es posible un enfoque no recursivo: 36 bytes y toma la entrada de stdin.
fuente
Java 7, 47 bytes
Pruébalo en línea.
El método recursivo de estilo Java 7 anterior es 2 bytes más corto que un lambda iterativo de estilo Java 8:
Pruébalo en línea.
Explicación:
fuente
Emacs Lisp, 38 bytes
Casos de prueba:
fuente
Jalea , 8 bytes
Implementación directa de la definición. Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Perl 5, 35 bytes
Muy simple, requiere
-M5.016
(que es gratis) habilitar la__SUB__
palabra clave para la recursión anónima.Otra alternativa es
que es de 34 bytes y proporciona la misma salida para todas las entradas> 1, pero devuelve el valor falso especial para las entradas <= 1. Falso es numéricamente igual a cero, pero se imprime como "" (cadena vacía), por lo que probablemente no t calificar.
fuente
sub{($_=pop)>1?1+__SUB__->(log):0}
embargoCJam (16 bytes)
Demostración en línea
Bucle while simple con precondición. (Lo que realmente quiero aquí es una operación de despliegue al estilo de Golfscript, pero CJam no tiene una, y el punto flotante en GolfScript es desordenado y nada golfoso).
fuente
PARI / GP , 24 bytes
Solo la recursión directa.
fuente
Raqueta, 61 bytes
fuente
Arce,
32,3029 bytesCasos de prueba:
fuente
R, 36 bytes
Enfoque ligeramente diferente de Plannapus
Utiliza una asignación correcta para ejecutar el código, por lo que el número deseado debe precederlo. es decir
fuente
Mathematica, 29 bytes
Simple como el infierno, y funciona para entradas cómicamente grandes y negativas:
fuente
Ruby, 29 bytes
fuente
n<=1?a:b
comon>1?b:a
y -1 byte más con funciones lambda anónimas .Perl 6 , 21 bytes
Pruébalo en línea!
La expresión entre paréntesis es una secuencia.
$_
, el argumento de la función, es el primer elemento.*.log
genera cada elemento sucesivo tomando el registro del elemento anterior. La secuencia continúa hasta que la condición final1 >= *
, es verdadera: 1 es mayor o igual que el elemento actual. Restar 1 de la secuencia lo obliga a un número: su longitud.fuente