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
code-golf
math
combinatorics
Peter Olson
sumber
sumber
Jawaban:
J , 12 karakter
sumber
i.5
mengembalikan lima alami pertama. Baris 2 menambahkan{:
"Tail" (kembali terakhir). Baris 3 menggabungkannya dengan!
"Keluar Dari" (jumlah kombinasi). Jalur 4(!{:)i.5
sama. 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.!
berarti faktorial;!
jumlah kombinasi diad . Yang terakhir@
di":@(!{:)\@i.
sana hanya untuk membuat ini kata kerja yang berdiri sendiri.Python, 56 Bytes
Penggunaan sampel:
Menghasilkan:
sumber
exec
menghindarifor
loop.Python,
94918870 7063 karaktersumber
Mathematica: 36 (41?)
Mathematica memiliki
Binomial
fungsi, tetapi hal itu tidak menyenangkan. Saya melamar:Baris di atas akan merender array yang rusak seperti:
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:n = 6
:sumber
C, 522
Jawaban C yang menunjukkan diri. Tidak bisa lebih jelas! Poin bonus untuk menemukan karakter ekstra.
sumber
Golfscript (21 karakter)
Karena penjelasan diminta:
sumber
Haskell,
9492Keluaran:
Versi 71 karakter yang tidak mencetak spasi di antara setiap nomor:
Keluaran:
sumber
mapM
alih-alihmapM_
.Scala,
81787270 karakter81 karakter: upaya pertama, tanpa malu-malu disalin dari versi Python :)
Jalankan sebagai skrip, atau langsung di REPL.
Potong menjadi 70 karakter dengan sesuatu yang secara mengejutkan dapat dibaca dan idiomatis:
Atau
7270 karakter dengan metode yang sama sekali berbeda:sumber
Ruby:
514946 karakter(45 karakter kode + 1 opsi baris perintah karakter)
Terimakasih untuk:
Contoh dijalankan:
Cobalah online!
sumber
p.map!{|i|(v=n)+n=i}
.map
. Terima kasih.JavaScript (
90858381)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
while
kefor
dan menggabungkan pernyataanSunting 2 : pindahkan
s=
pernyataan di dalamfor
dan simpan 2 karakterSunting 3 : menggabungkan
s=1,j=1
inisialisasi ke dalams=j=1
dan menyimpan 2 karaktersumber
s*(i-j)/j
, bukans*((i-j)/j)
.(i-j)
sebelum membaginya denganj
, 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 sekitarn>11
, dan Anda akan melihat nilai desimal dalam output, yaitu,1 11 55 165 330 461.99999999999994 461.99999999999994...
R, 39 karakter
R tampaknya menjadi alat yang sangat tepat untuk tugas ini :-)
sumber
n
itu diberikan? Saya memperbaiki kode. Apakah ini baik-baik saja?n
harus 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.dalam Q (25 karakter / 20 dengan versi lebih pendek)
Singkat
Penggunaan sampel:
sumber
t:{(x-1){0+':x,0}\1}
awk - 73 karakter
implementasi yang cukup mudah:
contoh dijalankan:
sumber
Perl,
52, 49 karakterEdit: menggunakan
say
bukanprint
sumber
Perl,
4754 karakterDibutuhkan 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:
n harus dimasukkan ke dalam skrip, atau itu akan menjadi satu karakter lebih.
sumber
Tong , 40 byte
Dijelaskan
sumber
Perl, 77 Chars
Contoh input
Contoh output
sumber
C,
132127 karaktersumber
Pascal:
216192 karakter(Bukan pesaing nyata, hanya kehadiran yang terhormat.)
Contoh dijalankan:
sumber
MATL , 10 byte
Bahasa dibuat setelah tantangan ini
Cobalah online!
sumber
D
134128 karakteroutput untuk 9 adalah
mengambil keuntungan penuh dari "Anda dapat memformatnya sesuka Anda"; ada jarak antara setiap angka dan satu baris baris
sunting mengubah posisi tugas
l
untuk mencukur beberapa karaktersumber
Scala, 131 karakter
Mengambil input dari baris perintah.
Output untuk n = 10:
sumber
0
itu :-)?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!
sumber
Mengapa tidak ada jawaban yang diterima untuk pertanyaan ini?
VBA - 249 karakter
sumber
postscript - 59 karakter (63 jika Anda menghitung
-dn=
untuk mendapatkan jumlah baris)jalankan bersama
mendapatkan
sumber
Mathematica 35 karakter
Inilah cara yang membosankan dan malas untuk mengiris segitiga Pascal:
sumber
APL,
1915 karakterAgak terlambat ke pesta, mungkin?
Itu tidak mengalahkan entri J., meskipun.
Ini mengasumsikan bahwa asal indeks (
⎕IO
) diatur ke0
. Sayangnya, dengan asal indeks1
, kita membutuhkan2518 karakter:Ada dua
⍨
s dalam kode untuk mengekspresikan rasa frustrasi saya.Demo:
Penjelasan
Versi pendek:
⍳⍵
(dengan indeks asal 0) menghasilkan array angka dari 0 hingga⍵-1
inklusif, di mana⍵
argumen yang tepat untuk fungsi.⍳⍵+1
menghasilkan semua angka dari 0 hingga⍵
{⍵!⍨⍳⍵+1}
menghasilkan⍵
pilihk
untuk setiap elemenk
di⍳⍵+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.⍪
mengambil vektor satu dimensi, dan menjadikannya kolom daripada baris. Setiap baris segitiga diletakkan pada garisnya sendiri.Jawaban panjang:
1-⍨
ditempatkan sebelum⍳
untuk mereplikasi indeks asal 0.0,⍳⍵
dengan indeks asal 1 ulangan⍳⍵+1
dengan indeks asal 0.sumber
Maple, 46
Pemakaian:
sumber
VBA,
16214210280 byteDisimpan 22 byte berkat Taylor Scott.
Ini adalah pertanyaan lama sekarang tapi saya melihat solusi yang lebih pendek untuk VBA.
Ini dimaksudkan untuk dijalankan di jendela langsung. Input ada di sel
A1
lembar kerja aktif. Output ada di lembar kerja aktif mulaiB2
dan menggunakan namun banyak sel diperlukan berdasarkan input. TheCOLUMN()>ROW()
cek terus kanan atas segitiga kosong. ItuROW()=2
cek membuat nilai pertama1
untuk 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
B2
jadi 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 untukn=25
terlihat seperti ini:sumber
Function p(r)
keSub p(r)
karena Anda tidak memiliki nilai fungsi output, menghapus ruang daridebug.? c(n,k);
dan mengubahif-then-else
pernyataan multiline ke satu baris (If k Then c=c(n-1,k-1)*n/k Else c=1
) membawa byte-count turun130
oleh hitungan sayaFor n=0 To...
dapat diringkas untukFor n=0To...
membawa versi kode saya keSub 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
dengan hitungan byte139
For n=0To[A1-1]:For k=0To n:?c(n,k);:Next:?:Next
Helper Fungsi:Function c(n,k)
If k Then c=c(n-1,k-1)*n/k Else c=1
End Function
)B2
bukanA1
diterima.05AB1E , 14 byte
Cobalah online!
sumber