Dado um número inteiro positivo n e um número a , a n- ésima tetração de a é definida como a ^ ( a ^ ( a ^ (... ^ a ))), onde ^ indica exponenciação (ou potência) e a expressão contém o número a exatamente n vezes.
Em outras palavras, a tetração é exponenciação iterativa associativa à direita. Para n = 4 e a = 1,6, a tetração é 1,6 ^ (1,6 ^ (1,6 ^ 1,6)) ≈ 3,5743.
A função inversa da tetração em relação a n é o superlogaritmo . No exemplo anterior, 4 é o superlogaritmo de 3.5743 com "super-base" 1.6.
O desafio
Dado um número inteiro positivo n , encontre x de modo que n seja o superlogaritmo de si mesmo na super base x . Ou seja, encontre x de modo que x ^ ( x ^ ( x ^ (... ^ x ))) (com x aparecendo n vezes) seja igual a n .
Regras
Programa ou função permitida.
Os formatos de entrada e saída são flexíveis, como de costume.
O algoritmo deve teoricamente funcionar para todos os números inteiros positivos. Na prática, a entrada pode ser limitada a um valor máximo devido a restrições de memória, tempo ou tipo de dados. No entanto, o código deve funcionar para entradas de 100
pelo menos menos de um minuto.
O algoritmo deve teoricamente fornecer o resultado com 0.001
precisão. Na prática, a precisão da saída pode ser pior devido a erros acumulados em cálculos numéricos. No entanto, a saída deve ser precisa até 0.001
os casos de teste indicados.
O menor código vence.
Casos de teste
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Implementação de referência
Aqui está uma implementação de referência no Matlab / Octave (tente em Ideone ).
N = 10; % input
t = .0001:.0001:2; % range of possible values: [.0001 .0002 ... 2]
r = t;
for k = 2:N
r = t.^r; % repeated exponentiation, element-wise
end
[~, ind] = min(abs(r-N)); % index of entry of r that is closest to N
result = t(ind);
disp(result)
Para N = 10
isso dá result = 1.5085
.
O código a seguir é uma verificação da precisão da saída, usando aritmética de precisão variável:
N = 10;
x = 1.5085; % result to be tested for that N. Add or subtract 1e-3 to see that
% the obtained y is farther from N
s = num2str(x); % string representation
se = s;
for n = 2:N;
se = [s '^(' se ')']; % build string that evaluates to iterated exponentiation
end
y = vpa(se, 1000) % evaluate with variable-precision arithmetic
Isto dá:
- Para
x = 1.5085
:y = 10.00173...
- Para
x = 1.5085 + .001
:y = 10.9075
- Pois
x = 1.5085 - .001
dáy = 9.23248
.
assim 1.5085
é uma solução válida com .001
precisão.
x
convergem comon
se aproxima do infinito?Respostas:
Dyalog APL ,
3325 bytesPrecisa o
⎕IO←0
que é padrão em muitos sistemas.Teoricamente calcula para todos os números inteiros, mas praticamente limitado a um número muito pequeno.
TryAPL online!
fonte
Haskell,
555452 bytesUso:
Obrigado a @nimi por 1 byte!
Obrigado a @xnor por 2!
fonte
[ ]!!0
em vez dehead[ ]
salvar um bytes n=[x|x<-[2,1.9999..],n>iterate(x**)1!!n]!!0
seria mais curto se você pudesse fazer o Haskell aceitar seus tipos.Javascript, ES6: 77 bytes / ES7:
5753 bytesES6
ES7
Usando
**
como sugerido por DanTheMan:Exemplo
fonte
**
vez deMath.pow
.Mathematica,
4033 bytesGraças a murphy por quase 20% de economia!
Nest[x^#&,1,n]
produz a enésima tetração de x. Portanto,Nest[x^#&,1,#]<#
testa se a tetração (entrada) de x é menor que (entrada). Simplesmente começamos com x = 1 e adicionamos 0,001 repetidamente até que a tetração seja muito grande e depois produzimos o último valor de x (para garantir que a resposta seja maior que o valor exato, mas dentro de 0,001).Enquanto estou aprendendo lentamente:
//.x_:>y/;z
ou//.x_/;z:>y
significa "procure qualquer coisa que corresponda ao modelo x, mas apenas as coisas para as quais o teste z retorna verdadeiro; e depois opere x pela regra y; repetidamente até que nada mude". Aqui o modelox_
é apenas "qualquer número que eu vejo", embora em outros contextos possa ser ainda mais restrito.Quando a entrada é pelo menos 45, a tetração aumenta tão rapidamente que a última etapa causa um erro de estouro; mas o valor de x ainda é atualizado e gerado corretamente. Diminuir o tamanho da etapa de 0,001 para 0,0001 corrige esse problema para entradas de até 112 e fornece uma resposta mais precisa para a inicialização (e ainda é executada rapidamente, em cerca de um quarto de segundo). Mas esse é um byte extra, então esqueça isso!
Versão original:
fonte
1//.x_:>x+.001/;Nest[x^#&,1,#]<#&
//.
sem ajuda :)J,
393128 bytesCom base na implementação de referência. É preciso apenas com três casas decimais.
Economizou 8 bytes usando o método da solução de @ Adám .
Uso
Comandos extras usados para formatar várias entradas / saídas.
Explicação
fonte
Python, 184 bytes
Saída de teste (pulando as instruções de impressão reais):
fonte
s(1000000)
muito rapidamenteRaquete 187 bytes
Teste:
Resultado:
Versão detalhada:
fonte
Perl 6 , 42 bytes
(Tradução do exemplo do código Matlab)
Teste:
fonte
PHP, 103 bytes
fonte
Axiom 587 bytes
menos golfe + números
fonte
Lisp comum, 207 bytes
O uso
reduce
com:from-end t
evita a necessidade de executar um lambda intermediário de "exponenciação reversa" (basicamente(lambda (x y) (expt y x))
, economizando 14 bytes (12, se você remover espaços removíveis).Ainda precisamos lidar com o estouro de flutuação, mas um
ignore-errors
formulário retornaránil
se ocorrer um erro, para que possamos usaror
para fornecer um valor padrão.fonte