可能有不同的组合


9

问题

给定一个值n,想象一下在(2,0)的参考(0,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)来更新挑战。
阿纳尔德

您可以确认是否k必须处理输入为零的信息吗?如果是这样,是否必须处理n等于零的输入(k根据定义也为零)?
乔纳森·艾伦

Answers:



6

果冻,7个字节

cⱮṫ-P÷⁸

在线尝试!

n然后接受输入k。使用公式

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

我在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字节

每行都可以独立工作。

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

k然后接受输入n

7字节

cⱮ×ƝṪ÷⁸
  • 感谢乔纳森·艾伦(Jonathan Allan)的帮助。

等等...尾巴会自动定义为2个数字吗?(根本不了解果冻,只是一个愚蠢的问题)
Quintec

@Quintec有两个尾部函数。一个()仅接受单个参数的最后一个元素,而我使用的()仅接受一个参数的两个元素。第一个参数是一个列表,第二个参数是一个数字(在我的情况下,用代码中-1的a表示-)告诉您要保存多少个元素。有-1举两个元素是定义golfiest方式
dylnan

知道了,谢谢!我看到果冻是如何为高尔夫打造的……

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个字节,带有currying。
毛茸茸的

@Shaggy Doh ...谢谢。修订#7最终看起来应该像修订#1一样。:p
Arnauld

3

Wolfram语言(Mathematica),27个字节

长度相同的三个版本:

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

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

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

在线尝试!(只是第一个版本,但是您可以复制并粘贴以尝试其他版本。)

所有这些都是某种变体

n!(n1)!k!(k-1个ñ-ķñ-ķ-1个
这就是一直存在的公式。我希望可以使用Beta函数,这是一种二项式倒数,但随后发生了太多的除法运算。


2

J17 11字节

]%~!*<:@[!]

在线尝试!

注意到n作为右边的参数,k作为左之一。使用与dylnan的Jelly答案和Quintec的APL解决方案相同的公式。

说明:

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

2

APL(Dyalog),19 18 16 12字节

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

感谢@Galen Ivanov提供-4个字节

使用OEIS序列中的身份。在左侧取k,在右侧取n。

蒂奥


⊢÷⍨!×⊢!⍨¯1+⊣12个字节,参数颠倒
盖伦诺夫

@GalenIvanov谢谢,我的默认APL非常弱
Quintec '18

我的APL不好,我只是在J解决方案之后借此机会尝试一下:)
Galen Ivanov



1

Perl 6、33字节

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

在线尝试!

使用公式

一个ñķ=ñ-1个ķ-1个×1个ķñķ-1个=一世=1个ķ-1个ñ-ķ一世+1个×一世=2ķñ-ķ一世+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+[-] @_)/[/] @_}

在线尝试!

使用来自Arnauld答案的公式:

一个ñķ=1个ññķ2×ķñ-ķ+1个



0

Stax,9 个字节

ÇäO╪∙╜5‼O

运行并调试

我在stax中使用dylnan的公式。

解压,解压和注释程序看起来像这样。

        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 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.