Số Narayana-Zidek-Capell


17

Tạo n th Narayana-Zidek-Capell số lượng nhất định một đầu vào n . Ít byte nhất giành chiến thắng.

f (1) = 1, f (n) là tổng của tầng trước (n / 2) thuật ngữ Narayana-Zidek-Capell.

Các trường hợp thử nghiệm:

f(1)=1

f(9)=42

f(14)=1308

f(15)=2605

f(23)=664299

12
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Đây là một thử thách đầu tiên tốt đẹp. Mặc dù điều đó cuối cùng tùy thuộc vào bạn, thông thường chúng tôi khuyên bạn nên đợi ít nhất một tuần để chấp nhận câu trả lời. Có câu trả lời sớm được chấp nhận có thể gửi tín hiệu cho những người dùng khác rằng thử thách ít nhiều đã kết thúc, điều này khiến họ không tham gia.
Alex A.

Câu trả lời:


6

Thạch, 11 10 byte

HĊrµṖ߀Sȯ1

Hãy thử trực tuyến!

Lấy nlàm đối số và in kết quả.

Giải trình

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

Ruby, 34 32 byte

Điều này sử dụng một công thức từ trang OEIS cho các số Narayana-Zidek-Cappell .

Chỉnh sửa: Loại bỏ dấu ngoặc đơn bằng cách sử dụng quyền ưu tiên của toán tử với lời cảm ơn đến frageum và Neil.

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

Chắc chắn bạn không cần dấu ngoặc đơn cho x%2?
frageum

Vâng, không nếu bạn đặt x%2*ít nhất.
Neil

@feersum và Neil Cảm ơn cả hai
Sherlock9

Các chỉnh sửa câu hỏi trước đây cho thấy công thức là x<2?... điều này làm cho nó rõ ràng hơn nhiều cảm ơn!
Neil

6

Python 2, 48 42 38 36 byte

Thuật toán lấy từ trang OEIS. n<3có thể được thay đổi thành n<4không có hiệu lực. Trả về nsố thứ, trong đó nlà một số nguyên dương.

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

Dùng thử trực tuyến


5

05AB1E, 16 byte

Một giải pháp lặp như 05AB1E không có chức năng.

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

Dùng thử trực tuyến


5

C, 38

Một bản dịch của thuật toán OEIS. Không có đủ mã C ở đây!

f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}

Làm thế nào để n<3?:(...)làm việc?
LegionMammal978

2
Đó là một phần mở rộng GCC (dường như cũng hoạt động trong tiếng kêu) để đánh giá chính điều kiện nếu biểu thức ở giữa bị thiếu. Xem trang GCC có liên quancâu hỏi SO này để biết thêm chi tiết.
owacoder

4

Python 3, 67 byte

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

Một hàm nhận đầu vào thông qua đối số và in ra STDOUT. Đây là một thực hiện trực tiếp của định nghĩa.

Làm thế nào nó hoạt động

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

Hãy thử nó trên Ideone



3

Toán học, 38 byte

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

Chức năng ẩn danh. Lấy làm đầu vào và trả về () làm đầu ra. Dựa trên giải pháp Ruby.


Không có xây dựng trong?
Mất trí

@Insane Không, không có tích hợp.
LegionMammal978

Đơn giản là tuyệt vời!
Mất trí

2

Haskell, 34 byte

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

Ví dụ sử dụng: f 14-> 1308.

Một thực hiện trực tiếp của định nghĩa.



1

Đi, 63 byte

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

Khá nhiều cổng trực tiếp từ câu trả lời C


0

PHP, 81 byte

Đây là một chương trình đầy đủ mà không cần đệ quy. Hàm đệ quy có thể được xác định bằng 52 byte (có thể đánh bại được điều đó) nhưng đó chỉ là một cổng khá nhàm chán trong câu trả lời của sherlock9 (và nó bị lỗi nếu bạn yêu cầu f (100) trở lên) vì vậy tôi đưa ra điều này phiên bản dài hơn và thú vị hơn

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

Gây ra nhiều thông báo (O [n]) nhưng không sao.


O(n)thông báo? Huh?
con mèo

thông báo là một loại lỗi không nghiêm trọng không dừng thực thi và thường bị tắt tiếng trong môi trường sản xuất. Bất cứ khi nào bạn cố gắng để có được giá trị của một biến không được khai báo hoặc một phần bù không xác định trong một mảng, bạn sẽ nhận được một thông báo. Chương trình này cố gắng lấy giá trị của các giá trị không xác định O [n] (và một vài biến không được khai báo) để bạn nhận được thông báo O [n].
dùng55641

0

R, 55 byte

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

Thay đổi 10trong forvòng lặp và x[9]để có được chỉ số nào người dùng muốn.


Đây là phiên bản đệ quy dài 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)))

Dựa vào câu trả lời C.

  • Đã lưu 2 byte bằng cách sử dụng parseIntthay vìMath.floor

0

Maple, 46 44 byte

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

Sử dụng:

> 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=0được thêm vào như một mặc định vì nó tiết kiệm cho tôi hai dấu ngoặc nhọn. Chức năng gọi đệ quy chính nó khi cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.