帕斯卡的列总和


29

这里的大多数人都熟悉Pascal的Triangle。它由连续的行组成,其中每个元素是其两个左上和右上邻居的总和。这是第一5行(从Generate Pascal的三角形借用):

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

我们将采用Pascal的Triangle并对其进行一些求和(哈哈)。对于给定的输入n,输出nPascal三角形的第一行的列和。例如,对于input 5,输出将由

            1
          1   1
        1   2   1
      1   3   3   1
[+] 1   4   6   4   1
----------------------
    1 1 5 4 9 4 5 1 1

因此输出将是[1, 1, 5, 4, 9, 4, 5, 1, 1]

请注意,您不一定需要生成Pascal的Triangle来计算总和-取决于是否实现较短的实现,这取决于您的实现。

输入值

n具有n >= 1 任何方便格式的单个正整数。

输出量

如上所述n,Pascal三角形的第一行的按列求和的结果数组/列表。同样,以任何合适的格式。

规则

  • 前导或尾随的换行符或空格都是可选的,只要字符本身正确对齐即可。
  • 完整的程序或功能都是可以接受的。如果是函数,则可以返回输出而不是打印输出。
  • 如果可能,请提供一个在线测试环境的链接,以便其他人可以尝试您的代码!
  • 禁止出现标准漏洞
  • 这是因此所有常用的高尔夫规则都适用,并且最短的代码(以字节为单位)获胜。

例子

[input]
[output]

1
[1]

2
[1, 1, 1]

3
[1, 1, 3, 1, 1]

5
[1, 1, 5, 4, 9, 4, 5, 1, 1]

11
[1, 1, 11, 10, 54, 44, 155, 111, 286, 175, 351, 175, 286, 111, 155, 44, 54, 10, 11, 1, 1]

Answers:


7

MATL,16字节

tZv=Gq:"t5BZ+]vs

在线尝试!

说明

这将反复应用卷积以生成行。例如,对于输入,n=5我们从第一行开始

0 0 0 0 1 0 0 0 0

[1 0 1]给定

0 0 0 1 0 1 0 0 0

重复操作给出

0 0 1 0 2 0 1 0 0

然后

0 1 0 3 0 3 0 1 0

垂直连接这些数组并计算每一列的总和即可得出结果。

t       % Input n implictly. Duplicate
Zv      % Symmetric range. Gives [1 2 3 4 5 4 3 2 1] for input 5
=       % Equal to (element-wise). Gives [0 0 0 0 1 0 0 0 0]. This is the first row
Gq:     % Push [1 2 ... n-1]
"       % For each. This executes the following code n-1 times
  t     %   Duplicate
  5B    %   Push 5 in binary, that is, [1 0 1]
  Z+    %   Convolution keeping size
]       % End
v       % Concatenate all results vertically 
s       % Sum. Display implicitly.

致命!我不能将字节数减少一半;先生,给你戴顶帽子。
魔术八爪鱼缸

3
@carusocomputing谢谢:-)你知道他们对卷积的看法吗
Luis Mendo

5

CJam32 25 24字节

感谢Luis Mendo节省了1个字节。

