ผลรวมของคอลัมน์ Pascal


29

ทุกคนที่นี่ส่วนใหญ่คุ้นเคยกับสามเหลี่ยมปาสคาล มันเกิดขึ้นจากแถวที่ต่อเนื่องกันซึ่งองค์ประกอบแต่ละอย่างเป็นผลรวมของเพื่อนบ้านทั้งสองด้านบนซ้ายและขวาบน นี่คือ5แถวแรก(ยืมจากสามเหลี่ยมสร้างปาสกาล ):

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

เราจะใช้สามเหลี่ยมของปาสคาลและแสดงผลบวกกับมัน (ฮ่าฮ่าฮ่า) สำหรับอินพุตที่กำหนดnเอาท์พุทผลรวมคอลัมน์ของnแถวแรกของสามเหลี่ยมปาสคาล ตัวอย่างเช่นสำหรับอินพุต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]ดังนั้นการส่งออกจะเป็น

โปรดทราบว่าคุณไม่จำเป็นต้องสร้างสามเหลี่ยมของปาสคาลเพื่อคำนวณผลรวม - นั่นก็ขึ้นอยู่กับการใช้งานของคุณถ้ามันสั้นกว่าที่จะทำหรือไม่

อินพุต

เป็นจำนวนเต็มบวกเดียวnกับในรูปแบบที่สะดวกใดn >= 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 ขอบคุณ :-) คุณจะรู้ว่าสิ่งที่พวกเขาพูดเกี่ยวกับบิด ...
หลุยส์ Mendo

5

CJam , 32 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 ไบต์

บันทึกแล้ว 3 ไบต์ด้วย 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

กรณีทดสอบ


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 ไบต์ต้องขอบคุณNeil !

@(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 จากนั้นแยก diagonals เป็นคอลัมน์

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 ไบต์

-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 ไม่เป็นที่ยอมรับจะไม่มี®>-Åการ®-Åแก้ไขสำหรับการ +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.txtheh ...
Magic Octopus Urn

ฉันเพิ่งจะเริ่มจำได้ว่าพวกเขามีอยู่จริง :)
Emigna

1
ทำไม transpose เปิดได้จาก13 x 5ไป5 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 ไบต์ ตอนนี้มันทำงานได้กับ PHP เวอร์ชั่นที่สูงกว่า 5.5 array_columnเป็นฟังก์ชั่นใหม่ในรุ่นนี้
JörgHülsermann

เป็นเรื่องที่ดีเมื่อการแก้ไขสั้นลง :-)
Luis Mendo

ที่นี่อีก 24-30 ไบต์บันทึก 13 array_column()ไบต์โดยการสลับแถวและคอลัมน์นับและวาง: $x=2*$j++-$iบันทึก 7 ไบต์ การวนซ้ำ $ j down แทนที่จะเป็น up สามารถบันทึกได้ 1 ( for($j=$i+1;$j--;)) และสามารถไบต์ได้อีก 3 ไบต์จากเอาต์พุต
ติตัส

@Titus มันก็ดีมากเช่นกันarray_column
JörgHü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 ไบต์

6 14 ไบต์บันทึกขอบคุณที่ @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.

คุณสามารถร่นฟังก์ชั่นการขยายไปยัง# r#n|d<-0<$[1..n]=d++r++d
nimi

โอ้ตอนนี้คุณสามารถ inline #เพราะมันไม่ได้อีกต่อไป recursive: กำหนดfเป็นและการถ่ายโอนข้อมูลf n=foldl1 z[d++p x++d|x<-[1..n],d<-[0<$[1..n-x]]] #
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)]

สิ่งนี้ใช้ความจริงที่ว่า Pascal Triangle สามารถกำหนดได้ด้วยสัมประสิทธิ์ทวินาม ฉันพยายามลบ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.