Kết hợp khác nhau có thể


9

Vấn đề

Cho một giá trị n, hãy tưởng tượng một phong cảnh núi được ghi trong một tham chiếu (0, 0) đến (2n, 0). Không có khoảng trắng giữa các sườn dốc và cả ngọn núi không xuống dưới trục x. Vấn đề cần giải quyết là: cho n (xác định kích thước của cảnh quan) và số k của các đỉnh (k luôn nhỏ hơn hoặc bằng n), có bao nhiêu tổ hợp núi có thể với các đỉnh k?

Đầu vào

n người đại diện cho chiều rộng của cảnh quan và k là số lượng đỉnh.

Đầu ra

Chỉ cần số lượng kết hợp có thể.

Thí dụ

Cho n = 3 và k = 2 câu trả lời là 3 kết hợp.

Chỉ cần đưa ra một ví dụ trực quan, chúng là như sau:

   /\     /\      /\/\
/\/  \   /  \/\  /    \

là 3 kết hợp có thể sử dụng vị trí 6 (3 * 2) và 2 đỉnh.

Chỉnh sửa: - thêm ví dụ -

n  k  result
2  1  1
4  1  1
4  3  6
5  2  10

Điều kiện chiến thắng

Luật tiêu chuẩn được áp dụng. Đệ trình ngắn nhất tính bằng byte thắng.


4
Đây có giống như "tìm số biểu thức của ncặp ngoặc đơn phù hợp có chứa chính xác các ktrường hợp ()" không?
xnor


@xnor đúng vậy.
Jonathan Allan

4
Bạn có thể muốn cập nhật thử thách với một tiêu đề rõ ràng hơn, chẳng hạn như tính toán số Narayana .
Arnauld

Bạn có thể xác nhận xem có kphải xử lý đầu vào bằng 0 hay không? Nếu vậy, một đầu vào có giá trị nbằng 0 ( kcũng bằng 0 theo định nghĩa) phải được xử lý?
Jonathan Allan

Câu trả lời:


7

Python, 40 byte

f=lambda n,k:k<2or~-n*n*f(n-1,k-1)/~-k/k

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

Sử dụng tái phát mộtn,1= =1 , mộtn,k= =n(n-1)k(k-1)mộtn-1,k-1 .


6

Thạch , 7 byte

cⱮṫ-P÷⁸

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

Đưa đầu vào như nsau đó k. Sử dụng công thức

N(n,k)= =1n(nk)(nk-1)

mà tôi tìm thấy trên Wikipedia .

cⱮṫ-P÷⁸
c        Binomial coefficient of n and...
 Ɱ       each of 1..k
  ṫ-     Keep the last two. ṫ is tail, - is -1.
    P    Product of the two numbers.
     ÷   Divide by
      ⁸  n.

7 byte

Mỗi dòng hoạt động trên chính nó.

,’$c@P÷
c@€ṫ-P÷

Đưa đầu vào như ksau đó n.

7 byte

cⱮ×ƝṪ÷⁸
  • Cảm ơn Jonathan Allan cho cái này.

Đợi ... đuôi được tự động định nghĩa là 2 số? (Không biết Jelly chút nào, chỉ là một câu hỏi ngớ ngẩn)
Quintec

@Quintec Có hai chức năng đuôi. Một ( ) chỉ lấy phần tử cuối cùng của một đối số và một phần tử tôi đã sử dụng ( ) có hai đối số. Đối số nắm tay là một danh sách và đối số thứ hai là một số (Trong trường hợp của tôi được -1đại diện bởi một -trong mã) cho bạn biết có bao nhiêu phần tử để lưu. Có -1hai yếu tố là cách tốt nhất để xác định
dylnan

Gotcha, cảm ơn! Tôi thấy cách thạch được xây dựng cho golf ... hehe
Quintec

1
Một biến thể khác cho 7 f (n, k):cⱮ×ƝṪ÷⁸
Jonathan Allan

4

JavaScript (ES6), 33 30 byte

Đã lưu 3 byte nhờ @Shaggy

Đưa đầu vào là (n)(k).

n=>g=k=>--k?n*--n/-~k/k*g(k):1

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

