Su trabajo es crear la función de crecimiento más lento que pueda en no más de 100 bytes.
Su programa tomará como entrada un número entero no negativo y generará un número entero no negativo. Llamemos a su programa P.
Debe cumplir estos dos criterios:
- Su código fuente debe ser menor o igual a 100 bytes.
- Para cada K, hay una N, de modo que para cada n> = N, P (n)> K. En otras palabras, lim (n-> ∞) P (n) = ∞ . (Esto es lo que significa que esté "creciendo").
Su "puntaje" es la tasa de crecimiento de la función subyacente de su programa.
Más específicamente, el programa P crece más lentamente que Q si hay un N tal que para todos n> = N, P (n) <= Q (n), y hay al menos un n> = N tal que P (n ) <Q (n). Si ninguno de los dos programas es mejor que el otro, están vinculados. (Básicamente, qué programa es más lento se basa en el valor de lim (n-> ∞) P (n) -Q (n).)
La función de crecimiento más lento se define como la que crece más lentamente que cualquier otra función, de acuerdo con la definición del párrafo anterior.
Esta es la tasa de crecimiento del golf , por lo que gana el programa de crecimiento más lento.
Notas:
- Para ayudar en la puntuación, intente poner qué función calcula su programa en la respuesta.
- También ponga algunas entradas y salidas (teóricas), para ayudar a dar a las personas una idea de lo lento que puede ir.
fuente
<
seguido de una letra es el comienzo de una etiqueta HTML. Obtenga una vista previa de sus preguntas antes de publicarlas, por favor: PRespuestas:
Haskell, 98 bytes, puntaje = f ε 0 −1 ( n )
Cómo funciona
Esto calcula el inverso de una función de crecimiento muy rápido relacionada con el juego de gusanos de Beklemishev . Su tasa de crecimiento es comparable a f ε 0 , donde f α es la jerarquía de rápido crecimiento y ε 0 es el primer número de épsilon .
Para comparar con otras respuestas, tenga en cuenta que
fuente
Brachylog , 100 bytes
Pruébalo en línea!
Probablemente esto no esté cerca de la lentitud de algunas otras respuestas elegantes, pero no podía creer que nadie hubiera intentado este enfoque simple y hermoso.
Simplemente, calculamos la longitud del número de entrada, luego la longitud de este resultado, luego la longitud de este otro resultado ... 100 veces en total.
Esto crece tan rápido como log (log (log ... log (x), con 100 registros de base 10.
Si ingresa su número como una cadena , esto se ejecutará extremadamente rápido en cualquier entrada que pueda intentar, pero no espere ver un resultado superior a 1: D
fuente
JavaScript (ES6), función Ackermann inversa *, 97 bytes
* si lo hice bien
La función
A
es la función de Ackermann .a
Se supone que la función es la función inversa de Ackermann . Si lo implementé correctamente, Wikipedia dice que no golpeará5
hasta que seam
igual2^2^2^2^16
. Tengo unaStackOverflow
vuelta1000
.Uso:
Explicaciones:
Función de Ackermann
Función inversa de Ackermann
fuente
Pure Evil: Eval
La declaración dentro de la evaluación crea una cadena de longitud 7 * 10 10 10 10 10 10 8.57 que consiste en nada más que más llamadas a la función lambda, cada una de las cuales construirá una cadena de longitud similar , una y otra vez hasta que finalmente
y
convierta en 0. Ostensiblemente esto tiene la misma complejidad que el método Eschew a continuación, pero en lugar de depender de la lógica de si y o control, simplemente rompe cadenas gigantes juntas (y el resultado neto es obtener más pilas ... ¿probablemente?).El
y
valor más grande que puedo suministrar y calcular sin que Python arroje un error es 2, que ya es suficiente para reducir una entrada de max-float para devolver 1.Una serie de longitud 7.625.597.484.987 es demasiado grande:
OverflowError: cannot fit 'long' into an index-sized integer
.Yo debería dejar de.
Esquiar
Math.log
: Ir a la raíz (10º) (del problema), Puntuación: función efectivamente indistinguible de y = 1.La importación de la biblioteca matemática está restringiendo el recuento de bytes. Vamos a eliminar eso y reemplazar la
log(x)
función con algo más o menos equivalente:x**.1
y que cuesta aproximadamente el mismo número de caracteres, pero no requiere la importación. Ambas funciones tienen una salida sublineal con respecto a la entrada, pero x 0.1 crece aún más lentamente . Sin embargo, no nos importa mucho, solo nos importa que tenga el mismo patrón de crecimiento base con respecto a grandes números mientras consume una cantidad comparable de caracteres (por ejemplo,x**.9
es la misma cantidad de caracteres, pero crece más rápidamente, por lo que hay es un valor que exhibiría exactamente el mismo crecimiento).Ahora, qué hacer con 16 personajes. ¿Qué tal ... extender nuestra función lambda para tener propiedades de secuencia de Ackermann? Esta respuesta para grandes números inspiró esta solución.
La
z**z
porción aquí me impide ejecutar esta función con cualquier lugar cercano a las entradas sensatas paray
yz
, los valores más grandes que puedo usar son 9 y 3 para los cuales obtengo el valor de 1.0, incluso para los soportes más grandes flotantes de Python (nota: while 1.0 es numéricamente mayor que 6.77538853089e-05, el aumento de los niveles de recursión mueve la salida de esta función más cerca de 1, mientras permanece mayor que 1, mientras que la función anterior movió los valores más cerca de 0 mientras permanece mayor que 0, por lo tanto, incluso una recursión moderada en esta función da como resultado tantas operaciones que el número de coma flotante pierde todos los bits significativos).Reconfigurando la llamada lambda original para tener valores de recursividad de 0 y 2 ...
Si la comparación se realiza para "compensar desde 0" en lugar de "compensar desde 1", esta función regresa
7.1e-9
, que es definitivamente más pequeña que6.7e-05
.La recursión base del programa real (valor z) es 10 10 10 10 1.97 niveles profundos, tan pronto como y se agota, se restablece con 10 10 10 10 10 1.97 (por lo que un valor inicial de 9 es suficiente), así que no Ni siquiera sé cómo calcular correctamente el número total de recursiones que ocurren: he llegado al final de mi conocimiento matemático. Del mismo modo, no sé si mover una de las
**n
exponenciaciones de la entrada inicial a la secundariaz**z
mejoraría o no el número de recursiones (ídem al revés).Vayamos aún más lento con aún más recursividad
n//1
- ahorra 2 bytes sobreint(n)
import math
,math.
ahorra 1 byte sobrefrom math import*
a(...)
ahorra 8 bytes en totalm(m,...)
(y>0)*x
ahorra un byte másy>0and x
9**9**99
aumenta el recuento de bytes en 4 y aumenta la profundidad de recursión en aproximadamente2.8 * 10^x
dóndex
está la profundidad anterior (o una profundidad cercana al tamaño de un googolplex: 10 10 94 ).9**9**9e9
aumenta el número de bytes en 5 y aumenta la profundidad de recursión en ... una cantidad increíble. La profundidad de recursión es ahora 10 10 10 9.93 , para referencia, un googolplex es 10 10 10 2 .m(m(...))
aa(a(a(...)))
los costos de 7 bytesNuevo valor de salida (a 9 profundidades de recursión):
La profundidad de recursión ha explotado hasta el punto en que este resultado es literalmente sin sentido, excepto en comparación con los resultados anteriores que utilizan los mismos valores de entrada:
log
25 vecesLambda Inception, puntuación: ???
Te escuché como lambdas, así que ...
Ni siquiera puedo ejecutar esto, apilo el desbordamiento incluso con solo 99 capas de recursión.
El método anterior (a continuación) regresa (omitiendo la conversión a un entero):
El nuevo método regresa, usando solo 9 capas de incursión (en lugar del googol completo de ellas):
Creo que esto resulta ser de una complejidad similar a la secuencia de Ackerman, solo pequeña en lugar de grande.
También gracias a ETHproductions por un ahorro de 3 bytes en espacios que no sabía que podrían eliminarse.
Vieja respuesta:
El truncamiento de enteros del registro de funciones (i + 1) iteró
2025 veces (Python) usando lambda'd lambdas.La respuesta de PyRulez se puede comprimir introduciendo una segunda lambda y apilándola:
99100 caracteres utilizados.Esto produce una iteración de
2025, sobre el original 12. Además, ahorra 2 caracteres al usar enint()
lugar de lofloor()
que permite unax()
pila adicional .Si los espacios después de la lambda se pueden eliminar (no puedo verificar en este momento),¡Posible!y()
se puede agregar un quinto .Si hay una manera de omitir la
from math
importación mediante el uso de un nombre completo (por ejemplox=lambda i: math.log(i+1))
), eso ahorraría aún más caracteres y permitiría otra pila dex()
pero no sé si Python admite tales cosas (sospecho que no). ¡Hecho!Este es esencialmente el mismo truco utilizado en la publicación de blog de XCKD en grandes cantidades , sin embargo, la sobrecarga al declarar lambdas impide una tercera pila:
Esta es la recursión más pequeña posible con 3 lambdas que excede la altura de la pila calculada de 2 lambdas (al reducir cualquier lambda a dos llamadas, la altura de la pila cae a 18, por debajo de la versión de 2 lambda), pero desafortunadamente requiere 110 caracteres.
fuente
int
conversión y pensé que tenía algunos repuestos.import
y el espacio despuésy<0
. Sin embargo, no sé mucho de Python, así que no estoy seguroy<0and x or m(m,m(m,log(x+1),y-1),y-1)
para salvar otro byte (suponiendox
que nunca es0
cuándoy<0
)log(x)
crece más lentamente que CUALQUIER poder positivo dex
(para grandes valores dex
), y esto no es difícil de mostrar usando la regla de L'Hopital. Estoy bastante seguro de que su versión actual lo hace(...(((x**.1)**.1)**.1)** ...)
muchas veces. Pero esos poderes simplemente se multiplican, por lo que es efectivamentex**(.1** (whole bunch))
, que es un poder positivo (muy pequeño) dex
. Eso significa que en realidad crece más rápido que una ÚNICA iteración de la función de registro (aunque, concedido, tendrías que mirar valores MUY grandesx
antes de notarlo ... pero eso es lo que queremos decir con "ir al infinito" )Haskell , 100 bytes
Pruébalo en línea!
Esta solución no toma el inverso de una función de crecimiento rápido, sino que toma una función de crecimiento bastante lento, en este caso
length.show
, y la aplica varias veces.Primero definimos una función
f
.f
es una versión bastarda de la notación uparrow de Knuth que crece un poco más rápido (un poco es un eufemismo, pero los números con los que estamos tratando son tan grandes que en el gran esquema de las cosas ...). Definimos el caso base def 0 a b
sera^b
oa
al poder deb
. Luego definimos el caso general que se(f$c-1)
aplicará a lasb+2
instancias dea
. Si estuviéramos definiendo una notación Knuth uparrow como construcción, la aplicaríamos ab
instancias dea
, pero enb+2
realidad es más golfista y tiene la ventaja de crecer más rápido.Luego definimos el operador
#
.a#b
está definido para serlength.show
aplicado a losb
a
tiempos. Cada aplicación delength.show
es aproximadamente igual a log 10 , que no es una función de crecimiento muy rápido.Luego, definimos nuestra función
g
que toma un número entero y se aplicalength.show
al número entero varias veces. Para ser específico, se aplicalength.show
a la entradaf(f 9 9 9)9 9
. Antes de entrar en qué tan grande es esto, veamosf 9 9 9
.f 9 9 9
es mayor que9↑↑↑↑↑↑↑↑↑9
(nueve flechas), por un margen masivo. Creo que está en algún lugar entre9↑↑↑↑↑↑↑↑↑9
(nueve flechas) y9↑↑↑↑↑↑↑↑↑↑9
(diez flechas). Ahora, este es un número inimaginablemente grande, demasiado grande para ser almacenado en cualquier computadora existente (en notación binaria). Luego tomamos eso y lo ponemos como el primer argumento de nuestrof
que significa que nuestro valor es mayor que9↑↑↑↑↑↑...↑↑↑↑↑↑9
conf 9 9 9
flechas en el medio. No voy a describir este número porque es tan grande que no creo que pueda hacerle justicia.Cada uno
length.show
es aproximadamente igual a tomar la base de registro 10 del entero. Esto significa que la mayoría de los números devolverán 1 cuandof
se les aplica. El número más pequeño para devolver algo distinto de 1 es10↑↑(f(f 9 9 9)9 9)
, que devuelve 2. Pensemos en eso por un momento. Tan abominablemente grande como ese número que definimos anteriormente, el número más pequeño que devuelve 2 es 10 a su propia potencia que muchas veces. Eso es 1 seguido de10↑(f(f 9 9 9)9 9)
ceros.Para el caso general de
n
la entrada más pequeña, la salida de cualquier n debe ser(10↑(n-1))↑↑(f(f 9 9 9)9 9)
.Tenga en cuenta que este programa requiere cantidades masivas de tiempo y memoria incluso para n pequeña (más de lo que hay en el universo muchas veces), si desea probar esto, sugiero reemplazarlo
f(f 9 9 9)9 9
con un número mucho menor, pruebe 1 o 2 si lo desea Alguna vez obtuviste cualquier salida que no sea 1.fuente
APL, Aplicar
log(n + 1)
,e^9^9...^9
veces, donde la longitud de la cadena ese^9^9...^9
de longitud de cadena menos 1 veces, y así sucesivamente.fuente
e^n^n...^n
parte, así que la convertí en constante, pero podría ser ciertoMATL , 42 bytes
Pruébalo en línea!
Este programa se basa en la serie armónica con el uso de la constante Euler-Mascheroni. Mientras leía la documentación de @LuisMendo en su lenguaje MATL (con mayúsculas, por lo que parece importante) noté esta constante. La expresión de la función de crecimiento lento es la siguiente:
dónde εk ~ 1 / 2k
Probé hasta 10000 iteraciones (en Matlab, ya que es demasiado grande para TIO) y tiene una puntuación inferior a 10, por lo que es muy lento.
Explicaciones:
Prueba empírica: (ln k ) + 1 en rojo siempre por encima de ln k + γ + εk en azul.
El programa para (ln k ) + 1 se realizó en
Matlab,
471814 bytesEs interesante notar que el tiempo transcurrido para n = 100 es 0.208693s en mi computadora portátil, pero solo 0.121945s con
d=rand(1,n);A=d*0;
e incluso menos, 0.112147s conA=zeros(1,n)
. Si los ceros son una pérdida de espacio, ¡ahorra velocidad! Pero estoy divergiendo del tema (probablemente muy lentamente).Editar: gracias a Stewie por
ayudar areducir esta expresión de Matlab a, simplemente:fuente
n=input('');A=log(1:n)+1
o como una función anónima sin nombre (14 bytes):@(n)log(1:n)+1
. No estoy seguro acerca de MATLAB, peroA=log(1:input(''))+1
trabaja en Octave ...n=input('');A=log(1:n)+1
funciona,@(n)log(1:n)+1
no lo hace (de hecho, una función válida con identificador en Matlab, pero no se solicita entrada),A=log(1:input(''))+1
funciona y se puede acortarlog(1:input(''))+1
f=
no es necesario contar, ya que es posible simplemente:@(n)log(1:n)+1
seguido deans(10)
para obtener los primeros 10 números.Python 3 , 100 bytes
El piso del registro de funciones (i + 1) itera 99999999999999999999999999999999999 veces.
Se pueden usar exponentes para hacer que el número anterior sea aún mayor ...
Pruébalo en línea!
fuente
9**9**9**...**9**9e9
?El piso del registro de funciones (i + 1) iterado 14 veces (Python)
No espero que esto vaya muy bien, pero supuse que era un buen comienzo.
Ejemplos:
fuente
int
lugar defloor
, puede caber en otrox(
e^e^e^e...^n
? Además, ¿por qué hay un espacio después del:
?x()
llamada?Ruby, 100 bytes, puntaje -1 = f ω ω + 1 (n 2 )
Básicamente tomado de mi mayor número imprimible , aquí está mi programa:
Pruébalo en línea
Básicamente calcula el inverso de f ω ω + 1 (n 2 ) en la jerarquía de rápido crecimiento. Los primeros pocos valores son
Y luego continúa produciéndose
2
durante mucho tiempo. Inclusox[G] = 2
, ¿dóndeG
está el número de Graham?fuente
Mathematica, 99 bytes
(suponiendo que ± toma 1 byte)
Los primeros 3 comandos definen
x±y
para evaluarAckermann(y, x)
.El resultado de la función es la cantidad de veces
f(#)=#±#±#±#±#±#±#±#
que se debe aplicar a 1 antes de que el valor llegue al valor del parámetro. Comof(#)=#±#±#±#±#±#±#±#
(es decirf(#)=Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[#, #], #], #], #], #], #], #]
) crece muy rápido, la función crece muy lentamente.fuente
Clojure, 91 bytes
Tipo de calcula el
sum 1/(n * log(n) * log(log(n)) * ...)
, que encontré desde aquí . Pero la función terminó con 101 bytes de longitud, por lo que tuve que descartar el número explícito de iteraciones y, en su lugar, iterar siempre que el número sea mayor que uno. Ejemplo de salidas para entradas de10^i
:Supongo que esta serie modificada aún diverge, pero ahora sé cómo demostrarlo.
fuente
Javascript (ES6), 94 bytes
Explicación :
Id
se refiere ax => x
continuación.Primero echemos un vistazo a:
p(Math.log)
es aproximadamente igual alog*(x)
.p(p(Math.log))
es aproximadamente igual alog**(x)
(cantidad de veces que puede tomarlog*
hasta que el valor sea como máximo 1).p(p(p(Math.log)))
es aproximadamente igual alog***(x)
.La función inversa de Ackermann
alpha(x)
es aproximadamente igual al número mínimo de veces que necesita componerp
hasta que el valor sea como máximo 1.Si luego usamos:
entonces podemos escribir
alpha = p(Id)(Math.log)
.Sin embargo, eso es bastante aburrido, así que aumentemos el número de niveles:
Así es como construimos
alpha(x)
, excepto que en lugar de hacerlolog**...**(x)
, ahora hacemosalpha**...**(x)
.¿Por qué detenerse aquí sin embargo?
Si la función anterior es
f(x)~alpha**...**(x)
, esta es ahora~ f**...**(x)
. Hacemos un nivel más de esto para obtener nuestra solución final.fuente
p(p(x => x - 2))
es aproximadamente igual alog**(x)
(número de veces que puede tomarlog*
hasta que el valor sea como máximo 1)". No entiendo esta afirmación. Me parece quep(x => x - 2)
debería ser "la cantidad de veces que puedes restar2
hasta que el valor sea como máximo 1". Es decir, p (x => x - 2) `debería ser la función" dividir por 2 ". Porp(p(x => x - 2))
lo tanto, debe ser "el número de veces que puede dividir entre 2 hasta que el valor sea como máximo 1" ... es decir, debe ser lalog
función, nolog*
olog**
. Quizás esto podría aclararse?p = f => x => x < 2 ? 0 : 1 + p(p(f))(f(x))
, dondep
se pasap(f)
como en las otras líneas, nof
.