Una función semi-exponencial es aquella que cuando se compone consigo misma da una función exponencial. Por ejemplo, si f(f(x)) = 2^x, entonces fsería una función medio exponencial. En este desafío, calcularás una función semiexponencial específica.
Específicamente, calculará la función desde los enteros no negativos hasta los enteros no negativos con las siguientes propiedades:
Monotónicamente creciente: si
x < y, entoncesf(x) < f(y)Al menos medio exponencial: para todos
x,f(f(x)) >= 2^xLexicográficamente más pequeña: Entre todas las funciones con las propiedades anteriores, la salida de la que reduce al mínimo
f(0), lo que, dado que reduce al mínimo la elecciónf(1), a continuaciónf(2), y así sucesivamente.
Los valores iniciales de esta función, para las entradas 0, 1, 2, ...son:
[1, 2, 3, 4, 8, 9, 10, 11, 16, 32, 64, 128, 129, 130, 131, 132, 256, 257, ...]
Puede generar esta función a través de cualquiera de los siguientes métodos, ya sea como función o como programa completo:
Tomar
xcomo entrada, salidaf(x).Tomar
xcomo entrada, generar los primerosxvalores def.Infinitamente salida de todo
f.
Si desea tomar xy generar f(x), xdebe estar indexado a cero.
Este es el código de golf: el código más corto en bytes gana. Las lagunas estándar están prohibidas, como siempre.

Respuestas:
JavaScript (ES7),
5148 bytesGuardado 3 bytes gracias a @Arnauld
Toma n y saca el n . ° elemento de la secuencia.
JavaScript (ES7),
706864 bytesUna función recursiva que toma
xy devuelve los primerosxelementos de la secuencia como una matriz.Cómo funciona
La matriz a se genera de forma procesal, un elemento a la vez, hasta que alcanza la longitud deseada. (Un puerto de la técnica infinita utilizada en la excelente respuesta de Python de xnor probablemente sería más corto).
Podemos hacer la siguiente observación para cada índice i (indexado a 0):
Esto es cierto porque f (f (j)) debe ser al menos 2 j , y f (f (j)) es equivalente a a [a [j]] , que a su vez es equivalente a a [i] .
Normalmente la opción correcta es exactamente 2 j . Sin embargo, para el caso singular i = 2 , 2 existe en la matriz en el índice j = 1 , lo que significa que 2 j sería 2, pero esto significa que tendríamos 2 en a [1] y a [2] . Para evitar esto, tomamos el máximo de 2 j y un [i-1] + 1 (uno más que el elemento anterior), que da 3 para i = 2 .
Esta técnica también se encarga de decidir si existe o no j ; si no existe, el
.indexOf()método de JS devuelve -1 , lo que lleva a tomar el máximo de a [i-1] + 1 y 2 -1 = 0.5 . Como todos los elementos de la secuencia son al menos 1 , esto siempre devolverá el elemento anterior más uno.(Estoy escribiendo esta explicación a altas horas de la noche, así que avíseme si algo es confuso o si me perdí algo)
fuente
272y más dan respuestas incorrectas debido a problemas de desbordamiento de enteros. Esto está bien, ya que funciona hasta el límite del tipo de datos.2**lugar de con1<<suerte solucionar el problema..99mata la solución. ¿Pero por qué usar+.99y no solo+.9? ¿Cual es la diferencia?Math.log2(...)y tuve que calcular el techo. Ahora no es necesario en absoluto. ¡Gracias! Investigaré el2**asunto: estaba usando2**...+.99|0originalmente, pero1<<era más corto porque no necesitaba el|0. Ahora creo que no hay diferencia ...Python 2 , 60 bytes
Pruébalo en línea!
Imprime para siempre.
Python , 61 bytes
Pruébalo en línea!
Una función. Salidas
Trueen lugar de1.fuente
Perl 5, 53 + 1 (
-p) = 54 bytesPruébalo en línea
fuente
Bash, 66 bytes
Pruébalo en línea
fuente
Jalea , 14 bytes
Pruébalo en línea!
Cómo funciona
fuente
Python 2 , 111 bytes
Pruébalo en línea!
Esta es una modificación significativa de la respuesta del usuario 202729 . Hubiera publicado esta mejora como un comentario, pero la respuesta se elimina y, por lo tanto, los comentarios están deshabilitados.
fuente
x**2es demasiado pequeño.x=1000. Es posible que desee probar2**x, terriblemente grande, pero codegolf es codegolf.2**xcrea un rango demasiado grande para que Python continúe.Swift , 137 bytes
Toma la entrada como
Int(entero) e imprime como[Int](matriz entera).Versión sin golf
fuente
??