Thực hiện định nghĩa đệ quy được sử dụng bởi Anders Kaseorg .


JavaScript (ES7), 59 58 49 45 byte

Đưa đầu vào là (n)(k).

n=>k=>k/n/(n-k+1)*(g=_=>k?n--/k--*g():1)()**2

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

Tính toán:

mộtn,k= =1k(n-1k-1)(nk-1)= =1n(nk)(nk-1)= =1n(nk)2×kn-k+1

Bắt nguồn từ A001263 (công thức đầu tiên).


-3 byte với currying.
Shaggy

@Shaggy Doh ... Cảm ơn. Bản sửa đổi số 7 cuối cùng trông giống như bản sửa đổi số 1 nên có. : p
Arnauld

3

Ngôn ngữ Wolfram (Mathicala) , 27 byte

Ba phiên bản, tất cả cùng chiều dài:

(b=Binomial)@##b[#,#2-1]/#&

Binomial@##^2#2/(#-#2+1)/#&

1/(Beta[#2,d=#-#2+1]^2d##)&

Hãy thử trực tuyến!(Chỉ là phiên bản đầu tiên, nhưng bạn có thể sao chép và dán để thử các phiên bản khác.)

n!(n-1)!k!(k-1)!(n-k)!(n-k-1)!


2

J , 17 11 byte

]%~!*<:@[!]

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

Đưa ra nnhư là lý lẽ đúng,k như là bên trái. Sử dụng cùng một công thức như câu trả lời Jelly của dylnan và giải pháp APL của Quintec.

Giải trình:

            ] - n  
           !  - choose
       <:@[   - k-1
      *       - multiplied by
     !        - n choose k
   %~         - divided by
  ]           - n   

2

APL (Dyalog), 19 18 16 12 byte

⊢÷⍨!×⊢!⍨¯1+⊣

Cảm ơn @Galen Ivanov cho -4 byte

Sử dụng danh tính trong chuỗi OEIS. Mất k bên trái và n bên phải.

TIO


⊢÷⍨!×⊢!⍨¯1+⊣cho 12 byte , đối số đảo ngược
Galen Ivanov

@GalenIvanov Cảm ơn, APL ngầm của tôi cực kỳ yếu
Quintec

APL của tôi không tốt, tôi chỉ có cơ hội để dùng thử, sau giải pháp J của tôi :)
Galen Ivanov



1

Perl 6 , 33 byte

{[*] ($^n-$^k X/(2..$k X-^2))X+1}

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

Sử dụng công thức

mộtn,k= =(n-1k-1)×1k(nk-1)= =ΠTôi= =1k-1(n-kTôi+1)×ΠTôi= =2k(n-kTôi+1)

Giải trình

{[*]                            }  # Product of
     ($^n-$^k X/                   # n-k divided by
                (2..$k X-^2))      # numbers in ranges [1,k-1], [2,k]
                             X+1   # plus one.

Phiên bản thay thế, 39 byte

{combinations(|@_)²/(1+[-] @_)/[/] @_}

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

Sử dụng công thức từ câu trả lời của Arnauld:

mộtn,k= =1n(nk)2×kn-k+1



0

Stax , 9 byte

ÇäO╪∙╜5‼O

Chạy và gỡ lỗi nó

Tôi đang sử dụng công thức của dylnan trong stax.

Giải nén, không ghi chú và nhận xét chương trình trông như thế này.

        program begins with `n` and `k` on input stack
{       begin block for mapping
  [     duplicate 2nd element from top of stack (duplicates n)
  |C    combinatorial choose operation
m       map block over array, input k is implicitly converted to [1..k]
O       push integer one *underneath* mapped array
E       explode array onto stack
*       multiply top two elements - if array had only element, then the pushed one is used
,/      pop `n` from input stack and divide

Chạy cái này


0

APL (NARS), 17 ký tự, 34 byte

{⍺÷⍨(⍵!⍺)×⍺!⍨⍵-1}

kiểm tra:

  f←{⍺÷⍨(⍵!⍺)×⍺!⍨⍵-1}
  (2 f 1)(4 f 1)(4 f 3)(5 f 2)    
1 1 6 10 
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.