สร้างสามเหลี่ยมปาสคาล


35

สามเหลี่ยมของปาสคาลนั้นสร้างขึ้นโดยเริ่มจาก 1 ในแถวแรก ในแถวถัดไปจำนวนจะถูกกำหนดโดยผลรวมของตัวเลขสองตัวที่อยู่เหนือมันไปทางซ้ายและขวา

เพื่อสาธิตนี่คือ 5 แถวแรกของสามเหลี่ยมปาสคาล:

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

ความท้าทาย

ได้รับอินพุตn (ให้ไว้ แต่สะดวกที่สุดในภาษาที่คุณเลือก) สร้างnแถวแรกของสามเหลี่ยมปาสคาล คุณอาจคิดว่าnเป็นจำนวนเต็มรวมระหว่าง 1 ถึง 25 จะต้องมีตัวแบ่งบรรทัดระหว่างแต่ละแถวและช่องว่างระหว่างแต่ละหมายเลข แต่นอกเหนือจากนั้นคุณสามารถจัดรูปแบบตามที่คุณต้องการ

นี่คือรหัสกอล์ฟดังนั้นทางออกที่สั้นที่สุดชนะ

ตัวอย่าง I / O

> 1
1
> 9
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1

หมายเหตุในแง่นี้มันเป็นเวอร์ชั่นที่เรียบง่ายของการกระจายบอล
Peter Taylor

@Peter Olson: คุณมีความคิดเห็นอย่างไรกับการตีความของวงล้อเฟตของ "คุณอาจจัดรูปแบบตามที่คุณต้องการ" ถ้าฉันทำตามการตีความของเขาฉันสามารถโกนได้ 18 ตัวอักษร
Steven Rumbalski

@StevenRumbalski เขาสบายดี มีการขึ้นบรรทัดใหม่ระหว่างแต่ละแถวและมีช่องว่างระหว่างแต่ละหมายเลขดังนั้นจึงเป็นไปตามเกณฑ์
Peter Olson

@ Peter Olson: ขอบคุณสำหรับการชี้แจง แล้วสมมติฐานของโทมัสทีที่นิยามไว้แล้ว?
Steven Rumbalski

4
@Gaffi อาจจะไม่ได้การยอมรับคำตอบทำให้ฉันรู้สึกว่าฉันกำลังสิ้นสุดการแข่งขันและท้อแท้คำตอบใหม่และอาจดีกว่า
Peter Olson

คำตอบ:


30

J , 12 ตัวอักษร

":@(!{:)\@i.

   I.5
