Liczby Narayana-Zidek-Capell

17

Wygeneruj n- ty numer Narayana-Zidek-Capell, podając n . Wygrywa najmniej bajtów.

f (1) = 1, f (n) jest sumą warunków poprzedniego piętra (n / 2) Narayana-Zidek-Capell.

Przypadki testowe:

f(1)=1

f(9)=42

f(14)=1308

f(15)=2605

f(23)=664299
Oliver Daugherty-Long
źródło
12
Witamy w Programowaniu Puzzle i Code Golf! To miłe pierwsze wyzwanie. Chociaż to ostatecznie zależy od Ciebie, zazwyczaj zalecamy odczekać przynajmniej tydzień, aby zaakceptować odpowiedź. Otrzymanie wcześnie zaakceptowanej odpowiedzi może wysłać sygnał do innych użytkowników, że wyzwanie już się skończyło, co zniechęca ich do uczestnictwa.
Alex A.,

Odpowiedzi:

6

Galaretka, 11 10 bajtów

HĊrµṖ߀Sȯ1

Wypróbuj online!

Bierze njako argument i wypisuje wynik.

Wyjaśnienie

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
źródło
7

Rubinowy, 34 32 bajty

Wykorzystuje to wzór ze strony OEIS dla liczb Narayana-Zidek-Cappell .

Edycja: Pozbyłem się nawiasów, stosując pierwszeństwo operatora dzięki feersum i Neilowi.

f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}
Sherlock9
źródło
Na pewno nie potrzebujesz nawiasów x%2?
feersum
Cóż, nie, jeśli x%2*przynajmniej umieścisz .
Neil,
@feersum i Neil Dziękuję wam obojgu
Sherlock9
Poprzednie edycje pytań sugerowały, że formuła była x<2?... dzięki czemu jest o wiele jaśniejsza dzięki!
Neil,
6

Python 2, 48 42 38 36 bajtów

Algorytm pobrany ze strony OEIS. n<3można zmienić na n<4bez efektu. Zwraca nliczbę th, gdzie njest dodatnią liczbą całkowitą.

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

Wypróbuj online

mbomb007
źródło
5

05AB1E, 16 bajtów

Iteracyjne rozwiązanie, ponieważ 05AB1E nie ma funkcji.

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

Wypróbuj online

Emigna
źródło
5

C, 38

Tłumaczenie algorytmu OEIS. Tutaj jest po prostu za mało kodu C.

f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}
owacoder
źródło
Jak n<3?:(...)działa
LegionMammal978
2
Jest to rozszerzenie GCC (wydaje się, że działa również w clang), które ocenia samo warunkowe, jeśli brakuje środkowego wyrażenia. Zobacz odpowiednią stronę GCC i to pytanie SO, aby uzyskać więcej informacji.
owacoder,
4

Python 3, 67 bajtów

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

Funkcja, która pobiera dane wejściowe poprzez argument i wypisuje do STDOUT. Jest to bezpośrednie wdrożenie definicji.

Jak to działa

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

Wypróbuj na Ideone

TheBikingViking
źródło
3

Mathematica, 38 bajtów

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

Funkcja anonimowa. Pobiera 𝑛 jako dane wejściowe i zwraca 𝑓 (𝑛) jako dane wyjściowe. Oparty na rozwiązaniu Ruby.

LegionMammal978
źródło
Nie ma wbudowanego?
Szalony
@Insane Nie, nie ma wbudowanego.
LegionMammal978
Po prostu wspaniałe!
Szalony
2

Haskell, 34 bajty

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

Przykład użycia: f 14-> 1308.

Bezpośrednie wdrożenie definicji.

nimi
źródło
2

Java, 63 bajtów

int z(int n){return n<3?1:n%2>0?(2*z(n-1)-z(n/2)):(2*z(n-1));}
użytkownik902383
źródło
1

Idź, 63 bajty

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

Prawie bezpośredni port od odpowiedzi C.

Sefa
źródło
0

PHP, 81 bajtów

Jest to pełny program bez rekurencji. Funkcję rekurencyjną można zdefiniować w 52 bajtach (być może można to pokonać), ale to po prostu dość nudny port odpowiedzi sherlock9 (i błąd, jeśli poprosisz o f (100) lub więcej), więc umieszczam to dłuższa i bardziej interesująca wersja

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

Powoduje wiele (O [n]) powiadomień, ale to w porządku.

użytkownik55641
źródło
O(n)uwagi? Co?
kot
powiadomienia to niekrytyczne typy błędów, które nie przerywają wykonywania i są zwykle wyciszane w środowiskach produkcyjnych. za każdym razem, gdy próbujesz uzyskać wartość niezadeklarowanej zmiennej lub niezdefiniowanego przesunięcia w tablicy, dostajesz powiadomienie. Ten program próbuje uzyskać wartość nieokreślonych przesunięć O [n] (oraz kilka niezadeklarowanych zmiennych), aby uzyskać powiadomienia O [n].
user55641,
0

R, 55 bajtów

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

Zmiana 10w forpętli i x[9]dostać cokolwiek indeksu użytkownik chce.

SoakingHummer
źródło
Oto wersja rekurencyjna o długości 54 bajtów: 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)))

Na podstawie odpowiedzi C.

  • Zapisano 2 bajty, używając parseIntzamiastMath.floor
użytkownik2428118
źródło
0

Klon, 46 44 bajtów

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

Stosowanie:

> 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
źródło
0

R, 63 bajty

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

a=0jest dodawany domyślnie, ponieważ oszczędza mi dwa nawiasy klamrowe. Funkcja rekurencyjnie wywołuje się w razie potrzeby.

użytkownik5957401
źródło