Numeri di Narayana-Zidek-Capell


17

Generare il n ° Narayana-Zidek-Capell numero dato un input n . Vincono meno byte.

f (1) = 1, f (n) è la somma dei termini Narayana-Zidek-Capell del piano precedente (n / 2).

Casi test:

f(1)=1

f(9)=42

f(14)=1308

f(15)=2605

f(23)=664299

12
Benvenuto in Programmazione di puzzle e codice golf! Questa è una bella prima sfida. Anche se alla fine dipende da te, in genere ti consigliamo di attendere almeno una settimana per accettare una risposta. Avere una risposta accettata in anticipo può inviare un segnale ad altri utenti che la sfida è più o meno finita, il che li scoraggia dalla partecipazione.
Alex A.

Risposte:


6

Gelatina, 11 10 byte

HĊrµṖ߀Sȯ1

Provalo online!

Prende ncome argomento e stampa il risultato.

Spiegazione

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

Rubino, 34 32 byte

Questo utilizza una formula dalla pagina OEIS per i numeri Narayana-Zidek-Cappell .

Modifica: Elimina le parentesi usando la precedenza dell'operatore grazie a Feersum e Neil.

f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}

Sicuramente non hai bisogno di parentesi per x%2?
febbraio

Beh, non se lo metti x%2*almeno.
Neil,

@feersum e Neil Grazie ad entrambi
Sherlock9,

Le modifiche alla domanda precedente suggerivano che la formula era x<2?... questo lo rende molto più chiaro grazie!
Neil,

6

Python 2, 48 42 38 36 byte

Algoritmo tratto dalla pagina OEIS. n<3può essere modificato in n<4senza effetto. Restituisce il nnumero th, dove nè un numero intero positivo.

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

Provalo online


5

05AB1E, 16 byte

Una soluzione iterativa come 05AB1E non ha funzioni.

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

Provalo online



4

Python 3, 67 byte

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

Una funzione che accetta input tramite argomento e stampa su STDOUT. Questa è un'implementazione diretta della definizione.

Come funziona

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

Provalo su Ideone



3

Mathematica, 38 byte

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

Funzione anonima. Prende 𝑛 come input e restituisce 𝑓 (𝑛) come output. Basato sulla soluzione Ruby.


Non è integrato?
Insane,

@Insane No, non è integrato.
LegionMammal978,

Semplicemente stupefacente!
Insane,

2

Haskell, 34 byte

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

Esempio di utilizzo: f 14-> 1308.

Un'attuazione diretta della definizione.


2

Java, 63 byte

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

1

Vai, 63 byte

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

Praticamente una porta diretta dalla risposta C.


0

PHP, 81 byte

Questo è un programma completo senza ricorsione. Una funzione ricorsiva può essere definita in 52 byte (potrebbe essere possibile batterlo) ma è solo una porta piuttosto noiosa della risposta di sherlock9 (ed errori se chiedi f (100) o più) quindi sto mettendo questo versione più lunga e più interessante

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

Provoca molte (O [n]) notifiche ma va bene.


O(n)avvisi? Eh?
cat

le notifiche sono un tipo di errore non critico che non interrompe l'esecuzione e sono comunemente messe a tacere negli ambienti di produzione. ogni volta che si tenta di ottenere il valore di una variabile non dichiarata o di un offset indefinito in un array, viene visualizzato un avviso. Questo programma cerca di ottenere il valore di O [n] offset indefiniti (e anche un paio di variabili non dichiarate) in modo da ottenere O [n] avvisi.
user55641

0

R, 55 byte

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

Cambia 10nel forciclo e x[9]per ottenere qualunque indice l'utente desideri.


Ecco una versione ricorsiva lunga 54 byte: 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)))

Basato sulla risposta C.

  • Salvato 2 byte utilizzando parseIntinvece diMath.floor

0

Acero, 46 44 byte

`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 byte

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

a=0viene aggiunto come predefinito perché mi salva due parentesi graffe. La funzione si chiama ricorsivamente se necessario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.