Hasilkan segitiga Pascal

35

Segitiga Pascal dihasilkan dengan memulai dengan 1 pada baris pertama. Pada baris berikutnya, angka ditentukan oleh jumlah dari dua angka tepat di atasnya ke kiri dan kanan.

Untuk menunjukkan, inilah 5 baris pertama segitiga Pascal:

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

Tantangan

Diberikan input n (asalkan disediakan paling mudah dalam bahasa pilihan Anda), buat n baris pertama dari segitiga Pascal. Anda dapat mengasumsikan bahwa n adalah bilangan bulat yang inklusif antara 1 dan 25. Harus ada jeda baris antara setiap baris dan spasi antara setiap angka, tetapi selain itu, Anda dapat memformatnya sesuka Anda.

Ini adalah kode-golf , sehingga solusi terpendek menang.

Contoh 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 Olson
sumber
NB Dalam arti tertentu ini adalah versi yang disederhanakan dari Mendistribusikan bola
Peter Taylor
@ Peter Olson: Apa pendapat Anda tentang interpretasi orang aneh ratchet tentang "Anda dapat memformatnya sesuka Anda"? Jika saya mengikuti interpretasinya saya bisa mencukur 18 karakter.
Steven Rumbalski
@ SevenRumbalski Dia baik-baik saja. Ada baris baru di antara setiap baris, dan ada spasi di antara setiap angka, sehingga memenuhi kriteria.
Peter Olson
@ Peter Olson: Terima kasih atas klarifikasi. Bagaimana dengan asumsi Tomas T bahwa n sudah didefinisikan?
Steven Rumbalski
4
@ Gaffi Mungkin tidak, menerima jawaban membuat saya merasa seperti mengakhiri kontes dan mengecilkan jawaban baru dan mungkin lebih baik.
Peter Olson

Jawaban:

30

J , 12 karakter

