Definição
a(0) = 0
a(n) = n-a(a(a(n-1)))
para inteiron > 0
Tarefa
Dado inteiro não negativo n
, saída a(n)
.
Casos de teste
n a(n)
0 0
1 1
2 1
3 2
4 3
5 4
6 4
7 5
8 5
9 6
10 7
11 7
12 8
13 9
14 10
15 10
16 11
17 12
18 13
19 13
20 14
10000 6823
Referências
code-golf
sequence
number-theory
recursion
Freira Furada
fonte
fonte
Respostas:
Haskell,
2322 bytesSimplesmente usa a definição da sequência.
f(f$f$n-1)
é equivalente af (f (f (n-1)))
.Teste:
Obrigado a Anders Kaseorg por um byte!
fonte
(f$f$f$n-1)
=f(f$f$n-1)
salva um byte.Geléia , 8 bytes
Experimente online! ou verifique os casos de teste menores .
Como funciona
fonte
Mathematica, 20 bytes
A contagem de bytes assume a codificação ISO 8859-1 (ou compatível) e
$CharacterEncoding
definida como um valor correspondente, como o padrão do WindowsWindowsANSI
.Isso define um operador unário
±
.fonte
PlusMinus
. Veja este post para detalhes.@
ou[ ]
também.J,
1412 bytesEconomizou 2 bytes graças a @ Leaky Nun .
Calcula o resultado chamando-se recursivamente quando n > 0 três vezes em n -1 e subtraindo esse resultado de n . Existe uma situação diferente para o caso base quando n = 0. Lá ele calcula n - n que é igual a 0.
Experimente aqui.
Explicação
fonte
Julia, 16 bytes
Experimente online!
Como funciona
Redefinimos o operador unário
!
para nossos propósitos.Se n = 0 , a comparação
n>0
retorna false e o mesmo acontece!
.Caso contrário, o código depois
&&
será executado.~-n
é equivalente a(n-1)
no complemento de dois,!!!
chama recursivamente!
três vezes em n - 1 e o valor resultante é subtraído de n .fonte
-!!~-
.!
é simplesmente o nome da função.Python, 31 bytes
Limites de recursão e restrições de tempo tornam a função acima impraticável, mas em teoria deve funcionar (e funciona para pequenos n).
fonte
JavaScript (ES6), 52 bytes
Eu poderia ter sido chato e escrito a versão recursiva, mas essa versão é muito mais rápida (é fácil lidar com o último caso de teste) e também usa,
reduce
então isso é uma vantagem!fonte
Retina ,
4943 bytesExperimente online!
fonte
CJam,
1312 bytesAgradecemos a Dennis por economizar 1 byte.
Teste aqui.
fonte
a
.R,
42bytesUso:
Essa abordagem recursiva não se adapta bem a valores maiores
n
.fonte
n<1
. Como é uma sequência, é realmente definido apenas para números inteiros não negativos de qualquer maneira.a=function(n)"if"(n,n-a(a(a(n-1))),0)
funcionará por vários bytes desativados.Oásis , 6 bytes
Código:
Versão expandida:
Código:
Experimente online!
fonte
Sesos ,
5855 bytesLida com entradas até 400 razoavelmente bem, mas o tempo de execução aumenta drasticamente após esse ponto.
Experimente online! Marque Debug para ver o código SBIN gerado.
Montagem Sesos
O arquivo binário acima foi gerado pela montagem do seguinte código SASM.
fonte
LISP, 61 bytes
Provavelmente não é a solução ideal, mas funciona.
fonte
Java 7, 42 bytes
Casos não testados e de teste:
Experimente aqui.
Resultado:
fonte
Ruby, 27 bytes
A implementação óbvia.
Essa é uma resposta mais longa e rápida que armazena em cache as entradas anteriores na sequência. Ambas as respostas funcionam apenas para versões posteriores a 1.9, como foi quando
->
o lambda stabby foi introduzido no Ruby.fonte
C #, 35 bytes
fonte
Golfscript,
2625 bytesExperimente online!
Localmente
10000
leva menos de meio segundo.fonte
C,
3532 bytesEconomizou 3 bytes graças a @PeterTaylor!
Experimente no Ideone!
fonte
a(n){return n?n-a(a(a(n-1))):0;}
:
no seu código. Você deve tirar o depois?
.Javascript ES6, 22 bytes
Vou ser chato e fazer a versão recursiva: P
fonte
VBA, 69 bytes
Funciona em um piscar de olhos no conjunto de testes, diminui um pouco acima de n = 1000000, colide com uma parede de memória um pouco acima de n = 25 milhões.
fonte
Pitão, 10 bytes
Define uma função
y
. Experimente online: DemonstraçãoIsso usa um novo recurso relativo do Pyth. Você pode aplicar uma função várias vezes usando a sintaxe da dobra. Na verdade, ele não salva bytes, usei-o apenas para fins de demonstração.
Explicação:
fonte
Bordo,
2826 bytesUso:
fonte
dc, 34 bytes
A entrada é retirada da parte superior da pilha. Esse deve ser o único item da pilha, porque a profundidade da pilha é usada como um contador. Exemplo de uso:
Esta é uma implementação bastante direta da definição de sequência:
De qualquer forma, tudo começou bem ... então o golfe aconteceu.
fonte
Lisp comum , 44 bytes
Experimente online!
fonte
C ++ (MSVC, principalmente)
Versão normal: 40 bytes
Versão da meta-programação do modelo: 130 bytes
Uso:
A versão do modelo é o código mais rápido, pois não há nada mais rápido do que mover um valor para um registrador => com otimização,
H<20>::a()
compile como:Para 10000, a versão recursiva falha devido a um erro de estouro de pilha e a versão do modelo falha no tempo de compilação devido à profundidade da instanciação do modelo. O GCC vai para 900 (614)
fonte
C
e{
na versão do modelo meta de programaçãoD , 36 bytes
Experimente online!
fonte
APL (Dyalog Unicode),
1817 bytesTry it online!
Surprisingly, there's no APL answer to this challenge. This is a literal implementation of the function in the OP.
TIO times out forn>90 .
Saved a byte thanks to @Zacharý.
fonte
{⍵=0:0⋄⍵-∇⍣3⊢⍵-1}
Python 3, 72 bytes
Ideone it!
fonte
PowerShell v2+, 56 bytes
The PowerShell equivalent of a lambda to form the recursive definition. Execute it via the
&
call operator, e.g.&$a(5)
. Takes a long time to execute -- even50
on my machine (a recent i5 with 8GB RAM) takes around 90 seconds.Faster iterative solution, 59 bytes
Longer only because we need to account for input
0
(that's the*!!$n
at the end). Otherwise we just iteratively construct the array up to$n
, adding a new element each time, and output the last one at the end$o[-1]
. Super-speedy -- calculating10000
on my machine takes about 5 seconds.fonte
><>, 55+2 = 57 bytes
The input is expected to be present on the stack at program start, so +2 bytes for the
-v
flag. Try it online!This is hecka slow, as it uses recursion to calculate the result. Using TIO,
h(50)
takes over a minute. It returns the correct results <= 30, so I'm confident it would work forh(10000)
, I just haven't run it to find out!fonte