Farklı kombinasyonlar mümkündür


9

Sorun

Bir n değeri verildiğinde, (0, 0) ila (2n, 0) referanslarında yazılı bir dağ manzarası hayal edin. Eğimler arasında beyaz boşluklar olmamalı ve dağ x ekseninin altına inmemelidir. Çözülmesi gereken sorun şudur: n (manzaranın büyüklüğünü tanımlayan) ve piklerin k sayısı (k her zaman n'den küçük veya n'ye eşittir), k zirveleri ile kaç dağ kombinasyonu mümkündür?

Giriş

peyzajın genişliğini temsil eden n ve tepe sayısı olan k.

Çıktı

Sadece mümkün kombinasyon sayısı.

Misal

N = 3 ve k = 2 verildiğinde cevap 3 kombinasyondur.

Sadece görsel bir örnek vermek gerekirse, bunlar şunlardır:

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

6 (3 * 2) pozisyon ve 2 tepe noktası kullanılarak mümkün olan 3 kombinasyon.

Düzenleme: - daha fazla örnek -

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

Kazanma koşulu

Standart kurallar geçerlidir. Bayt cinsinden en kısa gönderim kazanır.


4
Bu, " ntam olarak körneklerini içeren eşleşen parantez çiftlerinin ifade sayısını bul" ile aynı mıdır ()?
xnor


@xnor evet öyle.
Jonathan Allan

4
Sorunu Compute Narayana Numbers gibi daha açık bir başlık ile güncellemek isteyebilirsiniz .
Arnauld

kSıfır olan bir girişin işlenip işlenmediğini onaylayabilir misiniz ? Eğer öyleyse n, sıfıra eşit olan bir ktanım ( tanım gereği sıfır ile ) ele alınmalıdır?
Jonathan Allan

Yanıtlar:


7

Python, 40 bayt

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

Çevrimiçi deneyin!

Yinelemeyi kullanır an,1=1, an,k=n(n1)k(k1)an1,k1.


6

Jöle , 7 bayt

cⱮṫ-P÷⁸

Çevrimiçi deneyin!

nO zaman girişi alır k. Formülü kullanır

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

Wikipedia'da buldum .

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 bayt

Her satır kendi başına çalışır.

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

kO zaman girişi alır n.

7 bayt

cⱮ×ƝṪ÷⁸
  • Bunun için Jonathan Allan'a teşekkürler.

Bekle ... kuyruk otomatik olarak 2 sayı olarak tanımlanır? (
Jelly'i

@Quintec İki kuyruk işlevi vardır. Tek bir argümanın son elemanını alan bir ( ) ve iki argüman alan ( ) kullandığım ( ). Yumruk argümanı bir liste ve ikincisi, kaç öğe kaydedileceğini söyleyen bir sayıdır (benim durumumda kodda -1temsil edilir -). Having -1vermek iki elemanı tanımlamak için golfiest yoluydu
dylnan

Yakaladım, teşekkürler! Jöle golf için nasıl inşa edildiğini görüyorum ... hehe
Quintec

1
7 f (n, k) için başka bir varyant:cⱮ×ƝṪ÷⁸
Jonathan Allan

4

JavaScript (ES6), 33 30 bayt

@Shaggy sayesinde 3 bayt kaydedildi

Girişi alır (n)(k).

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

Çevrimiçi deneyin!

Anders Kaseorg tarafından kullanılan özyinelemeli tanımı uygular .


JavaScript (ES7), 59 58 49 45 bayt

Girişi alır (n)(k).

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

Çevrimiçi deneyin!

hesaplar:

birn,k=1k(n-1k-1)(nk-1)=1n(nk)(nk-1)=1n(nk)2xkn-k+1

A001263'ten türetilmiştir (ilk formül).


Körili -3 byte .
Shaggy

@Shaggy Doh ... Teşekkürler. 7. revizyon nihayet 1 numaralı revizyonun olması gerektiği gibi görünüyor. : p
Arnauld

3

Wolfram Dili (Mathematica) , 27 bayt

Üç versiyon, hepsi aynı uzunlukta:

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

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

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

Çevrimiçi deneyin! (Sadece ilk sürüm, ancak diğerlerini denemek için kopyalayıp yapıştırabilirsiniz.)

Bunların hepsi bir çeşit varyant

n!(n-1)!k!(k-1)!(n-k)!(n-k-1)!
bu da etrafta dolaşan formül. Bir tür binom karşılıklılığı olan Beta işleviyle bir yere gelmeyi umuyordum, ama sonra çok fazla bölünme oldu.


2

J , 17 11 bayt

]%~!*<:@[!]

Çevrimiçi deneyin!

Alır n, sağ argüman olarak ksol olarak. Dylnan'ın Jelly cevabı ve Quintec'in APL çözümü ile aynı formülü kullanır.

Açıklama:

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

2

APL (Dyalog), 19 18 16 12 bayt

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

-4 bayt için @Galen Ivanov'a teşekkürler

Kimliği OEIS dizisinde kullanır. Solda k, sağda n alır.

TIO


⊢÷⍨!×⊢!⍨¯1+⊣12 bayt için argüman tersine döndü
Galen Ivanov

@GalenIvanov Teşekkürler, zımni
APL'm

Benim APL iyi değil, ben sadece benim J çözüm sonra denemek için fırsat aldı :)
Galen Ivanov



1

Perl 6 , 33 bayt

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

Çevrimiçi deneyin!

Formülü kullanır

birn,k=(n-1k-1)x1k(nk-1)=Πben=1k-1(n-kben+1)xΠben=2k(n-kben+1)

açıklama

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

Alternatif sürüm, 39 bayt

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

Çevrimiçi deneyin!

Arnauld'un cevabındaki formülü kullanır:

birn,k=1n(nk)2xkn-k+1



0

Stax , 9 bayt

ÇäO╪∙╜5‼O

Çalıştır ve hata ayıkla

Stax'ta dylnan'ın formülünü kullanıyorum.

Paketten çıkarılmış, çözülmemiş ve yorum yapılmış program buna benziyor.

        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

Bunu çalıştır


0

APL (NARS), 17 karakter, 34 bayt

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

Ölçek:

  f←{⍺÷⍨(⍵!⍺)×⍺!⍨⍵-1}
  (2 f 1)(4 f 1)(4 f 3)(5 f 2)    
1 1 6 10 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.