파스칼의 열 합계


29

여기에있는 대부분의 사람들은 파스칼의 트라이앵글에 익숙합니다. 연속적인 행으로 구성되며 각 요소는 왼쪽 상단과 오른쪽 상단의 두 이웃의 합입니다. 첫 번째 5행은 Generate Pascal의 triangle 에서 차용 한 것입니다 .

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

우리는 Pascal의 Triangle을 가져 와서 그것에 대한 합을 수행 할 것입니다 (hah-ha). 주어진 입력 n에 대해 n파스칼 삼각형 의 첫 번째 행의 열 합계를 출력합니다 . 예를 들어 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].

합계를 계산하기 위해 반드시 파스칼의 삼각형을 생성 할 필요는 없습니다.

입력

하나의 양의 정수 nn >= 1 편리한 형식 .

산출

n위에서 설명한 파스칼 삼각형 의 첫 번째 행에 대한 열별 합의 결과 배열 / 목록입니다 . 다시, 어떤 적절한 형식으로.

규칙

  • 문자 자체가 올바르게 정렬되는 한 줄 바꿈 또는 공백은 모두 선택 사항입니다.
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 가능하면 다른 사람들이 귀하의 코드를 시험해 볼 수 있도록 온라인 테스트 환경에 대한 링크를 포함하십시오!
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

[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.

숙명! 바이트 수를 반으로 줄일 수 없습니다. 당신에게 모자의 끝.
Magic Octopus Urn

3
@carusocomputing 감사합니다 :-) 당신은 그들이 회선 에 대해 무슨 말을하는지 알고 ...
Luis Mendo

5

CJam , 32 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

자바 스크립트 (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)파스칼의 삼각형이 기본 행인 첫 번째 행에 도달 할 때까지 재귀 적으로 계산합니다. 열 합계를 얻으려면 map실제로 세 번째 매개 변수를 전달 한다는 사실을 사용 하므로이 경우 추가 재귀 단계가 있습니다.


5

자바 스크립트 (ES6), 90 87 86 84 82 바이트

ETH 프로덕션 덕분에 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))))))없습니까?
Neil

@ 닐 네! 고맙습니다!!
Luis Mendo

4

05AB1E , 34 32 28 25 24 바이트

Emigna에게 -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, 허용되지 않는다 ®>-Å의 isntead ®-Å+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이 버전의 새로운 기능입니다
Jörg Hülsermann

수정이 더 짧은 것으로 판명되면 좋네요 :-)
Luis Mendo

또 다른 24 ~ 30 바이트는 다음과 같습니다 . 행과 열 수를 바꾸고 삭제하여 13 바이트를 절약하십시오 array_column(). $x=2*$j++-$i7 바이트를 절약합니다. 위로 대신 $ j를 반복하면 1 ( for($j=$i+1;$j--;))을 절약 할 수 있습니다 . 그리고 출력에서 ​​3 바이트를 더 깎을 수 있습니다.
Titus

@Titus 너무 사용하기 좋았습니다array_column
Jörg Hülsermann

언젠가는 바이트를 절약합니다.
Titus

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

파이썬 (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, 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

아, 이제 #더 이상 재귀 적이 지 않기 때문에 inline 할 수 있습니다 : fas f n=foldl1 z[d++p x++d|x<-[1..n],d<-[0<$[1..n-x]]]및 dump 정의하십시오 #.
nimi

1

파이썬 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.