Tính hệ số nguyên tử


11

Lý lịch

Chuỗi Fibonacci được định nghĩa là

f(1) = 1
f(2) = 1
f(n) = f(n-1) + f(n-2)

Fibonorial, tương tự như giai thừa, là sản phẩm của n số Fibonacci đầu tiên .

g(n) = f(1) * f(2) * ... * f(n-1) * f(n)

Hệ số Fibonomial, tương tự như hệ số nhị thức được định nghĩa là

a(n, 0) = 1
a(n, k) = g(n) / ( g(n-k) * g(k) )
        = f(n) * f(n-1) * ... * f(n-k+1) / ( f(1) * f(2) * ... * f(k) )

Bài tập

Mục tiêu của bạn là tạo ra một hàm hoặc chương trình để tính hệ số Fibonomial cho hai số nguyên không âm nk với kn .

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

a(0, 0) = 1
a(1, 1) = 1
a(2, 0) = 1
a(3, 2) = 2
a(8, 3) = 1092
a(11, 5) = 1514513
a(22, 7) = 7158243695757340957617
a(25, 3) = 49845401197200
a(50, 2) = 97905340104793732225
a(100, 1) = 354224848179261915075

Quy tắc

  • Đây là nên mã ngắn nhất sẽ thắng.
  • Nội tích được cho phép.

Liên quan


Nếu cần, đây là một trang web liệt kê các 1335giá trị đầu tiên trong chuỗi Hệ số Fibonomial.
R. Kap

a(50, 2)trường hợp thử nghiệm thiếu một hàng đầu 9?
Joe

@SirBidenXVII Ồ vâng, bạn nói đúng, tôi đã bỏ lỡ một chữ số.
dặm

Câu trả lời:


1

Thạch , 16 byte

0+⁸С1ḊP
;_/Ç€:/

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

Tín dụng cho Dennis cho liên kết người trợ giúp Fib-orial.

;_/Ç€:/     Main chain,  argument: [n,r]
 _/         Find n-r
;           Attach it to original: [n,r,n-r]
   ǀ       Apply helper link to each element, yielding [g(n),g(r),g(n-r)]
     :/     Reduce by integer division, yielding g(n)//g(r)//g(n-r)

0+⁸С1ḊP    Helper link, argument: n
0+⁸С1ḊP    Somehow return the n-th Fibonacci-orial.

4

Haskell, 46 byte

l=0:scanl(+)1l;a%0=1;a%b=(a-1)%(b-1)*l!!a/l!!b

Đầu ra nổi. Tạo danh sách Fibonacci vô hạn. Sau đó, thực hiện phép ẩn nhị thức, nhân và chia cho các phần tử từ danh sách Fibonacci.


4

Python 67 byte

f=lambda n,a=1,b=1:n<1or a*f(n-1,b,a+b)
lambda n,k:f(n)/f(k)/f(n-k)

Gọi bằng cách sử dụng a(n,k). Sử dụng câu trả lời của sợi quang @Dennis (có được phép không?) Và thực hiện đơn giản câu hỏi khác.


Tất cả nội dung người dùng được cấp phép theo CC-BY-SA, miễn là bạn cung cấp phân bổ, bạn có thể sử dụng lại mã từ các câu trả lời khác. Bạn có thể rút ngắn lambda thứ hai của bạn xuống lambda n,k:f(n)/f(k)/f(n-k); đặt tên nó là không cần thiết.
Dennis

3

Haskell, 77 57 55 52 50 byte

Dòng đầu tiên ban đầu đến từ hàm Fibonacci hoặc thử thách chuỗi và được viết bởi @Anon.

Dòng thứ hai đã được thêm vào trong thử thách Fib-orial của @ChristianSievers.

Bây giờ tôi đã thêm dòng thứ ba. Những thách thức đó sẽ đi xa hơn bao nhiêu? =)

f=1:scanl(+)1f
g=(scanl(*)1f!!)
n#k=g n/g(n-k)/g k

Cảm ơn vì 5 byte @xnor!


Bạn có thể làm /hơn là div?
xnor

Hừ, nhưng điều đó sẽ kết thúc bằng số dấu phẩy động.
flawr

Ồ, điều đó thực sự không được phép, cảm ơn =)
flawr

Bạn có thể chia hai lần để tránh parens.
xnor

1
Bây giờ chúng ta đã có thứ này, điều tiếp theo có thể là sự biến đổi về cấu trúc sợi ;-)
Christian Sievers

3

C, 206 byte:

#include <inttypes.h>
uint64_t F(x){return x<1 ? 0:x==1 ? 1:F(x-1)+F(x-2);}uint64_t G(H,B){uint64_t P=1;for(B=3;B<=H;B++)P*=F(B);return P;}main(U,Y){scanf("%d %d",&U,&Y);printf("%llu\n",G(U)/(G(U-Y)*G(Y)));}

Khi thực hiện, yêu cầu 2 số nguyên được phân tách bằng dấu cách làm đầu vào. Bộ #includetiền xử lý được yêu cầu , vì không có nó, uint_64không phải là loại hợp lệ và cách duy nhất khác để làm cho công việc này cho đầu ra khá lớn là sử dụng unsigned long longloại trả về cho cả hai hàm F(Fibonacci) và G(Fibonorial), dài hơn nhiều so với chỉ bao gồm <inttypes.h>và sử dụng 3 uint64_tkhai báo loại. Tuy nhiên, ngay cả với điều đó, nó dừng hoạt động chính xác ở các giá trị đầu vào 14 1(được xác nhận bằng cách sử dụng giá trị này , liệt kê các 1325giá trị đầu tiên trong chuỗi Hệ số Fibonomial), rất có thể là do biểu diễn số Fibonacci và / hoặc Fibnorial của các số 15và ở trên tràn 64 bit loại số nguyên được sử dụng.

C Nó trực tuyến! (Ý)


Có lẽ kể từ khi Fibonorial 15 trànuint_64
dặm

3

Cheddar , 75 64 byte

a->b->(g->g((a-b+1)|>a)/g(1|>b))(n->n.map(Math.fib).reduce((*)))

Sử dụng

cheddar> var f = a->b->(g->g((a-b+1)|>a)/g(1|>b))(n->n.map(Math.fib).reduce((*)))
cheddar> f(11)(5)
1514513

2

MATL , 25 23 byte

1ti2-:"yy+]vtPi:)w5M)/p

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

Giải trình

1t      % Push 1 twice
i2-:    % Take input n. Generate vector [1 2 ... n-2]
"       % Repeat n-2 times
  yy    %   Push the top two elements again
  +     %   Add them
]       % End
v       % Concatenate into column vector of first n Fibonacci numbers
tP      % Duplicate and reverse
i:      % Take input k. Generate vector [1 2 ... k]
)       % Apply index to get last k Fibonacci numbers
w       % Swap to move vector of first n Fibonacci numbers to top
5M      % Push [1 2 ... k] again
)       % Apply index to get first k Fibonacci numbers
/       % Divide element-wise
p       % Product of vector. Implicitly display

2

R, 120 byte

Một số golf nữa có lẽ là có thể, vì vậy tất nhiên các ý kiến ​​được hoan nghênh!
Tôi đã sử dụng câu trả lời của mình cho câu hỏi về Fib-orial trong phần đầu của mã:

A=function(n,k){p=(1+sqrt(5))/2;f=function(N){x=1;for(n in 1:N){x=prod(x,(p^n-(-1/p)^n)/sqrt(5))};x};f(n)/(f(k)*f(n-k))}

Ung dung:

A=function(n,k){
p=(1+sqrt(5))/2
    f=function(N){
        x=1
        for(n in 1:N){
           x=prod(x,(p^n-(-1/p)^n)/sqrt(5))
                     }
        x
        }

f(n)/(f(k)*f(n-k))
}

2

Java: 304 260 257

Tôi đã lưu một số byte bằng cách nén chức năng ghi nhớ một chút và loại bỏ f(n)hoàn toàn, thay thế nó bằng truy cập mảng trực tiếp.

BigInteger[]c;BigInteger a(int n,int k){m(n);return g(n).divide(g(n-k)).divide(g(k));}BigInteger g(int n){return n<3?BigInteger.ONE:g(n-1).multiply(c[n-1]);}void m(int n){c=new BigInteger[n];for(int i=0;i<n;++i)c[i]=(i<2)?BigInteger.ONE:c[i-2].add(c[i-1]);}

Thật không may, BigIntegerlà bắt buộc do tràn và tôi đã phải thêm ghi nhớ. Thậm chí trên một thế hệ 6 i7, nó đã được dùng cách quá dài để chạy với đầu vào lớn.

Ungolfed, với nồi hơi classmainmã:

import java.math.BigInteger;

public class ComputeTheFibonomialCoefficient {