":@(!{:)\@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.)` ''
+ ---------------------------------- +
| + - + ------------------------------ + |
|| @ | + ------------------------- + - + ||
|| || + - + --------------------- + | i. |||
|| ||| \ | + ------------------- + || |||
|| ||| || + - + --------------- + ||| |||
|| ||| ||| @ | + + - + ---------- + |||| |||
|| ||| ||| || ": | + - + ------ + ||||| |||
|| ||| ||| || || 2 | + - + - + |||||| |||
|| ||| ||| || || ||! | {: ||||||| |||
|| ||| ||| || || | + - + - + |||||| |||
|| ||| ||| || | + - + ------ + ||||| |||
|| ||| ||| | + - + ---------- + |||| |||
|| ||| || + - + --------------- + ||| |||
|| ||| | + ------------------- + || |||
|| || + - + --------------------- + | |||
|| | + ------------------------- + - + ||
| + - + ------------------------------ + |
+ ---------------------------------- +
singkat
sumber
1
J mengalahkan GolfScript? Menarik. Saya ingin melihat penjelasan untuk kode ini, jika Anda punya waktu.
Mr.Wizard
4
Sudah dibagi, tapi ini baris demi baris jika Anda ingin bahasa Inggris tambahan. Baris 1 i.5mengembalikan lima alami pertama. Baris 2 menambahkan {:"Tail" (kembali terakhir). Baris 3 menggabungkannya dengan !"Keluar Dari" (jumlah kombinasi). Jalur 4 (!{:)i.5sama. memfaktorkan keluar. Jadi (!:)adalah operasi yang mengubah n alami pertama ke garis n segitiga Pascal. Baris 5 menerapkannya ke semua Awalan (garis miring terbalik) 0..4, tetapi J mengisi titik-titik yang tidak digunakan dengan 0, sehingga operasi digabungkan ( @) dengan operasi pemformatan string ":. Sangat keren, terbalik.
JB
@JB Bukan! berarti faktorial di sini? Kita juga bisa menyingkirkan @ di kanan.
defhlt
@ArtemIce Monadic !berarti faktorial; !jumlah kombinasi diad . Yang terakhir @di ":@(!{:)\@i.sana hanya untuk membuat ini kata kerja yang berdiri sendiri.
ephemient
18

Python, 56 Bytes

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

Penggunaan sampel:

echo 9 | python filename.py

Menghasilkan:

[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]
primo
sumber
1
+1 Cara pintar untuk menggunakan execmenghindari forloop.
Steven Rumbalski
15

Python, 94 91 88 70 70 63 karakter

x=[1]
for i in input()*x:
 print x
 x=map(sum,zip([0]+x,x+[0]))
Steven Rumbalski
sumber
14

Mathematica: 36 (41?)


Mathematica memiliki Binomialfungsi, tetapi hal itu tidak menyenangkan. Saya melamar:

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

Baris di atas akan merender array yang rusak seperti:

{{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}}

Karena ini adalah format dasar dalam Mathematica saya pikir itu akan dapat diterima, tetapi ketika saya membaca aturan lagi, saya pikir itu mungkin tidak. Menambahkan Grid@akan menghasilkan output yang benar-benar dapat diterima, dengan total 41 karakter:

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
Tuan Wisaya
sumber
14

C, 522

Jawaban C yang menunjukkan diri. Tidak bisa lebih jelas! Poin bonus untuk menemukan karakter ekstra.

#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; }
walpen
sumber
4
Saya tidak bisa menahan diri untuk tidak merasakan hal ini dari kode golf. (Saya juga tidak dapat membantu menunjukkan bahwa karakter tambahan ada di posisi \ binom {5} {4}).
Peter Taylor
2
Sangat menyenangkan untuk menulis. Untuk itulah saya datang ke codegolf.
walpen
1
Pintar :) Miliki upvote. Mungkin bukan kandidat pemenang tetapi kreatif!
Accatyyc
11

Golfscript (21 karakter)

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

Karena penjelasan diminta:

# 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
;
Peter Taylor
sumber
Anda mungkin ingin mencoba golf.shinh.org/p.rb?pascal+triangle
Nabb
Bisakah Anda memberikan beberapa pseudo-code atau penjelasan? Saya agak mengerti apa yang terjadi, tetapi saya tidak sepenuhnya memahami bagian pertukaran.
Rob
Terima kasih atas penjelasan terperinci dan jawaban yang sangat baik (+1), tapi saya lebih bingung sekarang. Logikanya (proses) tidak benar.
Rob
@ MikeDtrick, ada sedikit kesalahan dalam penjelasannya. Ada juga titik halus yang perlu dijelaskan, tetapi yang saya lewatkan karena sudah begitu lama saya menulis kode.
Peter Taylor
Oke, itu mulai masuk akal. Pertanyaan terakhir saya adalah apakah proses pencetakan dan pelaksanaan bekerja dari atas ke bawah atau dari bawah ke atas (1, 1 1, 1 2 1: top down, 1 2 1, 1 1, 1: bottom up)?
Rob
7

Haskell, 94 92

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

Keluaran:

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

Versi 71 karakter yang tidak mencetak spasi di antara setiap nomor:

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

Keluaran:

[1]
[1,1]
[1,2,1]
[1,3,3,1]
hammar
sumber
Anda dapat menyimpan karakter dengan menggunakan mapMalih-alih mapM_.
dfeuer
7

Scala, 81 78 72 70 karakter

81 karakter: upaya pertama, tanpa malu-malu disalin dari versi Python :)

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

Jalankan sebagai skrip, atau langsung di REPL.

Potong menjadi 70 karakter dengan sesuatu yang secara mengejutkan dapat dibaca dan idiomatis:

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

Atau 72 70 karakter dengan metode yang sama sekali berbeda:

0 to(readInt-1)map(i=>println(0 to i map(1 to i combinations(_)size)))
Luigi Plinge
sumber
+1 untuk penyalinan tak tahu malu!
Steven Rumbalski
Versi terakhir harus digunakan dengan hati-hati untuk nilai readInt yang sangat besar, seperti 50.;)
pengguna tidak diketahui
@userunknown mungkin itu sebabnya pertanyaan menentukan batas atas 25 ...
Luigi Plinge
Itu tidak dimaksudkan sebagai kritik, hanya sebagai peringatan bagi yang penasaran.
pengguna tidak diketahui
6

Ruby: 51 49 46 karakter

(45 karakter kode + 1 opsi baris perintah karakter)

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

Terimakasih untuk:

  • jsvnm untuk menyarankan alternatif untuk peralihan nilai (2 karakter)
  • GB untuk menemukan variabel yang tidak digunakan setelah peningkatan sebelumnya (4 karakter)

