パスカルの列合計


29

ここのほとんどの人はパスカルの三角形に精通しています。連続する行で構成され、各要素は左上と右上の2つの隣接要素の合計です。最初の5行は次のとおりです(Generate Pascalの三角形から借用)。

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

パスカルの三角形を取り、その上でいくつかの合計を実行します(笑)。指定されたinputに対してnnPascalの三角形の最初の行の列和を出力します。たとえば、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の三角形を生成する必要はないことに注意してください-短いかどうかは実装次第です。

入力

単一の正の整数nn >= 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]

回答:


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 :-)あなたは彼らがについて言う何を知っている畳み込み ...
ルイスMendo

5

CJam32 25 24バイト

1バイトを節約してくれたLuis Mendoに感謝します。

{(_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インデックス作成には1バイトかかりました。説明:g(j-1,i-1)+g(j-1,i+1)Pascalの三角形が最初の行(基本ケース)に達するまで再帰的に計算します。列の合計を取得するには、実際にmap3番目のパラメーターを渡すという事実を使用するため、この場合は追加の再帰的なステップがあります。


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

2バイトの節約を見つけてくれた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バイト

Neilのおかげで22バイト節約!

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

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

説明

この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))))))か?
ニール

@ニールはい!ありがとうございました!!
ルイスメンドー

4

05AB1E34 32 28 25 24バイト

-4エミニャに感謝します。

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が受け入れられない場合、+ 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*動作する必要があり、最後には必要ありません。
エミグナ

1
>Fすることができますƒ
エミグナ

すてきなキャッチ、私は常にÅ、スマートについて忘れています!私は、「アイデンティティリスト」または上のそのような何かのために、「CTRL + F」を保持info.txt...あわや
マジックタコ壺

私は最近、それらが存在することを覚え始めました:)
エミナ

1
なぜ転置はから13 x 5に変わるの5 x 11ですか?他の2つの列/行はどこに行きましたか?
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バイト節約しました。PHPバージョン5.5以降で動作するようになりました。array_columnは、このバージョンの新しい関数です
ヨルグヒュルサーマン

修正が短くなることがわかったときはうれしいです:-)
ルイスメンドー

以下に、24〜30バイトをさらに示しますarray_column()。行と列のカウントを入れ替えてドロップすることで、13バイト節約できます。$x=2*$j++-$i7バイトを節約します。$ jを上ではなく下にループすると、1(for($j=$i+1;$j--;))節約できます。出力からさらに3バイトをゴルフできます。
タイタス

@タイタスそれはあまりにも素敵でしたarray_column
ヨルクヒュルサーマン

いつかはバイトを節約できます。
タイタス

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

パイソン2140 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=31を囲む0の
リストで始まる場合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

ハスケル、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

ああ、#もう再帰的ではないので、インラインにすることができます:define fas f n=foldl1 z[d++p x++d|x<-[1..n],d<-[0<$[1..n-x]]]とdump #
-nimi

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)]

これは、パスカル三角形が二項係数で定義できるという事実を使用しています。取り外してみましたabs(x)range(-n+1,n)、それをすることによってrange(n)、次に使用しますlambda l:l[-1:0:-1]+lが、それは長かったです。

また、これは私にとって初めてのゴルフです。

二項式は私のものではなく、ここから取られました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.