  public static void main(final String[] args) {
    // @formatter:off
    String[][] testData = new String[][] {
      { "0", "0", "1" },
      { "1", "1", "1" },
      { "2", "0", "1" },
      { "3", "2", "2" },
      { "8", "3", "1092" },
      { "11", "5", "1514513" },
      { "22", "7", "7158243695757340957617" },
      { "25", "3", "49845401197200" },
      { "50", "2", "97905340104793732225" },
      { "100", "1", "354224848179261915075" }
    };
    // @formatter:on

    for (String[] data : testData) {
      System.out.println("a(" + data[0] + ", " + data[1] + ")");
      System.out.println("  Expected -> " + data[2]);
      System.out.print("    Actual -> ");
      System.out.println(new ComputeTheFibonomialCoefficient().a(
          Integer.parseInt(data[0]), Integer.parseInt(data[1])));
      System.out.println();
    }
  }

  // Begin golf

  BigInteger[] c;

  BigInteger a(int n, int k) {
    m(n);
    return g(n).divide(g(n - k)).divide(g(k));
  }

  BigInteger g(int n) {
    return n < 3 ? BigInteger.ONE : g(n - 1).multiply(c[n - 1]);
  }

  void m(int n) {
    c = new BigInteger[n];
    for (int i = 0; i < n; ++i)
      c[i] = (i < 2) ? BigInteger.ONE : c[i - 2].add(c[i - 1]);
  }
  // End golf
}

Đầu ra chương trình:

a(0, 0)
  Expected -> 1
    Actual -> 1

a(1, 1)
  Expected -> 1
    Actual -> 1

a(2, 0)
  Expected -> 1
    Actual -> 1

a(3, 2)
  Expected -> 2
    Actual -> 2

a(8, 3)
  Expected -> 1092
    Actual -> 1092

a(11, 5)
  Expected -> 1514513
    Actual -> 1514513

a(22, 7)
  Expected -> 7158243695757340957617
    Actual -> 7158243695757340957617

a(25, 3)
  Expected -> 49845401197200
    Actual -> 49845401197200

a(50, 2)
  Expected -> 97905340104793732225
    Actual -> 97905340104793732225

a(100, 1)
  Expected -> 354224848179261915075
    Actual -> 354224848179261915075

1

JavaScript (ES6), 70 byte

a=n=>n<2?1:a(--n)+a(--n);b=n=>n?a(--n)*b(n):1;c=n=>k=>b(n)/b(n-k)/b(k)

Gọi sử dụng c(n)(k), khá đơn giản.



1

dc, 67 byte

?skdsn[si1d[sadlarla+zli>b*]sbzli>b*]dsgxsplnlk-lgxsqlklgxlprlqr*/f

Đầu vào được lấy dưới dạng hằng số thập phân được phân tách bằng dấu cách trên một dòng.

Điều này sử dụng câu trả lời của tôi cho /Fibon(acci-)?orial/câu hỏi, nhân tất cả các số trên ngăn xếp ở bước cuối cùng, yêu cầu các số khác được lưu trữ ở nơi khác trong khi các Fibonorial khác được tính toán.

?       # Take input from stdin
skdsn   # Store second number in register `k'; store a copy of first number in register `n'
[si1d[sadlarla+zli>b*]sbzli>b*] # Compute Fibonorial of top-of-stack, multiplying
                                #   until stack depth is 1
dsgx    # Store a copy of this function as g and execute it: g(n)
sp      # Store g(n) in register `p'
lnlk-   # Compute n-k
lgx     # Compute g(n-k)
sq      # Store g(n-k) in register `q'
lk lgx  # Compute g(k)
        # Top ---Down--->
lp      #  g(n)    g(k)
r       #  g(k)    g(n)
lq      #  g(n-k)  g(k)    g(n)
r       #  g(k)    g(n-k)  g(n)
*       # (g(k)g(n-k))     g(n)
/       #  g(n)/(g(k)g(n-k))
f       # Dump stack to stdout


1

Tiên đề 108 byte

b(n,k)==(n<=k or k<1=>1;reduce(*,[fibonacci(i) for i in (n-k+1)..n])/reduce(*,[fibonacci(i) for i in 1..k]))

một số bài kiểm tra

(34) -> b(0,0),b(1,1),b(2,0),b(3,2),b(8,3),b(11,5),b(22,7)
   Compiling function b with type (NonNegativeInteger,
      NonNegativeInteger) -> Fraction Integer
   Compiling function b with type (PositiveInteger,PositiveInteger) ->
      Fraction Integer
   Compiling function b with type (PositiveInteger,NonNegativeInteger)
       -> Fraction Integer

   (34)  [1,1,1,2,1092,1514513,7158243695757340957617]
                                                 Type: Tuple Fraction Integer
(35) -> b(25,3),b(50,2),b(100,1)

   (35)  [49845401197200,97905340104793732225,354224848179261915075]

Loại: Số nguyên phân số Tuple


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.