Contoh dijalankan:

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]

Cobalah online!

manatwork
sumber
1
Anda dapat menyimpan 2 karakter denganp.map!{|i|(v=n)+n=i}
jsvnm
Bagus sekali, @ jsvnm! Sobat, berapa lama aku bergabung untuk mempersingkat bagian itu. Terima kasih.
manatwork
1
Mungkin sedikit terlambat, tetapi: mengapa menggunakan variabel v?
GB
Tangkapan yang bagus, @GB! Yang tertinggal dari revisi pertama , di mana ... di mana ... lakukan. Di mana juga agak tidak berguna. Saya kira itu berasal dari upaya sebelumnya ketika digunakan .map. Terima kasih.
manatwork
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)

Demo: http://jsfiddle.net/tcRCS/3/

CATATAN : Praktis tidak bekerja dengan baik selama sekitar n> 30 karena angka-angka melimpah tipe data integer bawaan dan menjadi angka floating-point.


Edit 1 : dihapus 5 karakter dengan mengkonversi whileke fordan menggabungkan pernyataan

Sunting 2 : pindahkan s=pernyataan di dalam fordan simpan 2 karakter

Sunting 3 : menggabungkan s=1,j=1inisialisasi ke dalam s=j=1dan menyimpan 2 karakter

mellamokb
sumber
Bagus! Anda dapat menyimpan satu karakter lagi dengan mengubah "s = s * ..." menjadi "s * = ..."
Derek Kurth
@DerekKurth: Saya telah berpikir bahwa ketika saya pertama kali melakukan optimasi, tetapi itu akan mengacaukan logika karena itu perlu s*(i-j)/j, bukan s*((i-j)/j).
mellamokb
Hmm, saya mencobanya sebagai s * = ... di jsfiddle dan sepertinya berhasil. Mungkin saya melakukan sesuatu yang salah.
Derek Kurth
1
@DerekKurth: Secara teknis itu sama, tetapi idenya adalah jika Anda mengalikan (i-j)sebelum membaginya dengan j, maka tidak perlu untuk aritmatika floating point karena hasilnya harus selalu berupa bilangan bulat. Jika Anda melakukannya ((i-j)/j)terlebih dahulu, ini akan menghasilkan nilai desimal yang dapat menjadi sumber kesalahan, dan paling tidak akan membutuhkan kode tambahan untuk pembulatan / pemotongan. Anda tidak mulai melihat ini sampai Anda mencapai sekitar n>11, dan Anda akan melihat nilai desimal dalam output, yaitu,1 11 55 165 330 461.99999999999994 461.99999999999994...
mellamokb
Ah, itu masuk akal!
Derek Kurth
5

R, 39 karakter

R tampaknya menjadi alat yang sangat tepat untuk tugas ini :-)

x=1;for(i in 1:n)x=c(print(x),0)+c(0,x)
Tomas
sumber
3
Anda kehilangan salah satu persyaratan: "Diberikan input n (asalkan lebih mudah dalam bahasa pilihan Anda)"
Steven Rumbalski
@ Seven, "Diberikan input n" ... jadi bolehkah saya menganggap nitu diberikan? Saya memperbaiki kode. Apakah ini baik-baik saja?
Tomas
Saya diminta Peter Olson untuk mengklarifikasi.
Steven Rumbalski
@ SvenvenRumbalski Saya tidak berpikir itu valid kecuali butuh input. Saya tidak tahu R, jadi mungkin kompiler membuatnya sehingga variabel yang tidak terdefinisi meminta input, jadi mungkin ok, tetapi jika seperti kebanyakan bahasa lain dalam hal itu, saya tidak berpikir begitu.
Peter Olson
1
Pada dasarnya, nharus dipasok dari sumber eksternal pada saat run time dan peralatan untuk menangkapnya termasuk dalam program Anda. Biasanya, itu berarti dengan argumen baris perintah, atau stdin, atau file. Dengan file hampir tidak pernah digunakan karena itu selalu lebih lama daripada dua opsi lainnya.
Steven Rumbalski
5

dalam Q (25 karakter / 20 dengan versi lebih pendek)

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

Singkat

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

Penggunaan sampel:

