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

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

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]}

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


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



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



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.


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.


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));}

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


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.


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.


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

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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.