{(_0a*1+\{_(2$+.+}*]:.+}

在线尝试!

说明

(       e# Decrement input N.
_0a*1+  e# Create a list of N-1 zeros and a 1. This is the top row with
        e# the required indentation.
\{      e# Run this block N-1 times.
  _     e#   Duplicate the last row.
  (     e#   Pull off a leading zero, shifting the row left.
  2$+   e#   Copy the full row and prepend that zero, shifting the row right.
  .+    e#   Element-wise addition, which results in the next row.
}*
]       e# Wrap all rows in a list.
:.+     e# Add up the columns by reducing element-wise addition over the rows.

5

JavaScript(ES6),83个字节

f=
n=>[...Array(n+--n)].map(g=(j=n,i,a)=>j--?g(j,i-1)+g(j,i+1)+(a?g(j,i,a):0):i-n?0:1)
<input type=number min=1 oninput=o.textContent=f(+this.value)><pre id=o>

1索引花了我一个字节。说明:g(j-1,i-1)+g(j-1,i+1)递归计算Pascal的三角形,直到到达第一行为止,这是基本情况。为了获得列总和,我使用了map实际上传递第三个参数的事实,因此在这种情况下,有一个额外的递归步骤。


5

JavaScript(ES6),90 87 86 84 82字节

ETHproductions节省了3个字节

f=(n,a=[1],b=a)=>n--?f(n,[...(F=x=>a.map((n,i)=>n+~~x[i-d]))(a,d=2),0,d=1],F(b)):b

测试用例


5

Mathematica,59 57字节

感谢Martin Ender节省了两个字节!

Binomial[i,(j+i)/2]~Sum~{i,Abs@j,b,2}~Table~{j,-b,b=#-1}&

纯函数接受正整数输入并返回整数列表。从字面上产生帕斯卡三角形的所有相关条目并将其适当地求和。

先前提交的内容(较容易阅读):

Table[Sum[Binomial[i,(j+i)/2],{i,Abs@j,b,2}],{j,-b,b=#-1}]&

4

八度84 67 45字节

多亏了尼尔,节省了22个字节!

@(n)sum(spdiags(flip(tril(flip(pascal(n))))))

在线尝试!

说明

pascal函数提供了一个矩阵,其中包含Pascal三角形中的值:

>> pascal(5)
ans =
     1     1     1     1     1
     1     2     3     4     5
     1     3     6    10    15
     1     4    10    20    35
     1     5    15    35    70

要提取所需的值,我们垂直翻转(flip),保留下部三角形部分(tril),然后再次翻转。这给

ans =
   1   1   1   1   1
   1   2   3   4   0
   1   3   6   0   0
   1   4   0   0   0
   1   0   0   0   0

spdiags 然后将对角线提取为列

ans =
   1   1   1   1   1   0   0   0   0
   0   0   4   3   2   1   0   0   0
   0   0   0   0   6   3   1   0   0
   0   0   0   0   0   0   4   1   0
   0   0   0   0   0   0   0   0   1

sum计算每一列的总和,得出结果。


您不能简化为@(n)sum(spdiags(flip(tril(flip(pascal(n))))))
尼尔

@尼尔是的!谢谢!!
Luis Mendo

4

05AB1E34 32 28 25 24字节

-4感谢Emigna。

FN©ƒ®Ne0})¹®-Å0.ø˜¨ˆ}¯øO

在线尝试!


FN©ƒ®Ne0})               # Generate, iteratively, the current pascal row, interspersed with 0's.
          ¹®-Å0          # Calculate the number of zeros to middle pad it.
               .ø˜¨ˆ}¯øO # Surround with the zeros, transpose and sum.

基本上,它所做的就是生成以下内容:

0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 1 0 0 0 0 0
0 0 0 0 1 0 2 0 1 0 0 0 0
0 0 0 1 0 3 0 3 0 1 0 0 0
0 0 1 0 4 0 6 0 4 0 1 0 0

转置它:

0 0 0 0 0
0 0 0 0 1
0 0 0 1 0
0 0 1 0 4
0 1 0 3 0
1 0 2 0 6
0 1 0 3 0
0 0 1 0 4
0 0 0 1 0
0 0 0 0 1
0 0 0 0 0

然后对每一行求和:

0
1
1
5
4
9
4
5
1
1
0

如果前导和尾随0不可接受,则®>-Åistead对其进行®-Å修复,以+1字节为代价。


结果50

[0, 1, 1, 50, 49, 1224, 1175, 19551, 18376, 229125, 210749, 2100384, 1889635, 15679951, 13790316, 97994765, 84204449, 523088334, 438883885, 2421229251, 1982345366, 9833394285, 7851048919, 35371393434, 27520344515, 113548602181, 86028257666, 327340174085, 241311916419, 851817398634, 610505482215, 2009517658701, 1399012176486, 4313184213360, 2914172036874, 8448367214664, 5534195177790, 15139356846901, 9605161669111, 24871748205410, 15266586536299, 37524050574849, 22257464038550, 52060859526501, 29803395487951, 66492351226050, 36688955738099, 78239857877649, 41550902139550, 84859704298201, 43308802158651, 84859704298201, 41550902139550, 78239857877649, 36688955738099, 66492351226050, 29803395487951, 52060859526501, 22257464038550, 37524050574849, 15266586536299, 24871748205410, 9605161669111, 15139356846901, 5534195177790, 8448367214664, 2914172036874, 4313184213360, 1399012176486, 2009517658701, 610505482215, 851817398634, 241311916419, 327340174085, 86028257666, 113548602181, 27520344515, 35371393434, 7851048919, 9833394285, 1982345366, 2421229251, 438883885, 523088334, 84204449, 97994765, 13790316, 15679951, 1889635, 2100384, 210749, 229125, 18376, 19551, 1175, 1224, 49, 50, 1, 1, 0]

1
-Å0而不是>-Ý0*应该工作,并且最后不需要。
Emigna

1
并且>F可以ƒ
Emigna

好的收获,我总是忘记Å,聪明!我保留了“ ctrl + f”作为“身份列表”或类似内容info.txt……
Magic Octopus Urn