q)t 4
1
1 1
1 2 1
1 3 3 1
sinedcm
sumber
Atau sebagai alternatif, 20 karaktert:{(x-1){0+':x,0}\1}
skeevey
Bagus, lebih pendek dari solusi GolfScript sekarang.
sinedcm
4

awk - 73 karakter

implementasi yang cukup mudah:

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

contoh dijalankan:

% 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
Dan Andreatta
sumber
4

Perl, 52 , 49 karakter

Edit: menggunakan saybukanprint

map{@_=(1,map$_[$_-1]+$_[$_],1..@_);say"@_"}1..<>
Toto
sumber
4

Perl, 47 54 karakter

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

Dibutuhkan angka dari baris perintah, tetapi tidak melakukan pengecekan kesalahan.

Baru sadar itu hanya bekerja hingga n = 4. Itu adalah beberapa kode lama yang saya miliki di hd saya.

Ini berfungsi:

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

n harus dimasukkan ke dalam skrip, atau itu akan menjadi satu karakter lebih.

flesk
sumber
4

Tong , 40 byte

1®n1¿1.
,(|(©n|:©n$@MCƒℤ. ,⑨)©n⑨®n_01.
,

Dijelaskan

Pena Disorot

Jono 2906
sumber
3

Perl, 77 Chars

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

Contoh input

5

Contoh output

 1
 1 1
 1 2 1
 1 3 3 1
 1 4 6 4 1
PhiNotPi
sumber
3

C, 132 127 karakter

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);}
Saeedn
sumber
3

Pascal: 216 192 karakter

(Bukan pesaing nyata, hanya kehadiran yang terhormat.)

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.

Contoh dijalankan:

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 
manatwork
sumber
3

MATL , 10 byte

Bahasa dibuat setelah tantangan ini

1iq:"tTTY+

Cobalah online!

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
Luis Mendo
sumber
non-bersaing tetapi bencana suci, tidak ada dari kiriman sebelumnya (bahkan J) berhasil menguranginya hingga seberapa banyak yang Matl lakukan !!!
Abr001am
Saya cukup yakin Jelly atau 05AB1E akan lebih pendek :-)
Luis Mendo
2

D 134 128 karakter

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);}}

output untuk 9 adalah

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

mengambil keuntungan penuh dari "Anda dapat memformatnya sesuka Anda"; ada jarak antara setiap angka dan satu baris baris

sunting mengubah posisi tugas luntuk mencukur beberapa karakter

ratchet freak
sumber
2

Scala, 131 karakter

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}}

Mengambil input dari baris perintah.

Output untuk 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
Gareth
sumber
Ada apa dengan semua 0itu :-)?
mellamokb
@Mellamokb Sedikit mengatur ulang membuat mereka pergi dan memperpendek kode. :-)
Gareth
2

F♯ - 203 karakter

Upaya pertama saya di babak kode golf, dan upaya pertama di pemrograman fungsional. Mungkin ada beberapa cara yang jelas untuk mempersingkatnya. Saya belum menemukan jawabannya. Ini sesuai dengan kompiler F VS2010s (yang memiliki efek menjalankan #light secara default tidak seperti versi sebelumnya), dan juga berfungsi pada juru bahasa F♯. Menerima input melalui stdin. Berharap ada cara yang lebih baik untuk input / output! Banyak karakter!

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")
lochok
sumber
2

Mengapa tidak ada jawaban yang diterima untuk pertanyaan ini?

VBA - 249 karakter

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
Gaffi
sumber
2

postscript - 59 karakter (63 jika Anda menghitung -dn=untuk mendapatkan jumlah baris)

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

jalankan bersama

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

mendapatkan

[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]
Geoff Reedy
sumber
2

Mathematica 35 karakter

Inilah cara yang membosankan dan malas untuk mengiris segitiga Pascal:

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}}
DavidC
sumber
2

APL, 19 15 karakter

Agak terlambat ke pesta, mungkin?

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

Itu tidak mengalahkan entri J., meskipun.

Ini mengasumsikan bahwa asal indeks ( ⎕IO) diatur ke 0. Sayangnya, dengan asal indeks 1, kita membutuhkan 25 18 karakter:

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

Ada dua s dalam kode untuk mengekspresikan rasa frustrasi saya.

Demo:

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

Penjelasan

