Uma função semi-exponencial é aquela que, quando composta consigo mesma, fornece uma função exponencial. Por exemplo, se f(f(x)) = 2^x
, então f
seria uma função semi-exponencial. Neste desafio, você calculará uma função semi-exponencial específica.
Especificamente, você calculará a função dos números inteiros não negativos para os números inteiros não negativos com as seguintes propriedades:
Aumento monotônico: se
x < y
, entãof(x) < f(y)
Pelo menos meio exponencial: para todos
x
,f(f(x)) >= 2^x
Lexicograficamente menor: Entre todas as funções com as propriedades acima, produza a que minimiza
f(0)
, que, dada essa escolhaf(1)
, minimiza , entãof(2)
, e assim por diante.
Os valores iniciais desta função, para entradas 0, 1, 2, ...
são:
[1, 2, 3, 4, 8, 9, 10, 11, 16, 32, 64, 128, 129, 130, 131, 132, 256, 257, ...]
Você pode gerar esta função por meio de qualquer um dos seguintes métodos, como uma função ou como um programa completo:
Tome
x
como entrada, saídaf(x)
.Tome
x
como entrada, produza os primeirosx
valores def
.Infinitamente saída tudo
f
.
Se você deseja obter x
e enviar f(x)
, x
deve ser zero indexado.
Este é o código golf - o código mais curto em bytes ganha. As brechas padrão são proibidas, como sempre.
Respostas:
JavaScript (ES7),
5148 bytesGuardado 3 bytes graças a @Arnauld
Recebe n e gera o n- ésimo item na sequência.
JavaScript (ES7),
706864 bytesUma função recursiva que recebe
x
e retorna os primeirosx
itens da sequência como uma matriz.Como funciona
A matriz a é gerada proceduralmente, um item de cada vez, até atingir o comprimento desejado. (Uma porta da técnica infinita usada na excelente resposta Python do xnor provavelmente seria mais curta.)
Podemos fazer a seguinte observação para cada índice i (indexado 0):
Isto é verdade porque f (f (j)) tem de ser pelo menos 2 j , e F (f (j)) é equivalente a um [a [j]] , que por sua vez é equivalente a uma [i] .
Normalmente, a opção correta é exatamente 2 j . No entanto, para o caso singular i = 2 , 2 existe na matriz no índice j = 1 , o que significa que 2 j seria 2 - mas isso significa que teríamos 2 tanto em [1] como em [2] . Para contornar este problema, tomamos o máximo de 2 j e uma [i-1] + 1 (um mais do que o item anterior), o que dá 3 para i = 2 .
Essa técnica também decide decidir se j existe ou não - se não existir, o
.indexOf()
método JS retornará -1 , o que levará a obter o máximo de [i-1] + 1 e 2 -1 = 0,5 . Como todos os itens na sequência são pelo menos 1 , isso sempre retornará o item anterior mais um.(Estou escrevendo essa explicação tarde da noite, por favor, deixe-me saber se algo está confuso ou se perdi alguma coisa)
fonte
272
e acima fornecem respostas incorretas devido a problemas de estouro de número inteiro. Isso é bom, pois funciona até o limite do tipo de dados.2**
vez de,1<<
esperançosamente, corrigir o problema..99
mata a solução. Mas por que usar+.99
e não apenas+.9
? Qual é a diferença?Math.log2(...)
e tive que calcular o teto. Agora não é mais necessário. Obrigado! Vou dar uma olhada na2**
coisa - eu estava usando2**...+.99|0
originalmente, mas1<<
era mais curto porque não precisava do|0
. Agora acho que não há diferença ...Python 2 , 60 bytes
Experimente online!
Imprime para sempre.
Python , 61 bytes
Experimente online!
Uma função. Saídas
True
no lugar de1
.fonte
Perl 5, 53 + 1 (
-p
) = 54 bytesExperimente online
fonte
Bash, 66 bytes
Experimente online
fonte
Gelatina , 14 bytes
Experimente online!
Como funciona
fonte
Python 2 , 111 bytes
Experimente online!
Esta é uma modificação significativa da resposta do usuário202729 . Eu teria postado essa melhoria como um comentário, mas a resposta é excluída e, portanto, os comentários estão desabilitados.
fonte
x**2
é muito pequeno.x=1000
. Você pode tentar2**x
- terrivelmente grande, mas o codegolf é um codegolf.2**x
cria um intervalo muito grande para o Python continuar.Rápido , 137 bytes
Pega a entrada como
Int
(inteiro) e imprime como[Int]
(matriz inteira).Versão ungolfed
fonte
?
?