Seu trabalho é criar a função de crescimento mais lento possível em não mais que 100 bytes.
Seu programa terá como entrada um número inteiro não negativo e emitirá um número inteiro não negativo. Vamos chamar o seu programa P.
Ele deve atender a esses dois critérios:
- Seu código-fonte deve ser menor ou igual a 100 bytes.
- Para todo K, existe um N, tal que para todo n> = N, P (n)> K. Em outras palavras, lim (n-> ∞) P (n) = ∞ . (É isso que significa "crescer".)
Sua "pontuação" é a taxa de crescimento da função subjacente do seu programa.
Mais especificamente, o programa P cresce mais lentamente que Q se houver um N tal que para todos n> = N, P (n) <= Q (n) e houver pelo menos um n> = N tal que P (n ) <Q (n). Se nenhum dos programas é melhor que o outro, eles estão vinculados. (Essencialmente, qual programa é mais lento é baseado no valor de lim (n-> ∞) P (n) -Q (n).)
A função de crescimento mais lento é definida como a que cresce mais lentamente que qualquer outra função, de acordo com a definição do parágrafo anterior.
Como o golfe é a taxa de crescimento , o programa de crescimento mais lento vence!
Notas:
- Para ajudar na pontuação, tente colocar a função que seu programa calcula na resposta.
- Coloque também algumas entradas e saídas (teóricas), para ajudar as pessoas a ter uma idéia de quão lento você pode ir.
fonte
<
seguido por uma letra é o início de uma tag HTML. Visualize suas perguntas antes de publicá-las, por favor: PRespostas:
Haskell, 98 bytes, pontuação = f ε 0 −1 ( n )
Como funciona
Isso calcula o inverso de uma função de crescimento muito rápido relacionada ao jogo de worms de Beklemishev . Sua taxa de crescimento é comparável a f ε 0 , onde f α é a hierarquia de rápido crescimento e ε 0 é o primeiro número epsilon .
Para comparação com outras respostas, observe que
fonte
Braquilog , 100 bytes
Experimente online!
Provavelmente, isso não está nem perto da lentidão de outras respostas sofisticadas, mas eu não podia acreditar que ninguém havia tentado essa abordagem simples e bonita.
Simplesmente, calculamos o comprimento do número de entrada, o comprimento deste resultado e o comprimento desse outro resultado ... 100 vezes no total.
Isso cresce tão rápido quanto o log (log (log ... log (x)), com 100 logs de base 10.
Se você digitar seu número como uma sequência , isso será executado extremamente rápido em qualquer entrada que você possa tentar, mas não espere ver um resultado maior que 1: D
fonte
JavaScript (ES6), Função Inversa Ackermann *, 97 bytes
* se eu fiz direito
Função
A
é a função Ackermann . A funçãoa
deve ser a função Inversa Ackermann . Se eu o implementei corretamente, a Wikipedia diz que não será atingido5
até quem
seja igual2^2^2^2^16
. Eu dou umaStackOverflow
volta1000
.Uso:
Explicações:
Função Ackermann
Função Ackermann Inversa
fonte
Pure Evil: Eval
A instrução dentro do eval cria uma cadeia de comprimento 7 * 10 10 10 10 10 10 8,57, que consiste em nada além de mais chamadas para a função lambda, cada uma das quais constrói uma cadeia de comprimento semelhante , continuamente até eventualmente
y
se tornar 0. Ostensivelmente isso tem a mesma complexidade do método Eschew abaixo, mas, em vez de depender da lógica de controle if-and-or, ele apenas esmaga cadeias gigantes (e o resultado líquido está ficando mais acumulado ... provavelmente?).O maior
y
valor que posso fornecer e calcular sem o Python gerar um erro é 2, o que já é suficiente para reduzir a entrada de max-float no retorno 1.A cadeia de comprimento 7.625.597.484.987 é muito grande:
OverflowError: cannot fit 'long' into an index-sized integer
.Eu deveria parar.
Evitar
Math.log
: Indo para a (10ª) raiz (do problema), Pontuação: função efetivamente indistinguível de y = 1.A importação da biblioteca de matemática está restringindo a contagem de bytes. Vamos acabar com isso e substituir a
log(x)
função por algo aproximadamente equivalente:x**.1
e que custa aproximadamente o mesmo número de caracteres, mas não requer a importação. Ambas as funções têm uma saída sublinear em relação à entrada, mas x 0,1 cresce ainda mais lentamente . No entanto, não nos importamos muito, apenas nos importamos que ele tenha o mesmo padrão de crescimento base em relação a grandes números enquanto consome um número comparável de caracteres (por exemplo,x**.9
é o mesmo número de caracteres, mas cresce mais rapidamente, portanto é algum valor que exibirá exatamente o mesmo crescimento).Agora, o que fazer com 16 caracteres. Que tal ... estender nossa função lambda para ter propriedades de Sequência Ackermann? Essa resposta para grandes números inspirou essa solução.
A
z**z
parte aqui me impede de executar esta função em qualquer lugar próximo de entradas sãs paray
ez
, os maiores valores que posso usar são 9 e 3 para os quais recupero o valor de 1,0, mesmo para os maiores suportes flutuantes de Python (nota: enquanto 1.0 é numericamente maior que 6.77538853089e-05, os níveis de recursão aumentados movem a saída dessa função para mais perto de 1, enquanto permanecem maiores que 1, enquanto a função anterior moveu os valores para mais perto de 0 enquanto permanece maior que 0, portanto, mesmo recursão moderada nessa função resulta em tantas operações que o número do ponto flutuante perde todos os bits significativos).Reconfigurando a chamada lambda original para ter valores de recursão de 0 e 2 ...
Se a comparação for feita para "compensar de 0" em vez de "compensar de 1", essa função retornará
7.1e-9
, que é definitivamente menor que6.7e-05
.A recursão base do programa real (valor z) tem 10 10 10 10 1,97 níveis de profundidade, assim que y se esgota, ela é redefinida com 10 10 10 10 10 1,97 (e é por isso que um valor inicial de 9 é suficiente), então não nem sei como calcular corretamente o número total de recursões que ocorrem: cheguei ao fim do meu conhecimento matemático. Da mesma forma, não sei se mover uma das
**n
exponenciações da entrada inicial para a secundáriaz**z
melhoraria o número de recursões ou não (idem ao contrário).Vamos ir ainda mais devagar com ainda mais recursão
n//1
- economiza 2 bytes sobreint(n)
import math
,math.
economiza 1 bytefrom math import*
a(...)
economiza 8 bytes no totalm(m,...)
(y>0)*x
salva um byte maisy>0and x
9**9**99
aumenta a contagem de bytes em 4 e aumenta a profundidade da recursão em aproximadamente2.8 * 10^x
ondex
está a profundidade antiga (ou uma profundidade próxima ao googolplex em tamanho: 10 10 94 ).9**9**9e9
aumenta a contagem de bytes em 5 e aumenta a profundidade da recursão em ... uma quantidade insana. A profundidade da recursão agora é 10 10 10 9,93 ; para referência, um googolplex é 10 10 10 2 .m(m(...))
aa(a(a(...)))
custos 7 bytesNovo valor de saída (com 9 profundidade de recursão):
A profundidade da recursão explodiu até o ponto em que esse resultado é literalmente sem sentido, exceto em comparação com os resultados anteriores usando os mesmos valores de entrada:
log
25 vezesLambda Inception, pontuação: ???
Ouvi você gostar de lambdas, então ...
Não consigo nem executar isso, empilhar estouro, mesmo com meras 99 camadas de recursão.
O método antigo (abaixo) retorna (pulando a conversão para um número inteiro):
O novo método retorna, usando apenas 9 camadas de incursão (em vez de o googol completo delas):
Eu acho que isso tem complexidade semelhante à sequência de Ackerman, apenas pequena em vez de grande.
Também graças à ETHproductions por uma economia de 3 bytes em espaços que eu não sabia que poderiam ser removidos.
Resposta antiga:
O truncamento inteiro do log da função (i + 1) repetiu
2025 vezes (Python) usando lambdas lambda'd.A resposta de PyRulez pode ser compactada introduzindo um segundo lambda e empilhando-o:
99100 caracteres usados.Isso produz uma iteração de
2025, sobre o 12. original. Além disso, ele salva 2 caracteres usando emint()
vez dofloor()
que permitiu umax()
pilha adicional .Se os espaços após o lambda puderem ser removidos (não posso verificar no momento), um quintoPossível!y()
pode ser adicionado.Se houver uma maneira de pular a
from math
importação usando um nome totalmente qualificado (por exemplox=lambda i: math.log(i+1))
), isso salvaria ainda mais caracteres e permitiria outra pilha,x()
mas não sei se o Python suporta essas coisas (suspeito que não). Feito!Esse é essencialmente o mesmo truque usado na postagem do blog do XCKD em grandes números , no entanto, a sobrecarga na declaração de lambdas impede uma terceira pilha:
Essa é a menor recursão possível com três lambdas que excedem a altura da pilha computada de 2 lambdas (reduzir qualquer lambda para duas chamadas reduz a altura da pilha para 18, abaixo da versão 2-lambda), mas infelizmente requer 110 caracteres.
fonte
int
conversão e pensei que tinha algumas peças de reposição.import
e o espaço depoisy<0
. Eu não sei muito Python embora assim que eu não estou certoy<0and x or m(m,m(m,log(x+1),y-1),y-1)
para salvar outro byte (assumindo quex
nunca é0
quandoy<0
)log(x)
cresce mais lentamente do que QUALQUER poder positivo dex
(para grandes valores dex
), e isso não é difícil de mostrar usando a regra de L'Hopital. Tenho certeza de que sua versão atual faz(...(((x**.1)**.1)**.1)** ...)
várias vezes. Mas esses poderes apenas se multiplicam, então é efetivamentex**(.1** (whole bunch))
, que é um poder positivo (muito pequeno) dex
. Isso significa que ele realmente cresce mais rápido do que uma iteração ÚNICA da função de log (embora, concedido, você precise examinar MUITO grandes valoresx
antes de perceber ... mas é isso que queremos dizer com "ir ao infinito" )Haskell , 100 bytes
Experimente online!
Essa solução não assume o inverso de uma função que cresce rapidamente, mas assume uma função que cresce lentamente, nesse caso
length.show
, e a aplica várias vezes.Primeiro, definimos uma função
f
.f
é uma versão bastarda da notação ascendente de Knuth que cresce um pouco mais rápido (um pouco é um pouco de eufemismo, mas os números com os quais estamos lidando são tão grandes que no grande esquema das coisas ...). Definimos o caso base def 0 a b
sera^b
oua
ao poder deb
. Em seguida, definimos o caso geral a ser(f$c-1)
aplicado àsb+2
instâncias dea
. Se estivéssemos definindo uma notação de Knuth como uma construção, a aplicaríamos ab
instâncias dea
, masb+2
na verdade é mais golfista e tem a vantagem de crescer mais rapidamente.Em seguida, definimos o operador
#
.a#b
está definido para serlength.show
aplicado àsb
a
horas. Cada aplicação delength.show
é aproximadamente igual ao log 10 , o que não é uma função que cresce muito rapidamente.Em seguida, definimos nossa função
g
que recebe um número inteiro e se aplicalength.show
ao número inteiro várias vezes. Para ser específico, aplica-selength.show
à entradaf(f 9 9 9)9 9
. Antes de entendermos o tamanho, vamos verf 9 9 9
.f 9 9 9
é maior que9↑↑↑↑↑↑↑↑↑9
(nove setas), por uma margem massiva. Eu acredito que está em algum lugar entre9↑↑↑↑↑↑↑↑↑9
(nove flechas) e9↑↑↑↑↑↑↑↑↑↑9
(dez flechas). Agora, esse é um número inimaginavelmente grande, muito grande para ser armazenado em qualquer computador existente (em notação binária). Nós pegamos isso e colocamos isso como o primeiro argumento do nosso, of
que significa que nosso valor é maior do que9↑↑↑↑↑↑...↑↑↑↑↑↑9
comf 9 9 9
setas no meio. Não vou descrever esse número porque é tão grande que não acho que seria capaz de fazer justiça.Cada um
length.show
é aproximadamente igual a obter a base de log 10 do número inteiro. Isso significa que a maioria dos números retornará 1 quandof
for aplicada a eles. O menor número para retornar algo diferente de 1 é10↑↑(f(f 9 9 9)9 9)
, que retorna 2. Vamos pensar nisso por um momento. Por mais abominável que seja o número que definimos anteriormente, o menor número que retorna 2 é 10 em seu próprio poder tantas vezes. Isso é 1 seguido por10↑(f(f 9 9 9)9 9)
zeros.Para o caso geral da
n
menor entrada de saída, qualquer n deve ser(10↑(n-1))↑↑(f(f 9 9 9)9 9)
.Observe que este programa requer quantidades enormes de tempo e memória para n pequenos (mais do que existe no universo muitas vezes); se você quiser testar isso, sugiro que substitua
f(f 9 9 9)9 9
por um número muito menor; tente 1 ou 2, se quiser. obter qualquer saída diferente de 1.fonte
APL, Apply
log(n + 1)
,e^9^9...^9
times, em que o comprimento da cadeia ée^9^9...^9
do comprimento da cadeia menos 1 vezes, e assim por diante.fonte
e^n^n...^n
parte que eu transformou-o em constante, mas pode ser verdadeMATL , 42 bytes
Experimente online!
Este programa é baseado nas séries harmônicas com o uso da constante de Euler – Mascheroni. Enquanto eu lia a documentação do @LuisMendo em sua linguagem MATL (com letras maiúsculas, isso parece importante), notei essa constante. A expressão da função de crescimento lento é a seguinte:
Onde εk ~ 1 / 2k
Testei até 10000 iterações (no Matlab, já que é muito grande para o TIO) e a pontuação é inferior a 10, por isso é muito lento.
Explicações:
Prova empírica: (ln k ) + 1 em vermelho sempre acima de ln k + γ + εk em azul.
O programa para (ln k ) + 1 foi realizado em
Matlab,
471814 bytesInteressante notar que o tempo decorrido para n = 100 é 0,208693s no meu laptop, mas apenas 0,121945s com
d=rand(1,n);A=d*0;
e menos ainda 0,112147s comA=zeros(1,n)
. Se zeros é um desperdício de espaço, economiza velocidade! Mas estou divergindo do tópico (provavelmente muito devagar).Edit: obrigado a Stewie por
ajudar areduzir essa expressão do Matlab para, simplesmente:fonte
n=input('');A=log(1:n)+1
ou como uma função anônima sem nome (14 bytes):@(n)log(1:n)+1
. Eu não tenho certeza sobre MATLAB, masA=log(1:input(''))+1
trabalha em Octave ...n=input('');A=log(1:n)+1
obras,@(n)log(1:n)+1
não (na verdade uma função válida com cabo em Matlab, mas a entrada não é solicitado),A=log(1:input(''))+1
obras e pode ser encurtadolog(1:input(''))+1
f=
não precisa ser contado, pois é possível apenas:@(n)log(1:n)+1
seguido deans(10)
para obter os 10 primeiros números.Python 3 , 100 bytes
O piso do log de funções (i + 1) repetiu 999999999999999999999999999999999 vezes.
Pode-se usar expoentes para tornar o número acima ainda maior ...
Experimente online!
fonte
9**9**9**...**9**9e9
?O piso do log de funções (i + 1) repetiu 14 vezes (Python)
Não espero que isso funcione muito bem, mas achei que é um bom começo.
Exemplos:
fonte
int
vez defloor
, poderá se encaixar em outrox(
e^e^e^e...^n
? Além disso, por que há um espaço após o:
?x()
chamada?Ruby, 100 bytes, pontuação -1 = f ω ω + 1 (n 2 )
Emprestado basicamente do meu maior número imprimível , aqui está o meu programa:
Experimente online
Calcula basicamente o inverso de f ω ω + 1 (n 2 ) na hierarquia de rápido crescimento. Os primeiros valores são
E então continua a ser produzido
2
por um tempo muito longo. Mesmox[G] = 2
, ondeG
está o número de Graham.fonte
Mathematica, 99 bytes
(assumindo que ± leva 1 byte)
Os três primeiros comandos definem
x±y
para avaliarAckermann(y, x)
.O resultado da função é o número de vezes que
f(#)=#±#±#±#±#±#±#±#
precisa ser aplicado a 1 antes que o valor chegue ao valor do parâmetro. Comof(#)=#±#±#±#±#±#±#±#
(isto é,f(#)=Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[#, #], #], #], #], #], #], #]
) cresce muito rápido, a função cresce muito lentamente.fonte
Clojure, 91 bytes
Tipo de calcula o
sum 1/(n * log(n) * log(log(n)) * ...)
, que eu encontrei a partir daqui . Mas a função terminou com 101 bytes, então tive que eliminar o número explícito de iterações e, em vez disso, iterar, desde que o número seja maior que um. Exemplo de saídas para entradas de10^i
:Presumo que essa série modificada ainda diverja, mas agora sei como provar isso.
fonte
Javascript (ES6), 94 bytes
Explicação :
Id
refere-se ax => x
a seguir.Vamos primeiro dar uma olhada em:
p(Math.log)
é aproximadamente igual alog*(x)
.p(p(Math.log))
é aproximadamente igual alog**(x)
(número de vezes que você podelog*
até que o valor seja no máximo 1).p(p(p(Math.log)))
é aproximadamente igual alog***(x)
.A função inversa de Ackermann
alpha(x)
é aproximadamente igual ao número mínimo de vezes que você precisa comporp
até que o valor seja no máximo 1.Se usarmos:
então nós podemos escrever
alpha = p(Id)(Math.log)
.Isso é muito chato, no entanto, então vamos aumentar o número de níveis:
É assim que construímos
alpha(x)
, exceto que ao invés de fazerlog**...**(x)
, agora fazemosalpha**...**(x)
.Por que parar aqui embora?
Se a função anterior for
f(x)~alpha**...**(x)
, esta é agora~ f**...**(x)
. Fazemos mais um nível disso para obter nossa solução final.fonte
p(p(x => x - 2))
é aproximadamente igual alog**(x)
(número de vezes que você pode levarlog*
até que o valor seja no máximo 1)". Eu não entendo essa afirmação. Parece-me quep(x => x - 2)
deveria ser "o número de vezes que você pode subtrair2
até que o valor seja no máximo 1". Ou seja, p (x => x - 2) `deve ser a função" dividir por 2 ". Portanto,p(p(x => x - 2))
deve ser "o número de vezes que você pode dividir por 2 até que o valor seja no máximo 1" ... ou seja, deve ser alog
função, nãolog*
oulog**
. Talvez isso possa ser esclarecido?p = f => x => x < 2 ? 0 : 1 + p(p(f))(f(x))
, ondep
é passadop(f)
como nas outras linhas, nãof
.