Tổng số cột của Pascal


29

Hầu hết mọi người ở đây đều quen thuộc với Tam giác của Pascal. Nó được hình thành bởi các hàng liên tiếp, trong đó mỗi phần tử là tổng của hai hàng xóm phía trên bên trái và phía trên bên phải của nó. Dưới đây là các 5hàng đầu tiên (mượn từ tam giác Tạo Pascal ):

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

Chúng ta sẽ lấy Tam giác của Pascal và thực hiện một số tiền trên đó (hah-ha). Đối với một đầu vào nhất định n, hãy xuất tổng cột của các nhàng đầu tiên của Tam giác Pascal. Ví dụ, đối với đầu vào 5, đầu ra sẽ được hình thành bởi

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

Vì vậy, đầu ra sẽ là [1, 1, 5, 4, 9, 4, 5, 1, 1].

Lưu ý rằng bạn không nhất thiết phải tạo Tam giác Pascal để tính tổng - tùy theo việc triển khai của bạn nếu nó ngắn hơn để làm như vậy hay không.

Đầu vào

Một số nguyên dương duy nhất nvới n >= 1 bất kỳ định dạng thuận tiện .

Đầu ra

Mảng / danh sách kết quả tổng hợp theo cột của các nhàng đầu tiên của tam giác Pascal, như đã nêu ở trên. Một lần nữa, trong bất kỳ định dạng phù hợp.

Quy tắc

  • Các dòng mới hoặc dấu cách hàng đầu hoặc dấu trắng đều là tùy chọn, miễn là bản thân các ký tự xếp hàng chính xác.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Ví dụ

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

Câu trả lời:


7

MATL , 16 byte

tZv=Gq:"t5BZ+]vs

Hãy thử trực tuyến!

Giải trình

Điều này liên tục áp dụng tích chập để tạo ra các hàng. Ví dụ: đối với đầu vào, n=5chúng tôi bắt đầu với hàng đầu tiên

0 0 0 0 1 0 0 0 0

Kết hợp với [1 0 1]cho

0 0 0 1 0 1 0 0 0

Lặp lại thao tác cho

0 0 1 0 2 0 1 0 0

sau đó

0 1 0 3 0 3 0 1 0

v.v ... Ghép các mảng này theo chiều dọc và tính tổng của từng cột cho kết quả.

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.

Tử vong! Tôi không thể cắt số byte của mình xuống một nửa; một chiếc mũ cho bạn
Bạch tuộc ma thuật Urn

3
@carusocomputing Cảm ơn :-) Bạn biết họ nói gì về tích chập ...
Luis Mendo

5

CJam , 32 25 24 byte

Cảm ơn Luis Mendo vì đã tiết kiệm 1 byte.

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

Hãy thử trực tuyến!

Giải trình

(       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 byte

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 chỉ mục chi phí cho tôi một byte. Giải thích: g(j-1,i-1)+g(j-1,i+1)tính toán đệ quy tam giác của Pascal cho đến khi đến hàng đầu tiên, đó là trường hợp cơ sở. Để có được tổng số cột, tôi sử dụng thực tế là mapthực sự vượt qua tham số thứ ba, do đó, có một bước đệ quy bổ sung khi đây là trường hợp.


5

JavaScript (ES6), 90 87 86 84 82 byte

Đã lưu 3 byte nhờ vào ETHproductions

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

Các trường hợp thử nghiệm


5

Toán học, 59 57 byte

Cảm ơn Martin Ender vì đã tìm được một khoản tiết kiệm hai byte!

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

Hàm thuần túy lấy đầu vào số nguyên dương và trả về danh sách các số nguyên. Nghĩa đen tạo ra tất cả các mục có liên quan của tam giác Pascal và tính tổng chúng một cách thích hợp.

Gửi trước đó (dễ đọc hơn một chút):

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

4

Octave , 84 67 45 byte

22 byte được lưu nhờ Neil !

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

Hãy thử trực tuyến!

Giải trình

Các pascalchức năng đưa ra một ma trận có chứa các giá trị trong tam giác 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

Để trích xuất các giá trị mong muốn, chúng ta lật theo chiều dọc ( flip), giữ phần tam giác dưới ( tril) và lật lại. Điều này mang lại

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 sau đó trích xuất các đường chéo dưới dạng cột

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

sumtính tổng của mỗi cột, cho kết quả.


Bạn không thể đơn giản hóa điều đó @(n)sum(spdiags(flip(tril(flip(pascal(n))))))?
Neil

@Neil Vâng! Cảm ơn bạn!!
Luis Mendo

4

05AB1E , 34 32 28 25 24 byte

-4 cảm ơn Emigna.

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

Hãy thử trực tuyến!


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.

Về cơ bản tất cả những gì nó làm là tạo ra điều này:

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

Chuyển nó:

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

Sau đó tổng hợp từng hàng:

0
1
1
5
4
9
4
5
1
1
0

Nếu một ở đầu và đuôi 0 là không thể chấp nhận được, ®>-Åisntead của ®-Åsửa chữa nó cho một hình phạt 1 byte.


Kết quả cho 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
-Å0thay vì >-Ý0*nên làm việc và không cần thiết ở cuối.
Emigna

1
>Fcó thể được ƒ.
Emigna

Bắt đẹp, tôi luôn quên Å, thông minh! Tôi đã giữ "ctrl + f" cho "danh sách nhận dạng" hoặc đại loại như thế trên info.txtheh ...
Bạch tuộc ma thuật Urn

Gần đây tôi mới bắt đầu nhớ rằng chúng tồn tại :)
Emigna

