Numéros de Narayana-Zidek-Capell

17

Générez le n ème nombre Narayana-Zidek-Capell avec une entrée n . Le moins d'octets gagne.

f (1) = 1, f (n) est la somme des termes Narayana-Zidek-Capell du plancher précédent (n / 2).

Cas de test:

f(1)=1

f(9)=42

f(14)=1308

f(15)=2605

f(23)=664299
Oliver Daugherty-Long
la source
12
Bienvenue sur Programmation Puzzles & Code Golf! C'est un joli premier défi. Bien que cela dépende de vous, nous vous recommandons généralement d'attendre au moins une semaine pour accepter une réponse. Avoir une réponse acceptée dès le début peut envoyer un signal aux autres utilisateurs que le défi est plus ou moins terminé, ce qui les décourage de participer.
Alex A.

Réponses:

6

Gelée, 11 10 octets

HĊrµṖ߀Sȯ1

Essayez-le en ligne!

Prend ncomme argument et imprime le résultat.

Explication

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
la source
7

Rubis, 34 32 octets

Celui-ci utilise une formule de la page OEIS pour les nombres Narayana-Zidek-Cappell .

Edit: débarrassé des parenthèses en utilisant la priorité de l'opérateur grâce à feersum et Neil.

f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}
Sherlock9
la source
Vous n'avez sûrement pas besoin de parenthèses x%2?
feersum
Enfin, pas si tu mets x%2*au moins.
Neil
@feersum et Neil Merci à vous deux
Sherlock9
Les modifications apportées aux questions précédentes suggéraient que la formule était x<2?... cela rend les choses beaucoup plus claires merci!
Neil
6

Python 2, 48 42 38 36 octets

Algorithme tiré de la page OEIS. n<3peut être remplacé n<4par sans effet. Renvoie le nnuméro e, où nest un entier positif.

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

Essayez-le en ligne

mbomb007
la source
5

05AB1E, 16 octets

Une solution itérative comme 05AB1E n'a pas de fonctions.

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

Essayez-le en ligne

Emigna
la source
5

C, 38

Une traduction de l'algorithme OEIS. Il n'y a tout simplement pas assez de code C ici!

f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}
owacoder
la source
Comment ça n<3?:(...)marche?
LegionMammal978
2
C'est une extension GCC (qui semble également fonctionner en clang) qui évalue le conditionnel lui-même si l'expression du milieu est manquante. Voir la page GCC pertinente et cette question SO pour plus de détails.
owacoder
4

Python 3, 67 octets

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

Une fonction qui prend l'entrée via un argument et imprime dans STDOUT. Il s'agit d'une mise en œuvre directe de la définition.

Comment ça fonctionne

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

Essayez-le sur Ideone

TheBikingViking
la source
3

Mathematica, 38 octets

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

Fonction anonyme. Prend 𝑛 en entrée et renvoie 𝑓 (𝑛) en sortie. Basé sur la solution Ruby.

LegionMammal978
la source
Il n'y a pas intégré?
Insane
@Insane Non, il n'y a pas de fonction intégrée.
LegionMammal978
Simplement extraordinaire!
Insane
2

Haskell, 34 octets

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

Exemple d'utilisation: f 14-> 1308.

Une mise en œuvre directe de la définition.

nimi
la source
2

Java, 63 octets

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

Aller, 63 octets

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

À peu près un port direct de la réponse C

Sefa
la source
0

PHP, 81 octets

Il s'agit d'un programme complet sans récursivité. Une fonction récursive peut être définie en 52 octets (il pourrait être possible de battre cela), mais ce n'est qu'un port assez ennuyeux de la réponse de sherlock9 (et cela génère des erreurs si vous demandez f (100) ou plus), donc je mets en place cette version plus longue et plus intéressante

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

Provoque de nombreuses notifications (O [n]) mais c'est très bien.

user55641
la source
O(n)des avis? Hein?
cat
les notifications sont un type d'erreur non critique qui n'arrête pas l'exécution et sont généralement réduites au silence dans les environnements de production. chaque fois que vous essayez d'obtenir la valeur d'une variable non déclarée ou d'un décalage non défini dans un tableau, vous recevez un avis. Ce programme essaie d'obtenir la valeur de O [n] décalages non définis (et quelques variables non déclarées également) afin que vous obteniez des avis O [n].
user55641
0

R, 55 octets

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

Changez 10dans la forboucle et x[9]obtenez l'index souhaité par l'utilisateur.

TrempageHummer
la source
Voici une version récursive de 54 octets: 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)))

Basé sur la réponse C.

  • Enregistré 2 octets en utilisant parseIntau lieu deMath.floor
user2428118
la source
0

Érable, 46 44 octets

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

Usage:

> 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
la source
0

R, 63 octets

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

a=0est ajouté par défaut car il me fait économiser deux accolades. La fonction s'appelle récursivement au besoin.

user5957401
la source