さまざまな組み合わせが可能


9

問題

値nが与えられた場合、参照(0、0)から(2n、0)に内接する山の風景を想像してください。斜面の間に空白があってはならず、山はX軸の下に下りません。解決すべき問題は次のとおりです。n(ランドスケープのサイズを定義)とピークの数k(kは常にn以下)を前提として、kのピークで山の組み合わせはいくつ可能ですか?

入力

ランドスケープの幅を表すnおよびピークの数であるk。

出力

可能な組み合わせの数だけ。

n = 3およびk = 2の場合、答えは3つの組み合わせです。

視覚的な例を示すために、それらは次のとおりです。

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

6(3 * 2)の位置と2つのピークを使用して可能な3つの組み合わせです。

編集:-その他の例-

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

当選条件

標準の規則が適用されます。バイトでの最短の提出が優先されます。


4
これは、「にn一致するかっこペアのkインスタンスを正確に含むペアの式の数を見つける」と同じ()ですか?
xnor


@xnorはい、そうです。
ジョナサンアラン

4
Compute Narayana Numbersなどのより明確なタイトルでチャレンジを更新することができます。
Arnauld、2018年

kゼロの入力を処理する必要があるかどうかを確認できますか?もしそうなら、nゼロに等しい(k定義上はゼロも含む)入力を処理する必要がありますか?
ジョナサンアラン

回答:



6

ゼリー、7バイト

cⱮṫ-P÷⁸

オンラインでお試しください!

入力を受け取りn、その後k。式を使用します

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

ウィキペディアで見つけました。

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バイト

各行はそれ自体で機能します。

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

入力を受け取りk、その後n

7バイト

cⱮ×ƝṪ÷⁸
  • この問題を解決してくれたJonathan Allanに感謝します。

待って...尾は自動的に2つの数字として定義されますか?(Jellyをまったく知らない、ばかげた質問)
Quintec、2018

@Quintec 2つのテール関数があります。単一の引数の最後の要素のみを取る()と、2つの引数を取る()を使用したもの。最初の引数はリストで、2番目の引数は数値(私の場合、コードでは-1a -で表されます)で、保存する要素の数を示します。-12つの要素を与えることは、定義するのに最もゴルフの方法でした
dylnan

おっと、ありがとう!私はゼリーがゴルフのためにどのように作られたかを見ます... hehe
Quintec '30

1
7 f(n、k)の別のバリアント:cⱮ×ƝṪ÷⁸
ジョナサンアラン

4

JavaScript(ES6)、33 30バイト

@Shaggyのおかげで3バイト節約

入力をとして受け取ります(n)(k)

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

オンラインでお試しください!

Anders Kaseorgが使用する再帰的な定義を実装します。


JavaScript(ES7)、59 58 49 45バイト

入力をとして受け取ります(n)(k)

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

オンラインでお試しください!

計算:

an,k=1k(n1k1)(nk1)=1n(nk)(nk1)=1n(nk)2×knk+1

A001263(最初の式)から派生。


-3バイト(カレーあり)。
シャギー

@Shaggy Doh ...ありがとう。リビジョン#7は最終的にリビジョン#1のように見えます。:p
Arnauld 2018

3

Wolfram言語(Mathematica)、27バイト

すべて同じ長さの3つのバージョン:

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

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

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

オンラインでお試しください!(最初のバージョンだけですが、コピーして貼り付けて他のバージョンを試すことができます。)

これらはすべて、これまで行われてきた式である一種のバリアント です。私は、ベータ関数(ある種の二項逆数)でどこかに到達することを望んでいましたが、その後、あまりにも多くの除算が発生しました。

n!(n1)!k!(k1)!(nk)!(nk1)!



2

APL(Dyalog)、19 18 16 12バイト

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

-4バイトの@Galen Ivanovに感謝

OEISシーケンスでIDを使用します。左側をk、右側をnとしています。

TIO


⊢÷⍨!×⊢!⍨¯1+⊣以下のために12バイト、引数が逆転
ガレン・イワノフ

@GalenIvanovありがとう、暗黙のAPLは非常に弱い
Quintec

私のAPLは良くないので、Jソリューションの後で試してみる機会を得ました:)
Galen Ivanov



1

Perl 6、33バイト

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

オンラインでお試しください!

式を使用します

an,k=(n1k1)×1k(nk1)=i=1k1(nki+1)×i=2k(nki+1)

説明

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

代替バージョン、39バイト

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

オンラインでお試しください!

アーナウルドの答えからの式を使用します:

an,k=1n(nk)2×knk+1



0

Stax、9 バイト

ÇäO╪∙╜5‼O

実行してデバッグする

私はスタックスでディルナンの公式を使っています。

解凍して、ゴルフをして、コメントしたところ、プログラムは次のようになります。

        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

これを実行


0

APL(NARS)、17文字、34バイト

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

テスト:

  f←{⍺÷⍨(⍵!⍺)×⍺!⍨⍵-1}
  (2 f 1)(4 f 1)(4 f 3)(5 f 2)    
1 1 6 10 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.