1
Tại sao chuyển vị biến nó từ 13 x 5thành 5 x 11? Hai cột / hàng còn lại sẽ đi đâu?
admBorkBork

4

PHP , 119 byte

số cột từ 1 đầu vào đến đầu vào -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);

Hãy thử trực tuyến!


@LuisMendo Cảm ơn bạn Tôi đã tìm thấy lỗi và nó tiết kiệm được 3 byte. Bây giờ nó hoạt động với phiên bản PHP lớn hơn 5.5. array_columnlà một chức năng mới trong phiên bản này
Jörg Hülsermann

Thật tuyệt khi một sự điều chỉnh hóa ra ngắn hơn :-)
Luis Mendo

Dưới đây là 24 đến 30 byte khác : Lưu 13 byte bằng cách hoán đổi hàng và số cột và thả array_column(). $x=2*$j++-$itiết kiệm 7 byte. Vòng lặp $ j xuống thay vì lên có thể tiết kiệm 1 ( for($j=$i+1;$j--;)). Và thêm 3 byte có thể được đánh golf từ đầu ra.
Tít

@Titus nó cũng rất hay sử dụngarray_column
Jörg Hülsermann

Một ngày nào đó nó sẽ tiết kiệm được byte.
Tít

3

Thạch , 12 byte

Ḷµc€j€0Ṛṙ"NS

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ḷµ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 byte

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 byte

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]

Hãy thử trực tuyến! hoặc dùng thử trực tuyến!

Đối vớin=3
Bắt đầu với một danh sách có nsố không bao quanh một - [[0, 0, 0, 1, 0, 0, 0]]
Tạo toàn bộ kim tự tháp

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

Xoay 90 and và tổng hợp mỗi hàng, loại bỏ hàng đầu tiên và cuối cùng (chỉ số không)

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

6 14 byte được lưu nhờ @nimi

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.

Bạn có thể rút ngắn chức năng đệm #thành r#n|d<-0<$[1..n]=d++r++d.
nimi

Ồ, bây giờ bạn có thể nội tuyến #, vì nó không còn đệ quy nữa: định nghĩa ff n=foldl1 z[d++p x++d|x<-[1..n],d<-[0<$[1..n-x]]]và kết xuất #.
nimi

1

Python 3, 124 ký tự

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

Điều này sử dụng thực tế là Tam giác Pascal có thể được xác định với các hệ số nhị thức. Tôi đã cố gắng loại bỏ abs(x)range(-n+1,n)bằng cách làm cho nórange(n) và sau đó sử dụng lambda l:l[-1:0:-1]+lnhưng nó dài hơn.

Ngoài ra đây là lần đầu tiên tôi chơi golf nên tôi hy vọng bạn tha thứ cho bất kỳ kẻ giả mạo nào.

Nhị thức không phải của tôi và được lấy từ đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.