Nomor Narayana-Zidek-Capell

17

Menghasilkan n th Narayana-Zidek-Capell jumlah diberi masukan n . Bytes paling sedikit menang.

f (1) = 1, f (n) adalah jumlah dari lantai sebelumnya (n / 2) istilah Narayana-Zidek-Capell.

Kasus uji:

f(1)=1

f(9)=42

f(14)=1308

f(15)=2605

f(23)=664299
Oliver Daugherty-Long
sumber
12
Selamat Datang di Programming Puzzles & Code Golf! Ini adalah tantangan pertama yang bagus. Meskipun pada akhirnya terserah Anda, biasanya kami sarankan menunggu setidaknya seminggu untuk menerima jawaban. Memiliki jawaban yang diterima sejak dini dapat mengirim sinyal kepada pengguna lain bahwa tantangannya lebih atau kurang, yang membuat mereka enggan berpartisipasi.
Alex A.

Jawaban:

6

Jelly, 11 10 byte

HĊrµṖ߀Sȯ1

Cobalah online!

Dibawa nsebagai argumen dan mencetak hasilnya.

Penjelasan

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
sumber
7

Ruby, 34 32 byte

Ini menggunakan rumus dari halaman OEIS untuk nomor Narayana-Zidek-Cappell .

Sunting: Singkirkan tanda kurung menggunakan prioritas operator dengan terima kasih kepada feersum dan Neil.

f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}
Sherlock9
sumber
Tentunya Anda tidak membutuhkan tanda kurung x%2?
feersum
Ya, tidak jika Anda x%2*setidaknya menaruh .
Neil
@feersum dan Neil Terima kasih keduanya
Sherlock9
Suntingan pertanyaan sebelumnya menyarankan bahwa rumusnya adalah x<2?... ini membuatnya lebih jelas, terima kasih!
Neil
6

Python 2, 48 42 38 36 byte

Algoritma diambil dari halaman OEIS. n<3dapat diubah menjadi n<4tanpa efek. Mengembalikan angka nth, di mana nbilangan bulat positif.

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

Cobalah online

mbomb007
sumber
5

05AB1E, 16 byte

Solusi berulang karena 05AB1E tidak memiliki fungsi.

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

Cobalah online

Emigna
sumber
5

C, 38

Terjemahan dari algoritma OEIS. Tidak ada cukup kode C di sekitar sini!

f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}
owacoder
sumber
Bagaimana cara n<3?:(...)kerjanya?
LegionMammal978
2
Ini adalah ekstensi GCC (tampaknya bekerja di dentang juga) yang mengevaluasi ke kondisi itu sendiri jika ekspresi tengah hilang. Lihat halaman GCC yang relevan dan pertanyaan SO ini untuk lebih jelasnya.
owacoder
4

Python 3, 67 byte

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

Fungsi yang mengambil input melalui argumen dan mencetak ke STDOUT. Ini adalah implementasi langsung dari definisi tersebut.

Bagaimana itu bekerja

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

Cobalah di Ideone

TheBikingViking
sumber
3

Mathematica, 38 byte

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

Fungsi anonim. Mengambil 𝑛 sebagai input dan mengembalikan 𝑓 (𝑛) sebagai output. Didasarkan pada solusi Ruby.

LegionMammal978
sumber
Tidak ada bawaan?
Gila
@Insane Tidak, tidak ada built-in.
LegionMammal978
Sangat menakjubkan!
Gila
2

Haskell, 34 byte

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

Contoh penggunaan: f 14-> 1308.

Implementasi langsung dari definisi.

nimi
sumber
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));}
pengguna902383
sumber
1

Pergi, 63 byte

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

Cukup banyak port langsung dari jawaban C.

Sefa
sumber
0

PHP, 81 byte

Ini adalah program lengkap tanpa rekursi. Fungsi rekursif dapat didefinisikan dalam 52 byte (mungkin bisa mengalahkan itu) tapi itu hanya port yang cukup membosankan dari jawaban sherlock9 (dan kesalahan jika Anda meminta f (100) atau lebih) jadi saya memasang ini versi yang lebih panjang dan lebih menarik

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

Menyebabkan banyak (O [n]) pemberitahuan tetapi tidak apa-apa.

pengguna55641
sumber
O(n)pemberitahuan? Hah?
kucing
pemberitahuan adalah tipe kesalahan tidak kritis yang tidak menghentikan eksekusi dan biasanya dibungkam di lingkungan produksi. setiap kali Anda mencoba untuk mendapatkan nilai dari variabel yang tidak dideklarasikan atau offset yang tidak ditentukan dalam array, Anda akan mendapat pemberitahuan. Program ini mencoba untuk mendapatkan nilai offset yang tidak ditentukan O [n] (dan juga beberapa variabel yang tidak dideklarasikan) sehingga Anda mendapatkan pemberitahuan O [n].
user55641
0

R, 55 byte

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

Perubahan 10dalam forlingkaran dan x[9]untuk mendapatkan mana indeks pengguna ingin.

SoakingHummer
sumber
Berikut ini adalah versi rekursif yang panjangnya 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)))

Berdasarkan jawaban C.

  • Disimpan 2 byte dengan menggunakan parseIntbukanMath.floor
pengguna2428118
sumber
0

Maple, 46 44 byte

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

Pemakaian:

> 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
sumber
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=0ditambahkan sebagai default karena itu menyelamatkan saya dua kurung keriting. Fungsi secara rekursif menyebut dirinya sesuai kebutuhan.

pengguna5957401
sumber