Versi pendek:

  • ⍳⍵(dengan indeks asal 0) menghasilkan array angka dari 0 hingga ⍵-1inklusif, di mana argumen yang tepat untuk fungsi.
  • ⍳⍵+1 menghasilkan semua angka dari 0 hingga
  • {⍵!⍨⍳⍵+1}menghasilkan pilih kuntuk setiap elemen kdi ⍳⍵+1. Operator (bolak-balik) menukar argumen ke fungsi sekitar, sehingga argumen kanan menjadi kiri, dan sebaliknya.
  • {⍵!⍨⍳⍵+1}¨⍳⍵melewati setiap elemen dalam ⍳⍵menggunakan ¨(masing-masing) operator. Hasilnya adalah array satu dimensi yang berisi baris pertama Segitiga Pascal.
  • Bentuk argumen satu mengambil vektor satu dimensi, dan menjadikannya kolom daripada baris. Setiap baris segitiga diletakkan pada garisnya sendiri.

Jawaban panjang:

  • Hampir sama dengan versi lain, kecuali yang 1-⍨ditempatkan sebelum untuk mereplikasi indeks asal 0.
  • 0,⍳⍵dengan indeks asal 1 ulangan ⍳⍵+1dengan indeks asal 0.
Keriangan
sumber
2

Maple, 46

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

Pemakaian:

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

VBA, 162 142 102 80 byte

Disimpan 22 byte berkat Taylor Scott.

Ini adalah pertanyaan lama sekarang tapi saya melihat solusi yang lebih pendek untuk VBA.

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

Ini dimaksudkan untuk dijalankan di jendela langsung. Input ada di sel A1lembar kerja aktif. Output ada di lembar kerja aktif mulai B2dan menggunakan namun banyak sel diperlukan berdasarkan input. The COLUMN()>ROW()cek terus kanan atas segitiga kosong. ItuROW()=2 cek membuat nilai pertama 1untuk memulai segitiga. Saya bisa saja menggeser output ke bawah dan menjatuhkan cek ini, tapi itu memperkenalkan banyak output yang tidak ada sebelum segitiga yang sebenarnya dan saya tidak merasa bahwa itu adalah semangat tantangan.

Saya awalnya memposting metode yang jauh lebih rumit yang menghitung setiap nilai berdasarkan baris dan kolomnya. Namun, semua metode ini menggunakan rumus dalam sel. Saya mulai B2jadi saya bisa referensi baris di atasnya tanpa #REF!kesalahan. Kemudian, itu salinan dan pasta rumus yang sama lebih dari satu blok sel n lebar dan n tinggi. Input dan output untuk n=25terlihat seperti ini:

Keluaran

Toast insinyur
sumber
Jawaban yang sangat keren, tetapi Anda bisa bermain golf ini sedikit. Konversi Function p(r)ke Sub p(r)karena Anda tidak memiliki nilai fungsi output, menghapus ruang dari debug.? c(n,k);dan mengubah if-then-elsepernyataan multiline ke satu baris ( If k Then c=c(n-1,k-1)*n/k Else c=1) membawa byte-count turun 130oleh hitungan saya
Taylor Scott
@TaylorScott Terima kasih! Saya cukup baru dalam bermain golf dan hanya sedikit kurang baru dalam pemrograman pada umumnya. Saya menghitung 142 karena jeda baris. Dari apa yang bisa kutemukan , itu yang seharusnya dihitung.
Engineer Toast
Ah, Anda benar, saya lupa menghitung baris baru saya, dan ternyata, setidaknya satu trik golf lainnya For n=0 To...dapat diringkas untuk For n=0To...membawa versi kode saya ke 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 Functiondengan hitungan byte139
Taylor Scott
Sebuah melihat kedua ini menunjukkan bahwa jika Anda memecahnya menjadi fungsi jendela langsung dengan fungsi pembantu, Anda bisa mendapatkannya turun ke 112 Bytes (Segera Jendela Fungsi: For n=0To[A1-1]:For k=0To n:?c(n,k);:Next:?:NextHelper Fungsi: Function c(n,k) If k Then c=c(n-1,k-1)*n/k Else c=1 End Function)
Taylor Scott
1
@TaylorScott Bagaimana kalau hanya menjatuhkan mereka sepenuhnya? Dengan perubahan dalam rumus, itu berfungsi dengan baik. Saya pikir output mulai B2bukan A1diterima.
Engineer Toast