Sono possibili diverse combinazioni


9

Problema

Dato un valore n, immagina un paesaggio montano inscritto in un riferimento da (0, 0) a (2n, 0). Non ci devono essere spazi bianchi tra i pendii e anche la montagna non deve scendere al di sotto dell'asse x. Il problema da risolvere è: dato n (che definisce la dimensione del paesaggio) e il numero k di picchi (k sempre inferiore o uguale a n), quante combinazioni di montagne sono possibili con k picchi?

Ingresso

n che rappresenta la larghezza del paesaggio e k che è il numero di picchi.

Produzione

Solo il numero di combinazioni possibili.

Esempio

Dato n = 3 e k = 2 la risposta è 3 combinazioni.

Solo per fare un esempio visivo, sono i seguenti:

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

sono le 3 combinazioni possibili usando 6 (3 * 2) posizioni e 2 picchi.

Modifica: - altri esempi -

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

Condizioni vincenti

Si applicano le regole standard del . Vince l'invio più breve in byte.


4
È lo stesso di "trova il numero di espressioni di ncoppie di parentesi corrispondenti che contengono esattamente kistanze di ()"?
xnor


@xnor sì lo è.
Jonathan Allan,

4
Potresti voler aggiornare la sfida con un titolo più esplicito come Calcola numeri Narayana .
Arnauld,

Potresti confermare se kdeve essere gestito o meno un input con zero? In tal caso, è necessario gestire un input nuguale a zero (con kanche zero per definizione)?
Jonathan Allan,

Risposte:


7

Python, 40 byte

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

Provalo online!

Utilizza la ricorrenza , .un'n,1=1un'n,K=n(n-1)K(K-1)un'n-1,K-1


6

Gelatina , 7 byte

cⱮṫ-P÷⁸

Provalo online!

Accetta input come nallora k. Usa la formula

N(n,K)=1n(nK)(nK-1)

che ho trovato su 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

Ogni riga funziona da sola.

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

Accetta input come kallora n.

7 byte

cⱮ×ƝṪ÷⁸
  • Grazie a Jonathan Allan per questo.

Aspetta ... la coda viene automaticamente definita come 2 numeri? (Non conosco affatto Jelly, solo una domanda sciocca)
Quintec,

@Quintec Ci sono due funzioni di coda. Uno ( ) che accetta solo l'ultimo elemento di un singolo argomento e quello che ho usato ( ) che accetta due argomenti. L'argomento pugno è un elenco e il secondo è un numero (Nel mio caso -1rappresentato da una -nel codice) che ti dice quanti elementi salvare. Avere -1dato due elementi è stato il modo più golfoso di definire
Dylnan,

Grazie, grazie! Vedo come è stata costruita la gelatina per il golf ... hehe
Quintec,

1
Un'altra variante per 7 f (n, k):cⱮ×ƝṪ÷⁸
Jonathan Allan,

4

JavaScript (ES6), 33 30 byte

Salvato 3 byte grazie a @Shaggy

Accetta input come (n)(k).

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

Provalo online!

Implementa la definizione ricorsiva utilizzata da Anders Kaseorg .


JavaScript (ES7), 59 58 49 45 byte

Accetta input come (n)(k).

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

Provalo online!

Calcola:

un'n,K=1K(n-1K-1)(nK-1)=1n(nK)(nK-1)=1n(nK)2×Kn-K+1

Derivato da A001263 (prima formula).


-3 byte con curry.
Shaggy,

@Shaggy Doh ... Grazie. La revisione n. 7 sembra finalmente avere la revisione n. 1. : p
Arnauld,

3

Wolfram Language (Mathematica) , 27 byte

Tre versioni, tutte della stessa lunghezza:

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

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

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

Provalo online! (Solo la prima versione, ma è possibile copiare e incollare per provare le altre.)

n!(n-1)!K!(K-1)!(n-K)!(n-K-1)!


2

J , 17 11 byte

]%~!*<:@[!]

Provalo online!

Prende nl'argomento giusto, kcome quello sinistro. Utilizza la stessa formula della risposta Jelly di Dylnan e la soluzione APL di Quintec.

Spiegazione:

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

2

APL (Dyalog), 19 18 16 12 byte

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

Grazie a @Galen Ivanov per -4 byte

Utilizza l'identità nella sequenza OEIS. Prende k a sinistra e n a destra.

TIO


⊢÷⍨!×⊢!⍨¯1+⊣per 12 byte , argomento invertito
Galen Ivanov,

@GalenIvanov Grazie, il mio tacito APL è estremamente debole
Quintec,

Il mio APL non è buono, ho appena colto l'occasione per provarlo, dopo la mia soluzione J :)
Galen Ivanov



1

Perl 6 , 33 byte

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

Provalo online!

Usa la formula

un'n,K=(n-1K-1)×1K(nK-1)=Πio=1K-1(n-Kio+1)×Πio=2K(n-Kio+1)

Spiegazione

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

Versione alternativa, 39 byte

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

Provalo online!

Utilizza la formula dalla risposta di Arnauld:

un'n,K=1n(nK)2×Kn-K+1



0

Stax , 9 byte

ÇäO╪∙╜5‼O

Esegui ed esegui il debug

Sto usando la formula di Dylnan in stax.

Disimballato, non modificato e commentato, il programma si presenta così.

        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

Esegui questo


0

APL (NARS), 17 caratteri, 34 byte

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

test:

  f←{⍺÷⍨(⍵!⍺)×⍺!⍨⍵-1}
  (2 f 1)(4 f 1)(4 f 3)(5 f 2)    
1 1 6 10 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.