Pascal's Rhombus (yang sebenarnya adalah segitiga) diperoleh dengan menambahkan dalam pola:
*
***
x
dari pada
* *
x
Ini berarti bahwa setiap sel adalah jumlah dari tiga sel pada baris tepat di atasnya dan satu sel pada baris 2 di atasnya. Sama seperti segitiga Pascal, baris nol memiliki satu 1
di atasnya yang menghasilkan segitiga.
Inilah beberapa baris pertama Pascal's Rhombus
1
1 1 1
1 2 4 2 1
1 3 8 9 8 3 1
Tugas
Diberikan nomor baris (mulai dari atas) dan nomor kolom (mulai dari item bukan nol pertama pada baris itu) menghasilkan nilai pada sel tertentu. Kedua input dapat diindeks 1 atau 0 (Anda dapat mencampur dan mencocokkan jika Anda inginkan).
Ini adalah kode-golf sehingga Anda harus berusaha membuat ukuran file kode sumber Anda sekecil mungkin.
Jawaban:
Haskell ,
5955 byteBelah Ketupat Pascal? Lebih seperti Haskell's Rhombus! Apakah saya benar?
4 byte disimpan berkat Ørjan Johansen
Saya pikir saya akan mencoba masalah saya sendiri dan mempraktikkan Haskell saya. Semoga ini akan menginspirasi lebih banyak orang untuk menjawab ini.
Cobalah online!
Penjelasan
Ini agak ketinggalan zaman dengan golf terbaru
Alih-alih menghitung
Kami menghitung
Ini miring seluruh segitiga kita untuk menjadi
Ini mengurutkan semua baris kami sehingga memudahkan untuk mengindeks item ke-n kolom mana saja. Kami kemudian mendefinisikan kasus dasar kami.
Baris nol adalah semua nol begitu
Ada satu
1
di posisi1,1
jadi kami mendefinisikannyaDan kami mendefinisikan sisa baris pertama menjadi nol juga
Kemudian kami mendefinisikan kasus umum secara rekursif menggunakan pola yang dijelaskan di atas:
sumber
n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1]
.Pascal , 122 byte
Yah, ini adalah belah ketupat Pascal .
37 byte disimpan berkat @manatwork
Cobalah online!
sumber
if
kondisi tidak ada gunanya. (Pada tanggal 1if
Anda menyimpan 2 karakter, padaif
karakter 1 ke- 1 dengan tidak meninggalkan spasi antarathen
kata kunci dan digit sebelumnya.) Oh, dan variabel r sama sekali tidak perlu.;
sebelumfunction
'send
.>=
<=
? Saya masih perlu melestarikanif n=0
function f(n,k:integer):integer;begin f:=1-Ord((k<0)or(k>n*2));if n>0then f:=f(n-1,k-2)+f(n-1,k-1)+f(n-1,k)+f(n-2,k-2)end;
PHP , 86 byte
cara rekursif hanya fungsi baris dan kolom 0-diindeks
Cobalah online!
PHP , 114 byte
cara rekursif program baris penuh dan kolom 0-diindeks
Cobalah online!
PHP , 129 byte
baris dan kolom 0-Diindeks
Cobalah online!
sumber
Jelly ,
222019 byteMengambil pasangan indeks berbasis 0 sebagai argumen baris perintah.
Cobalah online!
sumber
MATL ,
222019 byteKedua input berbasis 0.
Cobalah online!
Penjelasan
Biarkan
r
danc
tunjukkan kedua input, dengan menentukan baris dan kolom berbasis 0 masing-masing.Setiap baris baru dalam belah ketupat Pascal dapat dibangun dari matriks yang berisi dua baris sebelumnya dengan berbelit - belit dengan kernel
[1 1 1; 0 1 0]
dan menjaga dua baris terakhir dari hasil swap. Ini dilakukanr
kali, mulai dari matriks1
.Ternyata lebih pendek untuk menggunakan kernel
[0 1 0; 1 1 1; 0 1 0]
, yang merupakan literal yang sudah ditentukan sebelumnya. Ini menghasilkan baris tambahan, yang akan dibuang.Pertimbangkan misalnya
r = 3
, jadi ada3
iterasi.Mulai dari
konvolusi dengan
[0 1 0; 1 1 1; 0 1 0]
memberiMempertahankan dua baris terakhir (seluruh matriks, dalam kasus ini) dan menukar memberi
Konvolusi di atas dengan
[0 1 0; 1 1 1; 0 1 0]
memberiMatriks yang dibentuk oleh dua baris terakhir ditukar adalah
Ini berisi baris baru di bagian bawah, dan yang sebelumnya diperpanjang dengan nol.
Menggabungkan lagi hasil panen
Mengambil dua baris terakhir bertukar memberi
Setelah
r
iterasi dilakukan, output terkandung di baris terakhir dari matriks final. Misalnya, untukc = 2
(berbasis 0) hasilnya akan8
. Alih-alih mengindeks baris terakhir dan kolom yang diinginkan, trik dapat digunakan yang mengeksploitasi simetri setiap baris: matriks akhir ditransformasikandan
-c
elemen ke -nya diambil. Ini menggunakan pengindeksan linear, yaitu, matriks diindeks oleh indeks tunggal dalam urutan kolom-utama . Karena pengindeksan bersifat modular , entri-adalah0
sudut kanan bawah (nilai1
) dan-2
entri-adalah dua langkah di atas (nilai8
).sumber
Pari / GP , 60 byte
Cobalah online!
sumber
Haskell , 74 byte
Cobalah online!
Panggil dengan
n # m
, di manan
baris danm
kolom.sumber
m<=2*n&&m>=0
bisa adiln>0
.Mathematica, 56 byte
Fungsi murni mengambil dua argumen integer (baris pertama, kolom kedua) dan mengembalikan integer. Berfungsi untuk argumen integer negatif juga, kembali
0
. Struktur rekursif yang cukup mudah:If[#<1,Boole[##==0],...]
mendefinisikan perilaku kasus dasar untuk baris ke-0 (dan di atas), sementaraSum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]
mengimplementasikan definisi rekursif.sumber
Python 2 ,
706665 byteCobalah online!
sumber
JavaScript (ES6), 68 byte
sumber
Mathematica, 53 byte
Menggunakan fungsi pembangkit.
sumber
Python 3 ,
8284 byteIni adalah implementasi rekursif dengan baris dan kolom 1-diindeks. (Secara teknis membutuhkan
f=
di depan, seseorang memberi tahu saya jika saya harus mengubahnya ke 84 byte. Masih baru dan tidak 100% yakin dengan aturan.)Ini menggunakan rumus rekursif yang ditemukan di halaman OEIS , tetapi dengan yang
k
bergeser ke kiri untuk berbaris dengan benar. Secara kebetulan,sum(f(n-1,k-i)for i in(0,1,2))
ukurannya sama denganf(n-1,k)+f(n-1,k-1)+f(n-1,k-2)
. Seluruh fungsi adalahand or
trik Python , di mana kondisi pertama memeriksa apakah k berada di dalam segitiga dan bukan pada batas, dalam hal ini rumus rekursif digunakan. Jika tidak, bagian setelahor
dikembalikan, yang memeriksa jikak
dalam(1, 2*n-1)
, yaitu pada batas, kembaliTrue
danFalse
.k+1in(2,2*n)
lebih pendek satu byte darik in(1,2*n-1)
. Membungkus itu dalam tanda kurung dan meletakkan+
di depan mengkonversi ke integer, yang adalah apa yang dibutuhkan.Cobalah online!
sumber
f=
.True
bukan1
karena berperilaku seperti1
untuk python. Ini memungkinkan Anda untuk menghapus+(...)
di akhir. Saya mengerti jika Anda tidak ingin melakukan ini, karena itu akan membuat output terlihat sedikit aneh, itu adalah pilihan.Java (OpenJDK 8) , 87 byte
Cobalah online!
Pada awalnya, saya senang dengan metode iteratif 160 byte saya ... Hmmm ... mari kita lupakan saja, oke?
sumber
Python 3 , 75 Bytes
Ini adalah lambda rekursif yang mengambil kolom dan baris sebagai bilangan bulat berindeks 0.
Berikut ini (versi) yang lebih mudah dibaca dengan fungsi pencetakan:
sumber