คำนวณค่าสัมประสิทธิ์ Fibonomial


11

พื้นหลัง

ลำดับ Fibonacci ถูกกำหนดเป็น

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

Fibonorial คล้ายกับ factorial เป็นผลคูณของตัวเลขn Fibonacci แรก

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

สัมประสิทธิ์ Fibonomial คล้ายกับสัมประสิทธิ์ทวินาม

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

งาน

เป้าหมายของคุณคือการสร้างฟังก์ชั่นหรือโปรแกรมการคำนวณค่าสัมประสิทธิ์ Fibonomial รับสอง integers เชิงลบnและkกับk ≤ n

กรณีทดสอบ

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

กฎระเบียบ

  • นี่คือเพื่อให้โค้ดที่สั้นที่สุดชนะ
  • อนุญาตให้สร้างเครื่องได้

ที่เกี่ยวข้อง


หากจำเป็นนี่คือหน้าเว็บที่แสดงรายการแรก1335ในลำดับค่าสัมประสิทธิ์ Fibonomial
R. Kap

เป็นa(50, 2)กรณีทดสอบที่ขาดหายไปชั้นนำ9?
โจ

@SirBidenXVII โอ้ใช่คุณพูดถูกฉันพลาดตัวเลข
ไมล์

คำตอบ:


1

เยลลี่ขนาด 16 ไบต์

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

ลองออนไลน์!

มอบเครดิตให้แก่เดนนิสสำหรับลิงค์ผู้ช่วยเหลือ Fibonacci-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 ไบต์

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

เอาท์พุทลอย สร้างรายการ Fibonacci ที่ไม่มีที่สิ้นสุด จากนั้นทำการผสมแบบทวินามการคูณและหารด้วยองค์ประกอบจากรายการฟีโบนักชี


4

Python 67 ไบต์

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)

a(n,k)เรียกใช้ ใช้ @ เดนนิสคำตอบ fibonorial (ที่ได้รับอนุญาต?) และการดำเนินการตรงไปตรงมาของคำถามเป็นอย่างอื่น


เนื้อหาของผู้ใช้ทั้งหมดได้รับอนุญาตภายใต้ CC-BY-SA ดังนั้นตราบใดที่คุณระบุแหล่งที่มาคุณสามารถใช้รหัสจากคำตอบอื่น ๆ คุณสามารถย่นแลมบ์ดาที่สองของคุณจะlambda n,k:f(n)/f(k)/f(n-k); ไม่จำเป็นต้องตั้งชื่อ
เดนนิส

3

Haskell, 77 57 55 52 50 ไบต์

บรรทัดแรกนั้นมาจากฟังก์ชั่น Fibonacci หรือการท้าทายต่อเนื่องและเขียนโดย @Anon

บรรทัดที่สองถูกเพิ่มเข้ามาในการท้าทายFibonacci-orialโดย@ChristianSievers

ตอนนี้ฉันเพิ่มบรรทัดที่สาม ความท้าทายเหล่านั้นจะไปอีกไกลแค่ไหน? =)

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

ขอบคุณสำหรับ 5 ไบต์ @xnor!


ที่คุณสามารถทำได้/มากกว่าdiv?
xnor

หืมใช่ แต่นั่นจะเป็นเลขทศนิยม
ข้อบกพร่อง

โอ้นั่นไม่ได้ไม่อนุญาตจริงๆขอบคุณ =)
ข้อผิดพลาด

คุณสามารถแบ่งสองครั้งเพื่อหลีกเลี่ยงการล้อเลียน
xnor

1
ตอนนี้เรามีสิ่งนี้แล้วสิ่งต่อไปอาจเป็นการเปลี่ยนแปลงแบบ fibonomial ;-)
Christian Sievers

3

C, 206 ไบต์:

#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)));}

เมื่อดำเนินการขอให้มีจำนวนเต็ม 2 ช่องคั่นด้วยช่องว่างเป็นอินพุต #includepreprocessor จะต้องเป็นโดยไม่ได้uint_64ไม่ได้เป็นประเภทที่ถูกต้องและวิธีเดียวที่อื่น ๆ ที่จะทำให้งานนี้ได้ผลค่อนข้างใหญ่ใช้unsigned long longประเภทผลตอบแทนทั้งF(Fibonacci) และG(Fibonorial) ฟังก์ชั่นซึ่งเป็นนานกว่าเพียง รวมถึง<inttypes.h>และใช้uint64_tการประกาศ3 ประเภท อย่างไรก็ตามถึงอย่างนั้นมันก็หยุดทำงานอย่างถูกต้องที่ค่าอินพุต14 1(ยืนยันโดยใช้สิ่งนี้ซึ่งแสดงรายการแรก1325ในลำดับ Fibonomial Coefficient) ซึ่งเป็นไปได้มากที่สุดเพราะ Fibonacci และ / หรือ Fibnorial เป็นตัวแทนของตัวเลข15และสูงกว่าล้น 64-bit ชนิดจำนวนเต็มที่ใช้

มันออนไลน์! (Ideone)


อาจเป็นเพราะ Fibonorial ของ 15 ล้นuint_64
ไมล์


2

MATL , 25 23 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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 ไบต์

อาจมีการตีกอล์ฟมากขึ้นดังนั้นความคิดเห็นยินดีแน่นอน
ฉันใช้คำตอบของคำถามฟีโบนักชีในช่วงเริ่มต้นของรหัส:

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

Ungolfed:

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

ฉันบันทึกบางไบต์ด้วยการบีบอัดฟังก์ชั่นบันทึกความทรงจำเล็กน้อยแล้วลบออกf(n)ทั้งหมดแทนที่ด้วยการเข้าถึงอาร์เรย์โดยตรง

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

น่าเสียดายที่BigIntegerต้องมีเนื่องจากล้นและฉันต้องเพิ่มบันทึกช่วยจำ แม้ในรุ่นที่ 6 i7 ก็คือการวิธีนานเกินไปที่จะทำงานกับปัจจัยการผลิตที่มีขนาดใหญ่

Ungolfed ด้วยสำเร็จรูปclassและmainรหัส:

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
}

ผลลัพธ์ของโปรแกรม:

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

Ruby, 72 ไบต์

ขอขอบคุณเป็นพิเศษสำหรับ @ st0le สั้นจริงๆรหัสรุ่นฟีโบนักชี

->n,k{f=[a=b=1,1]+(1..n).map{b=a+a=b}
r=->i{f[i,k].inject:*}
k>0?r[n-k]/r[0]:1}

1

dc, 67 ไบต์

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

อินพุตถูกใช้เป็นค่าคงที่ทศนิยมแบบคั่นด้วยช่องว่างบนบรรทัดเดียว

วิธีนี้ใช้คำตอบของฉันกับ/Fibon(acci-)?orial/คำถามซึ่งคูณตัวเลขทั้งหมดในสแต็คในขั้นตอนสุดท้ายทำให้ต้องเก็บหมายเลขอื่นไว้ที่อื่นในขณะที่คำนวณ Fibonorials อื่น

?       # 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

ความจริง 108 ไบต์

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

การทดสอบบางอย่าง

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

ประเภท: Tuple Fraction Integer


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.