Este deve ser um desafio simples.
Dado um número n >= 0
, produza o superlogaritmo (ou log *, log-star ou logaritmo iterado , que são equivalentes, pois n
nunca é negativo para esse desafio.) De n
.
Esta é uma das duas funções inversas à tetração . O outro é a super raiz , que está em uma questão relacionada .
Exemplos
Input Output
0 0
1 0
2 1
3 2
4 2
...
15 2
16 3
...
3814279 3
3814280 4
Regras
- Você não precisa suportar decimais, embora possa.
- Você precisa apoiar a entrada de pelo menos
3814280 = ceiling(e^e^e)
. - Você não pode codificar os valores como
3814280
. (Seu programa deve, teoricamente, suportar números mais altos.) Quero que um algoritmo seja implementado. - O menor código vence.
code-golf
math
code-golf
array-manipulation
sorting
code-golf
math
arithmetic
matrix
code-golf
string
kolmogorov-complexity
code-golf
string
code-golf
math
sequence
arithmetic
recursion
code-golf
math
ascii-art
sequence
code-golf
math
array-manipulation
code-golf
code-golf
kolmogorov-complexity
code-golf
string
code-golf
string
decision-problem
code-golf
array-manipulation
tips
javascript
json
code-golf
math
string
number
number-theory
code-golf
math
sequence
fibonacci
number
arithmetic
fastest-code
integer
code-golf
math
sequence
code-golf
string
file-system
tips
golfscript
code-golf
string
code-golf
string
natural-language
code-golf
string
file-system
code-golf
math
array-manipulation
code-challenge
image-processing
compression
code-golf
math
number
sequence
code-golf
math
combinatorics
regular-expression
code-golf
sequence
pi
code-golf
ascii-art
code-golf
string
array-manipulation
sorting
code-golf
string
graph-theory
code-golf
string
code-golf
string
ascii-art
code-challenge
compression
code-golf
code-golf
math
sequence
number-theory
code-golf
maze
graph-theory
code-golf
math
sequence
mbomb007
fonte
fonte
Respostas:
Gelatina , 8 bytes
Experimente online! ou verifique todos os casos de teste .
fundo
Começamos sucessivamente tomando logaritmos naturais da entrada e dos resultados subsequentes até que o resultado não seja mais alterado. Isso funciona porque a extensão do logaritmo natural ao plano complexo tem um ponto fixo ; se z = e -W (-1) ≈ 0,318 + 1,337i - onde W denota a função Lambert W -, temos log (z) = z .
Para a entrada n , após calcular [n, log (n), log (log (n)),…, z] , primeiro aplicamos a função de teto a cada um dos resultados. A implementação de Jelly (
Ċ
) na verdade calcula a parte imaginária do número complexo † , mas não estamos interessados nisso de qualquer maneira.Uma vez que a k- ésima aplicação do log produza um valor menor ou igual a 1 ,
Ċ
retornará 1 pela primeira vez. O índice baseado em 0 desse primeiro 1 é o resultado desejado.A implementação direta (cálculo com base no índice 1, decremento) falha devido ao caso 0 de borda , que não possui um 1 em sua lista de logaritmos. De fato, para a entrada 0 , a sequência de logaritmos é
Isso ocorre porque o logaritmo de Jelly (
Æl
) está sobrecarregado; primeiro tentamath.log
(logaritmo real), depoiscmath.log
(logaritmo complexo) e finalmente "desiste" e retornaNone
. Felizmente,Ċ
está sobrecarregado de maneira semelhante e simplesmente retorna o argumento se não puder arredondar ou assumir uma parte imaginária.Da mesma forma, a entrada 1 retorna
o que pode criar problemas em outras abordagens que envolvem ou não
Ċ
.Uma maneira de corrigir esse problema é aplicar
Ḋ
(desenfileirar; remove o primeiro elemento) à matriz de logaritmos. Este mapeiaentão nenhuma lista tem 1 agora. Dessa forma, encontrar o índice do primeiro 1 retornará 0 (não encontrado), que é a saída desejada para as entradas 0 e 1 .
Como funciona
† Este é um dos únicos três átomos em Jelly sobrecarregados de uma maneira não óbvia.
fonte
Geléia , 9 bytes
Experimente online!
Suíte de teste.(Ligeiramente modificado.)
Explicação
fonte
C, 38 bytes
Bastante auto-explicativo.
Experimente em ideone.
fonte
Javascript,
452726 bytesAqui está o conjunto de testes (3ª rev)
Obrigado @LeakyNun por salvar 1 byte com função condicional e depois converter para lambda, e @Neil por apontar false é ok, retorne o valor para <= 1 (teste alterado para ser == em vez de ===)
fonte
false
vez de 0 (pois ele se converte automaticamente em 0 em uma expressão inteira). Nesse caso, você pode soltar o|0
.Mathematica, 21 bytes
Função anônima recursiva. Pega um número inteiro como entrada e retorna seu superlogaritmo como saída. Apenas usa a definição dada.
fonte
Dyalog APL , 13 bytes
Tradução direta do OP:
TryAPL online!
fonte
Pitão, 10 bytes
Suíte de teste.
Isso define uma função.
fonte
tl.u?>N1.l
;-)Haskell, 23 bytes
Exemplo de uso:
l 3814280
->4
.fonte
Python 3, 45 bytes
Pois
x <= 1
, isso retornaFalse
(que está== 0
em Python).fonte
False
pode ser usado para0
.and
vez deif else
). Grats.05AB1E,
1613 bytesExplicação
Experimente online
fonte
MATL ,
1512 bytesExperimente online! Ou verifique todos os casos de teste (versão ligeiramente modificada para lidar com várias entradas).
Como funciona
Começando com 0, aplique a exponenciação iterada até exceder a entrada. A saída é o número de iterações menos 1.
fonte
J ,
21191816 bytesSalva 2 bytes em Leaky Nun, 1 byte em Galen Ivanov e 2 bytes em FrownyFrog!
Experimente online!
Casos de teste
fonte
2#@}.^.^:(0<])^:a:
(I começou sovling o que acabou por ser um dup deste problema.)2#@}.(0>.^.)^:a:
parece funcionar.Julia, 17 bytes
Experimente online!
fonte
MATLAB / oitava, 44 bytes
function a=g(n);a=0;if n>1;a=1+g(log(n));end
Tentei fazer tudo isso como uma função anônima, mas esqueci que o MATLAB / Octave continua avaliando expressões mesmo que sejam multiplicadas por um valor booleano false (zero):
f=@(n)(n>1)*(1+f(log(n)))
fonte
R,
38bytes 37Obrigado @ user5957401 pelo byte extra!
Casos de teste:
fonte
if(x>1)1+f(log(x))else 0
é um byte mais curto.R , 34 bytes
Experimente online!
É possível uma abordagem não recursiva: 36 bytes e recebe a entrada de stdin.
fonte
Java 7, 47 bytes
Experimente online.
O método recursivo do estilo Java 7 acima é 2 bytes menor que um lambda iterativo do estilo Java 8:
Experimente online.
Explicação:
fonte
Emacs Lisp, 38 bytes
Casos de teste:
fonte
Gelatina , 8 bytes
Implementação direta da definição. Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Perl 5, 35 bytes
Muito simples, requer
-M5.016
(que é gratuito) ativar a__SUB__
palavra - chave para recursão anônima.Outra alternativa é
que é 34 bytes e fornece a mesma saída para todas as entradas> 1, mas retorna o valor falso especial para as entradas <= 1. False é numericamente igual a zero, mas é impresso como "" (string vazia), portanto provavelmente não ' não se qualifica.
fonte
sub{($_=pop)>1?1+__SUB__->(log):0}
emboraCJam (16 bytes)
Demonstração online
Loop while simples com pré-condição. (O que eu realmente quero aqui é uma operação de desdobramento no estilo Golfscript, mas o CJam não possui uma, e o ponto flutuante no GolfScript é confuso e nem um pouco golfe).
fonte
PARI / GP , 24 bytes
Apenas a recursão direta.
fonte
Raquete, 61 bytes
fonte
Bordo,
32,3029 bytesCasos de teste:
fonte
R, 36 bytes
Abordagem ligeiramente diferente do Plannapus
Usa uma atribuição correta para executar o código - portanto, o número desejado deve precedê-lo. ie
fonte
Mathematica, 29 bytes
Simples como o inferno, e funciona para entradas cômicas e negativas:
fonte
Ruby, 29 bytes
fonte
n<=1?a:b
comon>1?b:a
e -1 mais byte com funções lambda anônimas .Perl 6 , 21 bytes
Experimente online!
A expressão entre parênteses é uma sequência.
$_
, o argumento para a função, é o primeiro elemento.*.log
gera cada elemento sucessivo tomando o log do elemento anterior. A sequência continua até que a condição final,,1 >= *
seja verdadeira: 1 é maior que ou igual ao elemento atual. Subtrair 1 da sequência o força a um número: seu comprimento.fonte