Kombinasi yang berbeda dimungkinkan


9

Masalah

Diberi nilai n, bayangkan lanskap gunung yang tertulis dalam referensi (0, 0) hingga (2n, 0). Tidak ada ruang putih di antara lereng dan juga gunung tidak turun di bawah sumbu x. Masalah yang harus dipecahkan adalah: mengingat n (yang menentukan ukuran lanskap) dan jumlah k puncak (k selalu kurang dari atau sama dengan n), berapa banyak kombinasi gunung yang mungkin dengan k puncak?

Memasukkan

n yang mewakili lebar lanskap dan k yang merupakan jumlah puncak.

Keluaran

Jumlah kombinasi yang dimungkinkan.

Contoh

Diberikan n = 3 dan k = 2 jawabannya adalah 3 kombinasi.

Hanya untuk memberikan contoh visual, mereka adalah sebagai berikut:

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

adalah 3 kombinasi yang mungkin menggunakan 6 (3 * 2) posisi dan 2 puncak.

Edit: - lebih banyak contoh -

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

Kondisi menang

Aturan standar berlaku. Pengajuan terpendek dalam byte menang.


4
Apakah ini sama dengan, "temukan jumlah ekspresi npasangan kurung yang cocok yang persis sama dengan kcontoh ()"?
xnor


@xnor ya itu.
Jonathan Allan

4
Anda mungkin ingin memperbarui tantangan dengan judul yang lebih eksplisit seperti Hitung Angka Narayana .
Arnauld

Bisakah Anda mengonfirmasi apakah input dengan knol harus ditangani? Jika demikian haruskah input dengan nsama dengan nol (dengan kjuga nol menurut definisi) ditangani?
Jonathan Allan

Jawaban:


7

Python, 40 byte

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

Cobalah online!

Menggunakan pengulangan Sebuahn,1=1 , Sebuahn,k=n(n-1)k(k-1)Sebuahn-1,k-1.


6

Jelly , 7 byte

cⱮṫ-P÷⁸

Cobalah online!

Mengambil input saat nitu k. Menggunakan formula

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

yang saya temukan di 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

Setiap baris berfungsi sendiri.

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

Mengambil input saat kitu n.

7 byte

cⱮ×ƝṪ÷⁸
  • Terima kasih kepada Jonathan Allan untuk yang satu ini.

Tunggu ... ekor secara otomatis didefinisikan sebagai 2 angka? (Tidak tahu Jelly sama sekali, hanya pertanyaan konyol)
Quintec

@ Quintec Ada dua fungsi ekor. Satu ( ) yang hanya mengambil elemen terakhir dari satu argumen dan yang saya gunakan ( ) yang mengambil dua argumen. Argumen pertama adalah daftar dan yang kedua adalah angka (Dalam kasus saya -1diwakili oleh -dalam kode) yang memberi tahu Anda berapa banyak elemen yang harus disimpan. Setelah -1memberikan dua elemen adalah cara golf untuk mendefinisikan
dylnan

Gotcha, terima kasih! Saya melihat bagaimana jeli dibangun untuk golf ... hehe
Quintec

1
Varian lain untuk 7 f (n, k):cⱮ×ƝṪ÷⁸
Jonathan Allan

4

JavaScript (ES6), 33 30 byte

Disimpan 3 byte berkat @Shaggy

Mengambil input sebagai (n)(k).

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

Cobalah online!

Menerapkan definisi rekursif yang digunakan oleh Anders Kaseorg .


JavaScript (ES7), 59 58 49 45 byte

Mengambil input sebagai (n)(k).

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

Cobalah online!

Menghitung:

Sebuahn,k=1k(n-1k-1)(nk-1)=1n(nk)(nk-1)=1n(nk)2×kn-k+1

Berasal dari A001263 (rumus pertama).


-3 byte dengan kari.
Shaggy

@Shaggy Doh ... Terima kasih. Revisi # 7 akhirnya terlihat seperti revisi # 1 seharusnya. : p
Arnauld

3

Bahasa Wolfram (Mathematica) , 27 byte

Tiga versi, semuanya memiliki panjang yang sama:

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

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

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

Cobalah online! (Hanya versi pertama, tetapi Anda dapat menyalin dan menempel untuk mencoba yang lain.)

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


2

J , 17 11 byte

]%~!*<:@[!]

Cobalah online!

Dibawa nsebagai argumen yang benar, ksebagai argumen kiri. Menggunakan rumus yang sama dengan jawaban Jelly dylnan dan solusi APL Quintec.

Penjelasan:

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

2

APL (Dyalog), 19 18 16 12 byte

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

Terima kasih kepada @Galen Ivanov untuk -4 byte

Menggunakan identitas dalam urutan OEIS. Mengambil k di kiri dan n di kanan.

TIO


⊢÷⍨!×⊢!⍨¯1+⊣untuk 12 byte , argumen dibalik
Galen Ivanov

@ GalenIvanov Terima kasih, APL diam-diam saya sangat lemah
Quintec

APL saya tidak bagus, saya hanya mengambil kesempatan untuk mencobanya, setelah solusi J saya :)
Galen Ivanov



1

Perl 6 , 33 byte

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

Cobalah online!

Menggunakan formula

Sebuahn,k=(n-1k-1)×1k(nk-1)=saya=1k-1(n-ksaya+1)×saya=2k(n-ksaya+1)

Penjelasan

{[*]                            }  # 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.

Versi alternatif, 39 byte

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

Cobalah online!

Menggunakan rumus dari jawaban Arnauld:

Sebuahn,k=1n(nk)2×kn-k+1



0

Stax , 9 byte

ÇäO╪∙╜5‼O

Jalankan dan debug itu

Saya menggunakan formula dylnan di stax.

Membongkar, tidak bertali, dan berkomentar programnya terlihat seperti ini

        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

Jalankan yang ini


0

APL (NARS), 17 karakter, 34 byte

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

uji:

  f←{⍺÷⍨(⍵!⍺)×⍺!⍨⍵-1}
  (2 f 1)(4 f 1)(4 f 3)(5 f 2)    
1 1 6 10 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.