Números Narayana-Zidek-Capell

17

Gerar o n th Narayana-Zidek-Capell número dado uma entrada n . Menos bytes vencidos.

f (1) = 1, f (n) é a soma dos termos do piso anterior (n / 2) Narayana-Zidek-Capell.

Casos de teste:

f(1)=1

f(9)=42

f(14)=1308

f(15)=2605

f(23)=664299
Oliver Daugherty-Long
fonte
12
Bem-vindo à programação de quebra-cabeças e código de golfe! Este é um bom primeiro desafio. Embora seja você quem decide, geralmente recomendamos aguardar pelo menos uma semana para aceitar uma resposta. Ter uma resposta aceita no início pode enviar um sinal para outros usuários de que o desafio terminou mais ou menos, o que os desencoraja de participar.
11286 Alex A.

Respostas:

6

Geléia, 11 10 bytes

HĊrµṖ߀Sȯ1

Experimente online!

Toma ncomo argumento e imprime o resultado.

Explicação

H              divide input by 2
 Ċ             round up to get first n to recurse
  r            inclusive range from that to n
   µ           (chain separator)
    Ṗ          remove n itself from the range
     ߀        call self recursively on each value in the range
       S       sum results
        ȯ1     if sum was zero, return one
PurkkaKoodari
fonte
7

Ruby, 34 32 bytes

Isso usa uma fórmula da página OEIS para os números Narayana-Zidek-Cappell .

Edit: Livre-se dos parênteses usando a precedência do operador, graças a feersum e Neil.

f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}
Sherlock9
fonte
Certamente você não precisa de parênteses x%2?
feersum
Bem, não se você colocar x%2* pelo menos.
Neil
@feersum e Neil Obrigado a ambos
Sherlock9
As edições anteriores da pergunta sugeriram que a fórmula era x<2?... isso torna muito mais claro, obrigado!
Neil
6

Python 2, 48 42 38 36 bytes

Algoritmo retirado da página OEIS. n<3pode ser alterado para n<4sem efeito. Retorna o nnúmero th, onde né um número inteiro positivo.

a=lambda n:n<3or 2*a(n-1)-n%2*a(n/2)

Experimente online

mbomb007
fonte
5

05AB1E, 16 bytes

Uma solução iterativa como 05AB1E não possui funções.

X¸sGDN>;ï£Os‚˜}¬

X¸               # initialize a list with 1
  sG          }  # input-1 number of times do
    D            # duplicate current list
     N>;ï£       # take n/2 elements from the list
          O      # sum those elements
           s‚˜   # add at the start of the list
               ¬ # get the first element and implicitly print

Experimente online

Emigna
fonte
5

C, 38

Uma tradução do algoritmo OEIS. Simplesmente não há código C suficiente por aqui!

f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}
owacoder
fonte
Como n<3?:(...)funciona?
LegionMammal978
2
É uma extensão do GCC (parece funcionar também em clang) que avalia como condicional se a expressão do meio está ausente. Veja a página relevante do GCC e esta questão SO para obter mais detalhes.
Owacoder
4

Python 3, 67 bytes

def f(n):
 x=1,
 for i in range(n):x+=sum(x[-i//2:]),
 print(x[-1])

Uma função que recebe entrada por meio de argumento e imprime em STDOUT. Esta é uma implementação direta da definição.

Como funciona

def f(n):               Function with input target term index n
 x=1,                   Initialise term list x as tuple (1)
 for i in range(n):...  For all term indices in [0,n-1]...
 x[-i//2:]              ..yield the previous floor(i/2) terms...
 x+=sum(...)            ...and append their sum to x
 print(x[-1])           Print the last term in x, which is the nth term

Experimente no Ideone

TheBikingViking
fonte
3

Mathematica, 38 bytes

If[#<4,1,2#0[#-1]-#~Mod~2#0[(#-1)/2]]&

Função anônima. Toma 𝑛 como entrada e retorna 𝑓 (𝑛) como saída. Baseado na solução Ruby.

LegionMammal978
fonte
Não tem embutido?
Insano
@ Insane Não, não há embutido.
LegionMammal978
Simplesmente incrível!
Insane
2

Haskell, 34 bytes

f 1=1
f n=sum$f<$>[n-div n 2..n-1]

Exemplo de uso: f 14-> 1308.

Uma implementação direta da definição.

nimi
fonte
2

Java, 63 bytes

int z(int n){return n<3?1:n%2>0?(2*z(n-1)-z(n/2)):(2*z(n-1));}
user902383
fonte
1

Go, 63 bytes

func f(i int) int{if(i<4){return 1};return 2*f(i-1)-i%2*f(i/2)}

Praticamente uma porta direta da resposta C

Sefa
fonte
0

PHP, 81 bytes

Este é um programa completo sem recursão. Uma função recursiva pode ser definida em 52 bytes (pode ser possível superar isso), mas essa é apenas uma porta bastante entediante da resposta de sherlock9 (e ela falha se você pedir f (100) ou mais), então estou colocando isso versão mais longa e mais interessante

<?php for($i=$argv[1];$j=$i;$i--)for(;--$j*2>=$i;)$a[$j]+=$a[$i]?:1;echo$a[1]?:1;

Causa muitos (O [n]) avisos, mas tudo bem.

user55641
fonte
O(n)avisos? Hã?
gato
avisos são um tipo de erro não crítico que não interrompe a execução e geralmente são silenciados em ambientes de produção. sempre que você tenta obter o valor de uma variável não declarada ou um deslocamento indefinido em uma matriz, você recebe um aviso. Este programa tenta obter o valor de O [n] deslocamentos indefinidos (e algumas variáveis ​​não declaradas também) para que você receba avisos de O [n].
user55641
0

R, 55 bytes

x[1]=1;for(i in 2:10){x[i]=sum(x[i-1:floor(i/2)])};x[9]

Altere 10o forloop e x[9]obtenha o índice que o usuário desejar.

ImersãoHummer
fonte
Aqui está uma versão recursiva que é 54 bytes de comprimento: f=function(n)ifelse(n<4,1,2*f(n-1)-n%%2*f(floor(n/2)))
DSkoog
0

JavaScript, 54 52

f=n=>Math.round(n<3?1:2*f(n-1)-n%2*f(parseInt(n/2)))

Com base na resposta C.

  • 2 bytes salvos usando em parseIntvez deMath.floor
user2428118
fonte
0

Bordo, 46 44 bytes

`if`(n<4,1,2*f(n-1)-(n mod 2)*f(floor(n/2)))

Uso:

> f:=n->`if`(n<4,1,2*f(n-1)-(n mod 2)*f(floor(n/2)));
> seq( f(i), i = 1..10 );
  1, 1, 1, 2, 3, 6, 11, 22, 42, 84
DSkoog
fonte
0

R, 63 bytes

f=function(n,a=0)if(n<2)1 else{for(i in n-1:(n%/%2))a=a+f(i);a}

a=0é adicionado como padrão porque me salva dois colchetes. A função chama-se recursivamente conforme necessário.

user5957401
fonte