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

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

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

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


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



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



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.


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.



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.


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.


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.


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

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.