Différentes combinaisons possibles

9

Problème

Étant donné une valeur n, imaginez un paysage de montagne inscrit dans une référence (0, 0) à (2n, 0). Il ne doit pas y avoir d'espaces blancs entre les pentes et la montagne ne doit pas descendre en dessous de l'axe x. Le problème à résoudre est: étant donné n (qui définit la taille du paysage) et le nombre k de pics (k toujours inférieur ou égal à n), combien de combinaisons de montagnes sont possibles avec k pics?

Contribution

n qui représente la largeur du paysage et k qui est le nombre de pics.

Production

Juste le nombre de combinaisons possibles.

Exemple

Étant donné n = 3 et k = 2, la réponse est 3 combinaisons.

Juste pour donner un exemple visuel, ils sont les suivants:

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

sont les 3 combinaisons possibles en utilisant 6 (3 * 2) positions et 2 pics.

Modifier: - plus d'exemples -

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

Condition gagnante

la norme les règles s'appliquent. La soumission la plus courte en octets l'emporte.

combinaisonsD
la source
4
Est-ce la même chose que «trouver le nombre d'expressions de npaires de parenthèses correspondantes qui contiennent exactement des kinstances de ()»?
xnor
@xnor oui c'est le cas.
Jonathan Allan
4
Vous pouvez mettre à jour le défi avec un titre plus explicite tel que Compute Narayana Numbers .
Arnauld
Pouvez-vous confirmer si une entrée avec kzéro doit être gérée ou non? Dans l'affirmative, faut-il gérer une entrée négale à zéro (avec kégalement zéro par définition)?
Jonathan Allan

Réponses:

7

Python, 40 octets

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

Essayez-le en ligne!

Utilise la récurrence an,1=1, unen,k=n(n-1)k(k-1)unen-1,k-1.

Anders Kaseorg
la source
6

Gelée , 7 octets

cⱮṫ-P÷⁸

Essayez-le en ligne!

Prend l'entrée comme nalors k. Utilise la formule

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

que j'ai trouvé sur 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 octets

Chaque ligne fonctionne seule.

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

Prend l'entrée comme kalors n.

7 octets

cⱮ×ƝṪ÷⁸
  • Merci à Jonathan Allan pour celui-ci.
dylnan
la source
Attendez ... la queue est automatiquement définie comme 2 chiffres? (Je ne connais pas du tout Jelly, juste une question idiote)
Quintec
@Quintec Il existe deux fonctions de queue. Un ( ) qui prend juste le dernier élément d'un seul argument et celui que j'ai utilisé ( ) qui prend deux arguments. Le premier argument est une liste et le second est un nombre (dans mon cas -1représenté par un -dans le code) qui vous indique le nombre d'éléments à enregistrer. Ayant -1Citez deux éléments a été la façon de définir golfiest
dylnan
Gotcha, merci! Je vois comment la gelée a été construite pour le golf ... hehe
Quintec
1
Une autre variante pour 7 f (n, k):cⱮ×ƝṪ÷⁸
Jonathan Allan
4

JavaScript (ES6), 33 30 octets

Enregistré 3 octets grâce à @Shaggy

Prend l'entrée comme (n)(k).

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

Essayez-le en ligne!

Implémente la définition récursive utilisée par Anders Kaseorg .


JavaScript (ES7), 59 58 49 45 octets

Prend l'entrée comme (n)(k).

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

Essayez-le en ligne!

Calcule:

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

Dérivé de A001263 (première formule).

Arnauld
la source
-3 octets avec curry.
Shaggy
@Shaggy Doh ... Merci. La révision # 7 ressemble finalement à la révision # 1. : p
Arnauld
3

Wolfram Language (Mathematica) , 27 octets

Trois versions, toutes de même longueur:

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

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

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

Essayez-le en ligne!(Juste la première version, mais vous pouvez copier et coller pour essayer les autres.)

Tous ces éléments sont une sorte de variante sur

n!(n-1)!k!(k-1)!(n-k)!(n-k-1)!
qui est la formule qui circule. J'espérais arriver quelque part avec la fonction bêta, qui est une sorte de réciproque binomiale, mais il y avait alors trop de divisions.

Misha Lavrov
la source
2

J , 17 11 octets

]%~!*<:@[!]

Essayez-le en ligne!

Prend ncomme argument de droite, kcomme argument de gauche. Utilise la même formule que la réponse Jelly de dylnan et la solution APL de Quintec.

Explication:

            ] - n  
           !  - choose
       <:@[   - k-1
      *       - multiplied by
     !        - n choose k
   %~         - divided by
  ]           - n   
Galen Ivanov
la source
2

APL (Dyalog), 19 18 16 12 octets

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

Merci à @Galen Ivanov pour -4 octets

Utilise l'identité dans la séquence OEIS. Prend k à gauche et n à droite.

TIO

Quintec
la source
⊢÷⍨!×⊢!⍨¯1+⊣pour 12 octets , argument inversé
Galen Ivanov
@GalenIvanov Merci, mon APL tacite est extrêmement faible
Quintec
Mon APL n'est pas bon, j'en ai juste profité pour l'essayer, après ma solution J :)
Galen Ivanov
1

Lisp commun , 76 octets

(defun x(n k)(cond((= k 1)1)(t(*(/(* n(1- n))(* k(1- k)))(x(1- n)(1- k))))))

Essayez-le en ligne!

JRowan
la source
Vous pouvez économiser 2 octets en supprimant les espaces après \ et après x
Galen Ivanov
1
Remerciements juste mis à jour
JRowan
Suggérer à la (*(1- x)x)place de(* x(1- x))
plafondcat
1

Perl 6 , 33 octets

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

Essayez-le en ligne!

Utilise la formule

unen,k=(n-1k-1)×1k(nk-1)=je=1k-1(n-kje+1)×je=2k(n-kje+1)

Explication

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

Version alternative, 39 octets

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

Essayez-le en ligne!

Utilise la formule de la réponse d'Arnauld:

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

nwellnhof
la source
0

Gelée , 8 octets

,’$c’}P:

Un lien dyadique acceptant nà gauche et kà droite ce qui donne le compte.

Essayez-le en ligne!

Jonathan Allan
la source
0

Stax , 9 octets

ÇäO╪∙╜5‼O

Exécuter et déboguer

J'utilise la formule de Dylnan dans Stax.

Décompressé, non golfé et commenté, le programme ressemble à ceci.

        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

Exécutez celui-ci

récursif
la source
0

APL (NARS), 17 caractères, 34 octets

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

tester:

  f←{⍺÷⍨(⍵!⍺)×⍺!⍨⍵-1}
  (2 f 1)(4 f 1)(4 f 3)(5 f 2)    
1 1 6 10 
RosLuP
la source