我直到最近才开始记住它们的存在:)
Emigna

1
为什么移调将其从转换13 x 55 x 11?其他两列/行在哪里?
AdmBorkBork

4

PHP,119字节

从1输入到输入-1的列号

for(;$r<$argn;$l=$t[+$r++])for($c=-$r;$c<=$r;$c+=2)$s[$c]+=$t[+$r][$c]=$r|$c?$l[$c+1]+$l[$c-1]:1;ksort($s);print_r($s);

在线尝试!


@LuisMendo谢谢,我发现了这个错误,它保存了3个字节。现在,它可以与5.5以上的PHP版本一起使用。array_column在这个版本的新功能
约尔格Hülsermann

校正的时间变短了,这很不错:-)
Luis Mendo

这是另外24到30个字节:通过交换行数和列数并删除节省13个字节array_column()$x=2*$j++-$i保存7个字节。循环而不是向上循环$ j可以节省1(for($j=$i+1;$j--;))。并且可以从输出中获取另外3个字节。
泰特斯

@Titus它是如此漂亮得使用array_column
约尔格Hülsermann

有一天它将节省字节。
泰特斯

3

果冻,12字节

Ḷµc€j€0Ṛṙ"NS

在线尝试!

怎么运行的

Ḷµc€j€0Ṛṙ"NS  Main link. Argument: k

Ḷ             Unlength; yield A := [0, ..., k-1].
 µ            New chain. Argument: A
  c€          Combinations each; compute nCr for each n and r in A, grouping by n.
    j€0       Join each resulting array [nC0, ..., nC(k-1)], separating by zeroes,
              yielding, [nC0, 0, ..., 0, nC(k-1)].
              Note that nCr = 0 whenever r > n.
       Ṛ      Reverse the resulting 2D array.
          N   Negate A, yielding [0, ..., -(k-1)].
        ṙ"    Zipwith rotate; for each array in the result to the left and the
              corresponding integer non-positive integer to the right, rotate
              the array that many units to the left.
           S  Take the columnwise sum.

2

Python 3,201 184字节

def f(n):x,z,m=[1],[0],n-1;l=[z*m+x+z*m];exec("x=[*map(sum,zip(z+x,x+z))];l.append(z*(n-len(x))+[b for a in zip(x,z*len(x))for b in a][:-1]+z*(n-len(x)));"*m);return[*map(sum,zip(*l))]

2

Python 2中140个 137字节

n=input()
x=[]
a=[0]*n+[1]+n*[0]
z=n%2
exec'x+=[a];a=[(i%2^z)*sum(a[i-1:i+2])for i in range(2*n+1)];z^=1;'*n
print map(sum,zip(*x))[1:-1]

在线尝试!在线尝试!

对于n=3
n零开头的列表开头并以一个开头包围- [[0, 0, 0, 1, 0, 0, 0]]
生成完整的金字塔

[[0, 0, 0, 1, 0, 0, 0],
 [0, 0, 1, 0, 1, 0, 0],
 [0, 1, 0, 2, 0, 1, 0]]

旋转90º并对每一行求和,丢弃第一行和最后一行(仅零)

[[0, 0, 0],
 [0, 0, 1],
 [0, 1, 0],
 [1, 0, 2],
 [0, 1, 0],
 [0, 0, 1],
 [0, 0, 0]]

2

Haskell中,118个 112 104字节

@nimi节省了6个 14字节

z=zipWith(+)
p n|n<2=[1]|m<-p(n-1)=z(0:0:m)(m++[0,0])            -- Generate the nth triangle row.
f n=foldl1 z[d++p x++d|x<-[1..n],d<-[0<$[1..n-x]]]  -- Pad each row with 0s and then sum all the rows.

您可以将填充功能缩短#r#n|d<-0<$[1..n]=d++r++d
nimi

哦,现在可以内联了#,因为它不再递归了:定义ff n=foldl1 z[d++p x++d|x<-[1..n],d<-[0<$[1..n-x]]]and dump #
妮咪

1

Python 3,124个字符

f=lambda n:[sum(map(lambda n,k:k<1or (2*k+n)*f(2*k+n-1,k-1)/k,[abs(x)]*n,range(n))[:(n+1-abs(x))/2]) for x in range(-n+1,n)]

这利用了可以用二项式系数定义Pascal三角形的事实。我试图消除abs(x)range(-n+1,n)通过使range(n),然后使用lambda l:l[-1:0:-1]+l,但它是更长的时间。

这也是我第一次打高尔夫球,所以我希望您能原谅任何假人。

二项式不是我的,是从这里带走的

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.