0 1 2 3 4
   {: I.5
4
   (I.5) {: I.5
1 4 6 4 1
   (! {:) I.5
1 4 6 4 1
   ({!) \ I.5
1 0 0 0 0
1 1 0 0 0
1 2 1 0 0
1 3 3 1 0
1 4 6 4 1
   ": @ ({!) \ I.5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
   ( ": @ ({!.) \ @ i)` ''
+ + ----------------------------------
| + - + ------------------------------ + |
|| @ | + ------------------------- + - + ||
|| . || + - + + --------------------- | ฉัน |||
|| ||| \ | ------------------- + + || |||
|| ||| || + - + --------------- + ||| |||
|| ||| ||| @ | + - + + |||| ---------- |||
|| ||| ||| || ": | + - + ------ + ||||| |||
|| ||| ||| || || 2 | + - + - + |||||| |||
|| ||| ||| || || || | {: ||||||| |||
|| ||| ||| || || | + - + - + |||||| |||
|| ||| ||| || | + - + ------ + ||||| |||
|| ||| ||| | + - + + |||| ---------- |||
|| ||| || + - + --------------- + ||| |||
|| ||| | ------------------- + + || |||
|| || + - + + --------------------- | |||
|| | + ------------------------- + - + ||
| + - + ------------------------------ + |
+ + ----------------------------------

1
J เต้น GolfScript ไหม? น่าสนใจ ฉันต้องการจะดูคำอธิบายสำหรับรหัสนี้ถ้าคุณมีเวลา
Mr.Wizard

4
มันถูกแบ่งออกแล้ว แต่นี่คือทีละบรรทัดถ้าคุณต้องการภาษาอังกฤษเพิ่มเติม บรรทัด 1 i.5ส่งคืนห้าธรรมชาติแรก บรรทัดที่ 2 เพิ่ม{:"หาง" (ย้อนกลับล่าสุด) บรรทัดที่ 3 รวมเข้ากับ!"ไม่อยู่" (จำนวนชุดค่าผสม) บรรทัดที่ 4 (!{:)i.5เหมือนกัน แยกตัวเบ็ดออก ดังนั้น(!:)การดำเนินการที่แปลงn naturals แรกเป็นบรรทัดที่ n ของสามเหลี่ยม Pascal คือ สาย 5 นำไปใช้กับทุกคำนำหน้า (ทับขวา) ของ 0..4 แต่ J เติมในจุดที่ไม่ได้ใช้ด้วย 0 เพื่อให้การดำเนินงานเป็นบวก ( @) ":กับการดำเนินการจัดรูปแบบสตริง เจมาก ๆ โหวตขึ้น
JB

@JB ไม่ใช่! หมายถึงปัจจัยที่นี่? นอกจากนี้เราสามารถกำจัด @ ทางด้านขวา
กำหนด

@ArtemIce Monadic !หมายถึงปัจจัย dyadic !นับรวมกัน สุดท้าย@ในการ":@(!{:)\@i.เป็นเพียงมีเพื่อทำให้เรื่องนี้เป็นคำกริยาแบบสแตนด์อะโลน
ephemient

18

Python ขนาด 56 ไบต์

a=[1];exec"print a;a=map(sum,zip([0]+a,a+[0]));"*input()

ตัวอย่างการใช้งาน:

echo 9 | python filename.py

ผลิต:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]

1
+1 วิธีที่ฉลาดในการใช้execหลีกเลี่ยงการforวนซ้ำ
Steven Rumbalski


14

Mathematica: 36 (41?)


Mathematica มีBinomialฟังก์ชั่น แต่นั่นนำความสนุกออกมา ฉันเสนอ:

NestList[{0,##}+{##,0}&@@#&,{1},n-1]

บรรทัดด้านบนจะแสดงผลแบบขาดแถวเช่น:

{{1}, {1, 1}, {1, 2, 1}, {1, 3, 3, 1}, {1, 4, 6, 4, 1},
 {1, 5, 10, 10, 5, 1}, {1, 6, 15, 20, 15, 6, 1}}

เนื่องจากนี่เป็นรูปแบบพื้นฐานใน Mathematica ฉันคิดว่ามันจะเป็นที่ยอมรับ แต่เมื่อฉันอ่านกฎอีกครั้งฉันจึงคิดว่ามันอาจจะไม่เป็นเช่นนั้น การเพิ่มGrid@จะสร้างผลลัพธ์ที่ยอมรับได้โดยมีความยาวรวม41อักขระ:

Grid@NestList[{0,##}+{##,0}&@@#&,{1},n-1]

n = 6:

1                       
1   1                   
1   2   1               
1   3   3   1           
1   4   6   4   1       
1   5   10  10  5   1   
1   6   15  20  15  6   1

14

C, 522

แสดงให้เห็นถึงคำตอบ C ไม่ชัดเจนขึ้น! คะแนนโบนัสสำหรับการค้นหาตัวละครพิเศษ

#define returns return 0
#define fr for
#define twentyonechexpressis0 0
                                                                                i
                                                                               , x
                                                                              [ 52 ]
                                                                            [ 52] ,j, y
                                                                       ; main (c){fr (;i< c
                                                                    ; i++){ x[i][i]=x[ i][0]= 1
                                                         ; }for(i =2;i<c;i++){for (j=1;j<i;j++){x [i][j] =
                                    1 +x[i][j ]+x[i-1][j-1]+x[i-1] [j]+1-1+1-1+1-1+1-1+1-1+111-11- twentyonechexpressis0 -100-1; }
} ;for(i=0 ;i<c;i++){for(j=0;j<=i;j++){ printf("%3d%c",x[i][j],(1+1+1+1)*(1+1+1+1+1+1+1+1)) ;}putchar(1+1+(1<<1+1)+1+1+1+1+1+111111-111111-1);} /*thiscomment_takes28chars*/ returns; }

4
ฉันอดไม่ได้ที่จะรู้สึกว่ามันพลาดจุดของรหัสกอล์ฟ (ฉันไม่สามารถช่วยชี้ให้เห็นว่าอักขระพิเศษนั้นอยู่ในตำแหน่ง \ binom {5} {4})
ปีเตอร์เทย์เลอร์

2
มันเป็นความสนุกที่จะเขียน. โดยทั่วไปแล้วสิ่งที่ฉันมาเพื่อ codegolf สำหรับ
walpen

1
Clever :) มี upvote อาจไม่ใช่ผู้ชนะ แต่เป็นครีเอทีฟ!
Accatyyc

11

Golfscript (21 ตัวอักษร)

~]({0\{.@+\}/;1].p}*;

เนื่องจากมีการขอคำอธิบาย:

# Stack contains 'n'
~](
# Stack: [] n
{
    # prev_row is [\binom{i,0} ... \binom{i,i}]
    # We loop to generate almost all of the next row as
    #     [(\binom{i,-1} + \binom{i,0}) ... (\binom{i,i-1} + \binom{i,i})]
    # \binom{i,-1} is, of course, 0
    # Stack: prev_row
    0\
    # Stack: 0 prev_row
    {
        # Stack: ... \binom{i,j-1} \binom{i,j}
        .@+\
        # Stack: ... (\binom{i,j-1} + \binom{i,j}) \binom{i,j}
    }/
    # Stack: \binom{i+1,0} ... \binom{i+1,i} \binom{i,i}
    # unless it's the first time round, when we still have 0
    # so we need to pop and then push a 1 for \binom{i+1,i+1}
    ;1]
    # next_row
    .p
}*
# final_row
;

คุณอาจต้องการลองgolf.shinh.org/p.rb?pascal+triangle
Nabb

คุณกรุณาให้รหัสหลอกหรือคำอธิบายบางอย่างได้ไหม ฉันเข้าใจว่าเกิดอะไรขึ้น แต่ฉันไม่เข้าใจส่วนการแลกเปลี่ยนทั้งหมด
Rob

ขอบคุณสำหรับคำอธิบายโดยละเอียดและคำตอบที่ยอดเยี่ยม (+1) แต่ตอนนี้ฉันสับสนมากขึ้น ตรรกะ (กระบวนการ) ไม่ถูกต้อง
Rob

@ MikeDtrick มีข้อผิดพลาดเล็กน้อยในคำอธิบาย นอกจากนี้ยังมีจุดเล็ก ๆ ที่จำเป็นต้องอธิบาย แต่ที่ฉันพลาดเพราะมันนานมากตั้งแต่ฉันเขียนรหัส
ปีเตอร์เทย์เลอร์

โอเคมันเริ่มมีเหตุผลแล้ว คำถามสุดท้ายของฉันคือกระบวนการพิมพ์และการดำเนินการทำงานจากบนลงล่างหรือล่างขึ้นบน (1, 1 1, 1 2 1: บนลงล่าง, 1 2 1, 1 1, 1: 1 จากล่างขึ้นบน)
Rob

7

Haskell, 94 92

f=[1]:[zipWith(+)(0:x)x++[1]|x<-f]
main=readLn>>=mapM_(putStrLn.unwords.map show).(`take`f)

เอาท์พุท:

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

อักขระ 71 ตัวซึ่งไม่พิมพ์ช่องว่างระหว่างแต่ละหมายเลข:

f=[1]:[zipWith(+)(0:x)x++[1]|x<-f]
main=readLn>>=mapM_ print.(`take`f)

เอาท์พุท:

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

คุณสามารถบันทึกตัวอักษรโดยใช้แทนmapM mapM_
dfeuer

7

สกาลา, 81 78 72 70 ตัวละคร

81 chars: ครั้งแรกที่คัดลอกมาจากรุ่น Python อย่างไร้ยางอาย :)

var x=Seq(1)
for(i<-1 to args(0).toInt){println(x)
x=(0+:x,x:+0).zipped.map(_+_)}

เรียกใช้เป็นสคริปต์หรือโดยตรงใน REPL

ตัดถึง 70 ตัวอักษรด้วยบางสิ่งที่สามารถอ่านและสำนวนที่น่าประหลาดใจ:

Seq.iterate(Seq(1),readInt)(a=>(0+:a,a:+0).zipped.map(_+_))map println

หรือ72 70 ตัวอักษรด้วยวิธีที่แตกต่างกันโดยสิ้นเชิง:

0 to(readInt-1)map(i=>println(0 to i map(1 to i combinations(_)size)))

+ 1 สำหรับการคัดลอกที่ไร้ยางอาย!
Steven Rumbalski

รุ่นสุดท้ายควรใช้อย่างระมัดระวังสำหรับค่าใหญ่ของ readInt เช่น 50;)
ที่ไม่รู้จักผู้ใช้

@userunknown สันนิษฐานว่าทำไมคำถามที่ระบุขีด จำกัด บนของ 25 ...
Luigi Plinge

มันไม่ได้หมายความว่าเป็นคำวิจารณ์เช่นเดียวกับคำเตือนสำหรับผู้อยากรู้อยากเห็น
ไม่ทราบผู้ใช้

6

Ruby: 51 49 46 ตัวอักษร

(รหัส 45 ตัวอักษร + ตัวเลือกบรรทัดคำสั่ง 1 ตัวอักษร)

p=[];$_.to_i.times{n=0;p p.map!{|i|n+n=i}<<1}

ขอบคุณที่:

  • jsvnmสำหรับการแนะนำทางเลือกสำหรับการสลับค่า (2 ตัวอักษร)
  • GBสำหรับการจำแนกตัวแปรที่ไม่ได้ใช้หลังจากการปรับปรุงก่อนหน้านี้ (4 ตัวอักษร)

วิ่งตัวอย่าง:

bash-4.4$ ruby -ne 'p=[];$_.to_i.times{n=0;p p.map!{|i|n+n=i}<<1}' <<< 1
[1]

bash-4.4$ ruby -ne 'p=[];$_.to_i.times{n=0;p p.map!{|i|n+n=i}<<1}' <<< 9
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]

ลองออนไลน์!


1
คุณสามารถบันทึก 2 ตัวอักษรด้วยp.map!{|i|(v=n)+n=i}
jsvnm

เยี่ยมมาก @jsvnm! ผู้ชายนานแค่ไหนที่ฉันรวมกันเพื่อตัดทอนส่วนนั้น ขอบคุณ
จัดการ

1
อาจจะสายไปหน่อย แต่: ทำไมต้องใช้ตัวแปร v
GB

เยี่ยมมาก @GB! ที่ทิ้งไว้ข้างหลังจากการแก้ไขครั้งแรกที่ ... ที่ไหน ... doh ที่ไหนก็ไร้ประโยชน์เช่นกัน .mapผมคิดว่ามันมาจากความพยายามก่อนหน้านี้เมื่อนำมาใช้ ขอขอบคุณ.
จัดการ

5

JavaScript ( 90 85 83 81)

for(n=prompt(o=i='');i++<n;o+='\n')for(s=j=1;j<=i;s=s*(i-j)/j++)o+=s+' ';alert(o)

สาธิต: http://jsfiddle.net/tcRCS/3/

หมายเหตุ : ไม่สามารถใช้งานได้ดีในทางปฏิบัติประมาณ n> 30 เนื่องจากตัวเลขล้นข้อมูลชนิดจำนวนเต็มในตัวและกลายเป็นตัวเลขทศนิยม


แก้ไข 1 : ถูกลบออก 5 ตัวอักษรโดยการแปลงwhileไปforและการรวมงบ

แก้ไข 2 : ย้ายs=ข้อความภายในforและบันทึก 2 ตัวอักษร

แก้ไข 3 : รวมs=1,j=1initializer เข้ากับs=j=1และบันทึก 2 ตัวอักษร


ดี! คุณสามารถบันทึกตัวละครได้อีกหนึ่งตัวโดยเปลี่ยน "s = s * ... " เป็น "s * = ... "
Derek Kurth

@DerekKurth: ผมคิดว่าเมื่อผมเป็นคนแรกที่ทำเพิ่มประสิทธิภาพ แต่ที่จะเลอะตรรกะเพราะมันจะต้องไม่s*(i-j)/j s*((i-j)/j)
mellamokb

อืมฉันลองเป็น s * = ... ใน jsfiddle แล้วมันก็ใช้ได้ บางทีฉันอาจทำอะไรผิด
Derek Kurth

1
@DerekKurth: ในทางเทคนิคมันเหมือนกัน แต่ความคิดคือถ้าคุณคูณด้วย(i-j)ก่อนหารด้วยjก็ไม่จำเป็นต้องใช้เลขทศนิยมเพราะผลลัพธ์ควรเป็นจำนวนเต็มเสมอ หากคุณทำ((i-j)/j)ก่อนสิ่งนี้จะส่งผลให้มีค่าทศนิยมซึ่งอาจเป็นแหล่งที่มาของข้อผิดพลาดและอย่างน้อยที่สุดจะต้องมีรหัสพิเศษสำหรับการปัดเศษ / ตัดปลาย คุณจะไม่เห็นสิ่งนี้จนกว่าจะถึงn>11และคุณจะเห็นค่าทศนิยมในผลลัพธ์เช่น1 11 55 165 330 461.99999999999994 461.99999999999994...
mellamokb

อ่านั่นสมเหตุสมผลแล้ว!
Derek Kurth

5

R, 39 ตัวอักษร

R น่าจะเป็นเครื่องมือที่เหมาะสมที่สุดสำหรับงานนี้ :-)

x=1;for(i in 1:n)x=c(print(x),0)+c(0,x)

3
คุณไม่มีข้อกำหนดอย่างใดอย่างหนึ่ง: "ได้รับอินพุต n (หากสะดวกที่สุดในภาษาที่คุณเลือก)"
Steven Rumbalski

@ สตีเว่น "ให้อินพุต n" ... ดังนั้นฉันอาจจะคิดว่าnจะได้รับ? ฉันแก้ไขรหัสแล้ว ตกลงหรือไม่
โทมัส

ฉันขอให้ปีเตอร์โอลสันชี้แจง
Steven Rumbalski

@StevenRumbalski ฉันไม่คิดว่ามันจะถูกต้องเว้นแต่จะใช้การป้อนข้อมูล ฉันไม่ทราบว่า R ดังนั้นคอมไพเลอร์อาจทำเพื่อให้ตัวแปรที่ไม่ได้กำหนดพร้อมท์อินพุตดังนั้นมันอาจจะโอเค แต่ถ้ามันเหมือนกับภาษาอื่น ๆ ส่วนใหญ่ในเรื่องนั้นฉันไม่คิดว่ามันจะเป็น
Peter Olson

1
โดยทั่วไปnจะต้องจัดหาจากแหล่งข้อมูลภายนอก ณ เวลารันไทม์และอุปกรณ์สำหรับจับภาพนั้นรวมอยู่ในโปรแกรมของคุณ โดยทั่วไปหมายถึงอาร์กิวเมนต์บรรทัดคำสั่งหรือ stdin หรือไฟล์ โดยไฟล์นั้นแทบจะไม่เคยใช้เพราะมันยาวกว่าตัวเลือกอีกสองตัวอย่างสม่ำเสมอ
Steven Rumbalski

5

ใน Q (25 ตัวอักษร / 20 พร้อมเวอร์ชั่นที่สั้นกว่า)

t:{(x-1) (p:{0+':x,0})\1}

สั้น

t:{(x-1){0+':x,0}\1}

ตัวอย่างการใช้งาน:

q)t 4
1
1 1
1 2 1
1 3 3 1

หรือมิฉะนั้นตัวละคร 20 ตัวt:{(x-1){0+':x,0}\1}
skeevey

ดีสั้นกว่าโซลูชัน GolfScript ทันที
sinedcm

4

awk - 73 ตัวอักษร

การดำเนินการที่ค่อนข้างตรงไปตรงมา:

{for(i=0;i<$1;++i)for(j=i;j>=0;)printf"%d%c",Y[j]+=i?Y[j-1]:1,j--?32:10}

วิ่งตัวอย่าง:

% awk -f pascal.awk <<<10
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1


4

Perl, 47 54 ตัวอักษร

$p=1;map{print"@{[split//,$p]}\n";$p*=11}1..<>

ใช้ตัวเลขจากบรรทัดคำสั่ง แต่ไม่ได้ทำการตรวจสอบข้อผิดพลาดใด ๆ

เพิ่งรู้ว่ามันใช้งานได้ถึง n = 4 มันเป็นรหัสเก่าที่ฉันมีใน hd ของฉัน

งานนี้แม้ว่า:

map{@a=(1,map$a[$_-1]+=$a[$_],1..@a);print"@a\n"}a..n

แม้ว่าจะต้องมีการป้อนข้อมูลลงในสคริปต์แม้ว่ามันจะเป็นหนึ่งตัวอักษรมากขึ้น



3

Perl, 77 ตัวอักษร

$o[0]=1;for(1..<>){$"=" ";for(1..$_){$n[$_]=$o[$_]+$o[$_-1]}@o=@n;print"@o
"}

ตัวอย่างอินพุต

5

ตัวอย่างผลลัพธ์

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

3

C, 132 127 ตัวอักษร

c[25][25],n,i,j;main(){for(scanf("%d",&n);i<n;i++)for(j=0;j<=i;j++)printf("%d%c",c[i][j]=j?c[i-1][j-1]+c[i-1][j]:1,i-j?32:10);}

3

Pascal: 216 192 ตัวอักษร

(ไม่ใช่คู่แข่งที่แท้จริงมี แต่การแสดงความเคารพ)

var p:array[0..1,0..25]of LongInt;i,j,n,u:Word;begin
Read(n);u:=0;for i:=1to n do begin
p[1,1]:=1;for j:=1to i do begin
p[u,j]:=p[1-u,j-1]+p[1-u,j];Write(p[u,j],' ')end;u:=1-u;Writeln
end
end.

วิ่งตัวอย่าง:

bash-4.2$ fpc pascal.pas 
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?

bash-4.2$ ./pascal <<< 1
1 

bash-4.2$ ./pascal <<< 9
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
1 6 15 20 15 6 1 
1 7 21 35 35 21 7 1 
1 8 28 56 70 56 28 8 1 

3

MATL 10 ไบต์

ภาษาที่สร้างขึ้นหลังจากการท้าทายนี้

1iq:"tTTY+

ลองออนไลน์!

1       % Push a 1. This will be the first row
iq:     % Take input n. Generate range [1,2,...,n-1]
"       % For each (that is, repeat n-1 times)
  t     %   Duplicate latest row
  TT    %   Push [1 1]
  Y+    %   Convolve latest row with [1 1] to produce next row
        % Implicitly end for each
        % Implicitly display stack contents

ไม่ใช่การแข่งขัน แต่เป็นหายนะอันศักดิ์สิทธิ์ไม่มีจากการส่งครั้งก่อน (แม้แต่ J) ประสบความสำเร็จในการลดมันให้มากขึ้นเท่าที่Matlทำได้ !!!
Abr001am

ฉันค่อนข้างมั่นใจว่า Jelly หรือ 05AB1E น่าจะสั้นกว่านี้ :-)
Luis Mendo

2

D 134 128 ตัวอักษร

import std.stdio;void main(){int n,m;int[]l,k=[0,1];readf("%d",&n);foreach(i;0..n){writeln(l=k~0);k=[];foreach(e;l)k~=m+(m=e);}}

ผลลัพธ์สำหรับ 9 คือ

>9
[0, 1, 0]
[0, 1, 1, 0]
[0, 1, 2, 1, 0]
[0, 1, 3, 3, 1, 0]
[0, 1, 4, 6, 4, 1, 0]
[0, 1, 5, 10, 10, 5, 1, 0]
[0, 1, 6, 15, 20, 15, 6, 1, 0]
[0, 1, 7, 21, 35, 35, 21, 7, 1, 0]
[0, 1, 8, 28, 56, 70, 56, 28, 8, 1, 0]

ใช้ประโยชน์จาก "คุณสามารถจัดรูปแบบได้ตามต้องการ"; มีช่องว่างระหว่างแต่ละหมายเลขและ linebreak

แก้ไขเปลี่ยนตำแหน่งการมอบหมายให้lเป็นโกนอักขระบางตัว


2

สกาลา, 131 ตัวอักษร

object P extends App{var x=List(1)
while(x.size<=args(0).toInt){println(x.mkString(" "))
x=(0+:x:+0).sliding(2).map(_.sum).toList}}

รับอินพุตจากบรรทัดรับคำสั่ง

เอาต์พุตสำหรับ n = 10:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1

มีอะไรกับ0:-) เหล่านั้นทั้งหมด?
mellamokb

@mellamokb การจัดเรียงอีกเล็กน้อยทำให้พวกเขาหายไปและทำให้รหัสสั้นลง :-)
Gareth

2

F♯ - 203 ตัวอักษร

ความพยายามครั้งแรกของฉันในรอบของการตีกอล์ฟและความพยายามครั้งแรกในการเขียนโปรแกรมการทำงาน อาจมีวิธีที่ชัดเจนบางอย่างที่จะย่อให้สั้นลงฉันยังไม่ได้คิดออกเลย มันเป็นไปตามคอมไพเลอร์ VS2010s F♯ (ซึ่งมีผลกระทบจากการรัน #light โดยค่าเริ่มต้นซึ่งแตกต่างจากรุ่นก่อนหน้า) และยังทำงานในล่ามF♯ รับอินพุตจาก stdin หวังว่าจะมีวิธีที่ดีกว่าสำหรับอินพุต / เอาต์พุตแม้ว่า! ตัวละครมากมาย!

open System
let rec C r m =if r=0||m<=0||m>=r then 1 else C(r-1)m+C(r-1)(m-1)
for j = 0 to Convert.ToInt32(Console.ReadLine ()) do (
 [0..j]|>List.map(C j)|>List.iter(fun k->printf "%i " k)
 printf "\n")

2

ทำไมไม่มีคำตอบที่ยอมรับสำหรับคำถามนี้

VBA - 249 ตัวอักษร

Sub t(n)
ReDim a(1 To n,1 To n*2)
a(1,n)=1:y=vbCr:z=" ":d=z & 1 & z & y:For b=2 To n:For c=1 To n*2:x=a(b-1,c)
If c>1 Then a(b,c)=a(b-1,c-1)+x
If c<n*2 Then a(b,c)=a(b-1,c+1)+x
d=IIf(a(b,c)<>0,d & z & a(b,c) & z,d):Next:d=d & y:Next:MsgBox d
End Sub

2

postscript - 59 chars (63 ถ้าคุณนับ-dn=เพื่อให้ได้จำนวนแถว)

[1]n{dup ==[0 3 2 roll{dup 3 2 roll add exch}forall]}repeat

ทำงานด้วย

gs -q -dn=10 -dBATCH pascal.ps 

เพื่อรับ

[1]
[1 1]
[1 2 1]
[1 3 3 1]
[1 4 6 4 1]
[1 5 10 10 5 1]
[1 6 15 20 15 6 1]
[1 7 21 35 35 21 7 1]
[1 8 28 56 70 56 28 8 1]
[1 9 36 84 126 126 84 36 9 1]

2

Mathematica 35 ตัวอักษร

นี่คือวิธีที่น่าเบื่อและขี้เกียจของการแบ่งสามเหลี่ยมปาสคาล:

Table[n~Binomial~k,{n,0,5},{k,0,n}]

(* out *)
{{1}, {1, 1}, {1, 2, 1}, {1, 3, 3, 1}, {1, 4, 6, 4, 1}, {1, 5, 10, 10,5, 1}}

2

APL, 19 15 ตัวอักษร

สายไปงานเลี้ยงบางที

{⍪{⍵!⍨⍳⍵+1}¨⍳⍵}

แม้ว่ามันจะไม่ชนะรายการ J

นี้อนุมานว่าต้นกำเนิดดัชนี ( ⎕IO) 0ตั้ง น่าเสียดายที่มีที่มาของดัชนี1เราต้องการ25 18 ตัวอักษร:

{⍪{⍵!⍨0,⍳⍵}¨1-⍨⍳⍵}

มีสองรหัสในการแสดงความไม่พอใจของฉัน

การสาธิต:

      {⍪{⍵!⍨⍳⍵+1}¨⍳⍵}5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

คำอธิบาย

เวอร์ชั่นสั้น:

  • ⍳⍵(ที่มีจุดกำเนิดดัชนี 0) สร้างอาร์เรย์ของตัวเลขตั้งแต่ 0 ถึง⍵-1รวมโดยที่อาร์กิวเมนต์ที่ถูกต้องสำหรับฟังก์ชัน
  • ⍳⍵+1 สร้างตัวเลขทั้งหมดตั้งแต่ 0 ถึง
  • {⍵!⍨⍳⍵+1}สร้างเลือกkสำหรับทุกองค์ประกอบในk (การเดินทาง) แลกเปลี่ยนผู้ประกอบการขัดแย้งกับการทำงานรอบเช่นว่าอาร์กิวเมนต์ขวามือจะกลายเป็นซ้ายและในทางกลับกัน⍳⍵+1
  • {⍵!⍨⍳⍵+1}¨⍳⍵ผ่านแต่ละองค์ประกอบในการ⍳⍵ใช้ตัวดำเนินการ¨(แต่ละตัว) ผลลัพธ์คืออาร์เรย์หนึ่งมิติที่มีแถวแรกของสามเหลี่ยม Pascal
  • อาร์กิวเมนต์รูปแบบหนึ่งของการใช้เวกเตอร์หนึ่งมิติและทำให้เป็นคอลัมน์แทนที่จะเป็นแถว แต่ละแถวของรูปสามเหลี่ยมจะถูกวางในบรรทัดของตัวเอง

คำตอบยาว:

  • เหมือนกับรุ่นอื่นยกเว้นที่1-⍨วางไว้ก่อนหน้าเพื่อทำซ้ำจุดกำเนิดดัชนี 0
  • 0,⍳⍵ที่มีต้นกำเนิดดัชนีเป็น 1 ซ้ำ⍳⍵+1ด้วยต้นกำเนิดดัชนีเป็น 0

2

เมเปิ้ล, 46

seq(print(seq(binomial(i,k),k=0..i)),i=0..n-1)

การใช้งาน:

> f:=n->seq(print(seq(binomial(i,k),k=0..i)),i=0..n-1);
> f(3)
    1
   1 1
  1 2 1

2

VBA, 162 142 102 80 ไบต์

บันทึก 22 ไบต์ขอบคุณ Taylor Scott

นี่เป็นคำถามเก่าตอนนี้ แต่ฉันเห็นคำตอบที่สั้นกว่าสำหรับ VBA

[B2].Resize([A1],[A1])="=IF(COLUMN()>ROW(),"""",IF(ROW()=2,1,IFERROR(A1+B1,1)))"

นี่หมายความว่าจะทำงานในหน้าต่างทันที อินพุตอยู่ในเซลล์A1ของแผ่นงานที่ใช้งานอยู่ เอาต์พุตอยู่ในเวิร์กชีตที่ใช้งานเริ่มต้นB2และใช้อย่างไรก็ตามจำเป็นต้องมีเซลล์จำนวนมากตามอินพุต การCOLUMN()>ROW()ตรวจสอบจะทำให้มุมบนขวาของสามเหลี่ยมว่าง การROW()=2ตรวจสอบทำให้ค่าแรก1เพื่อเริ่มต้นสามเหลี่ยม ฉันสามารถเลื่อนเอาท์พุทลงและลดการตรวจสอบนี้ได้ แต่มันแนะนำเอาท์พุทภายนอกมากมายก่อนสามเหลี่ยมจริงและฉันไม่รู้สึกว่ามันอยู่ในจิตวิญญาณของความท้าทาย

ฉันโพสต์วิธีการที่ซับซ้อนกว่าเดิมมากซึ่งคำนวณทุกค่าตามแถวและคอลัมน์ อย่างไรก็ตามวิธีการทั้งหมดนี้จะใช้สูตรในเซลล์ ฉันเริ่มต้นB2เพื่อให้ฉันสามารถอ้างอิงแถวด้านบนโดยไม่มี#REF!ข้อผิดพลาด จากนั้นคัดลอกและวางสูตรเดียวกันซ้ำบล็อกของเซลล์nกว้างและnสูง อินพุตและเอาต์พุตสำหรับn=25มีลักษณะดังนี้:

เอาท์พุต


คำตอบที่ยอดเยี่ยมมาก แต่คุณสามารถตีกอล์ฟนี้ได้เล็กน้อย การแปลงFunction p(r)เป็นSub p(r)เนื่องจากคุณไม่มีค่าเอาต์พุตของฟังก์ชันเอาพื้นที่ออกจากdebug.? c(n,k);และแปลงif-then-elseคำสั่งหลายบรรทัดเป็นบรรทัดเดียว ( If k Then c=c(n-1,k-1)*n/k Else c=1) ทำให้นับไบต์ลงไป130ตามจำนวนของฉัน
Taylor Scott

@TaylorScott ขอบคุณ! ฉันค่อนข้างใหม่ในการเล่นกอล์ฟและมีความใหม่ในการเขียนโปรแกรมโดยทั่วไปเพียงเล็กน้อยเท่านั้น ฉันนับ 142 เพราะการขึ้นบรรทัดใหม่ จากสิ่งที่ฉันพบพวกมันควรจะนับ
Engineer Toast

อาคุณถูกต้องฉันลืมนับบรรทัดใหม่ของฉันและปรากฏว่าอย่างน้อยหนึ่งเคล็ดลับการเล่นกอล์ฟอื่น ๆFor n=0 To...สามารถย่อเพื่อFor n=0To...นำรหัสรุ่นของฉันไปที่Sub p(r):For n=0To r-1:For k=0To n:Debug.?c(n,k);:Next:Debug.?:Next:End Sub Function c(n,k):If k Then c=1 Else c=c(n-1,k-1)*n/k[char (10)] End Functionด้วยจำนวนไบต์ของ139
Taylor Scott

ดูที่สองที่นี้แสดงให้เห็นว่าถ้าคุณทำลายมันลงฟังก์ชั่นหน้าต่างทันทีที่มีฟังก์ชั่นผู้ช่วย, คุณจะได้รับมันลงไป 112 ไบต์ (หน้าต่างทันทีฟังก์ชัน: For n=0To[A1-1]:For k=0To n:?c(n,k);:Next:?:NextHelper ฟังก์ชั่น: Function c(n,k) If k Then c=c(n-1,k-1)*n/k Else c=1 End Function)
เทย์เลอร์สกอตต์

1
@TaylorScott แล้วจะทิ้งพวกมันไปโดยสิ้นเชิงล่ะ? ด้วยการเปลี่ยนแปลงของสูตรมันใช้งานได้ดี ฉันคิดว่าผลลัพธ์ที่เริ่มต้นB2แทนที่จะA1เป็นที่ยอมรับได้
Engineer Toast

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.