Diberi dua daftar bilangan bulat kosong , kiriman Anda harus menghitung dan mengembalikan konvolusi diskrit keduanya. Menariknya, jika Anda mempertimbangkan elemen daftar sebagai koefisien polinomial, lilitan kedua daftar mewakili koefisien produk dari dua polinomial.
Definisi
Diberikan daftar A=[a(0),a(1),a(2),...,a(n)]
dan B=[b(0),b(1),b(2),...,b(m)]
(pengaturan a(k)=0 for k<0 and k>n
dan b(k)=0 for k<0 and k>m
) maka lilitan keduanya didefinisikan sebagai A*B=[c(0),c(1),...,c(m+n)]
manac(k) = sum [ a(x)*b(y) for all integers x y such that x+y=k]
Aturan
- Input dan output format apa pun yang nyaman untuk bahasa Anda diizinkan.
- Built-in untuk konvolusi, membuat matriks konvolusi, korelasi dan multiplikasi polinomial tidak diperbolehkan.
Contohnya
[1,1]*[1] = [1,1]
[1,1]*[1,1] = [1,2,1]
[1,1]*[1,2,1] = [1,3,3,1]
[1,1]*[1,3,3,1] = [1,4,6,4,1]
[1,1]*[1,4,6,4,1] = [1,5,10,10,5,1]
[1,-1]*[1,1,1,1,1] = [1,0,0,0,0,-1]
[80085,1337]*[-24319,406] = [-1947587115,7,542822]
[1,1]*[] = []
, dan tidak mungkin dapat tahan untuk[]*[] = ?
. Konvolusi tidak didefinisikan dengan baik pada daftar kosong. Saya pikir Anda harus menjamin bahwa daftar input tidak kosong.Jawaban:
J,
108 bytePemakaian:
Deskripsi: Program ini mengambil dua daftar, membuat tabel perkalian, lalu menambahkan angka pada diagonal positif.
sumber
MATL , 19 byte
Cobalah online!
Penjelasan
Ini membangun matriks blok-diagonal dengan dua input, membalikkan yang pertama. Misalnya, dengan input
[1 4 3 5]
,[1 3 2]
matriksnya adalahSetiap entri konvolusi diperoleh dengan menggeser baris pertama satu posisi ke kanan, menghitung produk dari setiap kolom, dan menjumlahkan semua hasil.
Pada prinsipnya, pergeseran harus dilakukan padding dengan nol dari kiri. Secara ekuivalen, penggeseran lingkaran dapat digunakan, karena matriks berisi nol pada entri yang sesuai.
Sebagai contoh, hasil pertama diperoleh dari matriks bergeser
dan karenanya
1*1 == 1
. Yang kedua diperoleh daridan dengan demikian
4*1+1*3 == 7
, dll. Ini harus dilakukanm+n-1
kali, di manam
dann
merupakan panjang input. Kode menggunakan loop denganm+n
iterasi (yang menyimpan beberapa byte) dan membuang hasil terakhir.sumber
Haskell,
5549 byteMenentukan operator
#
.sumber
[0,0..]
dapat(0<$b)
memberikan panjang persis yang dibutuhkan, memungkinkan kasing kosong_#b=0<$b
.Matlab / Oktaf, 41 byte
Ini mendefinisikan fungsi anonim. Untuk menyebutnya, tetapkan ke variabel atau gunakan
ans
.Coba di sini .
Penjelasan
Ini mengeksploitasi fakta itu
Kode menghitung akar dari dua polinomial (fungsi
roots
) dan menggabungkannya menjadi array kolom. Dari sana ia memperoleh koefisien polinomial produk dengan1
fungsi ( terkemukapoly
). Akhirnya hasilnya dikalikan dengan koefisien terkemuka dari dua polinomial.sumber
Oktaf , 48 byte
Coba di sini .
Penjelasan
Konvolusi diskrit berhubungan dengan multiplikasi transformasi Fourier (waktu diskrit). Jadi salah satu cara untuk melipatgandakan polinomial adalah mengubahnya, mengalikan urutan yang ditransformasikan, dan mentransformasikannya kembali.
Jika transformasi Fourier diskrit (DFT) digunakan sebagai pengganti transformasi Fourier, hasilnya adalah konvolusi melingkar dari urutan asli dari koefisien polinomial. Kode mengikuti rute ini. Untuk membuat lilitan melingkar sama dengan lilitan standar, urutannya berlapis-nol dan hasilnya dipangkas.
sumber
05AB1E ,
1817 byteKode
Penjelasan
Teori di balik:
Untuk menemukan konvolusi, mari kita ambil contoh
[1, 2, 3]
,[3, 4, 5]
. Kami memposisikan nilai-nilai dari array pertama terbalik dan vertikal, seperti ini:Sekarang, kita menempatkan array kedua seperti tangga dan melipatgandakannya dengan:
Menghasilkan:
Kemudian, kami menambahkannya, menghasilkan:
Jadi, konvolusi itu
[3, 10, 22, 22, 15]
.Kode itu sendiri:
Kami akan melakukan langkah demi langkah menggunakan
[1, 2, 3]
,[3, 4, 5]
sebagai kasus uji.Kami pertama-tama mendorong
0
dan kemudian kamiE
menilai array input pertama. Kami memetakan setiap elemen menggunakanv
.Jadi, untuk setiap elemen, kita dorong array kedua dengan
²
dan kemudian panjang array pertama menggunakan¹g
dan mengurangi ini dengan 1 (dengan<
). Kami mengonversikan ini menjadi daftar nol dengan (panjang array 1 - 1) nol, menggunakanÅ0
dan menambahkan ini ke daftar kami. Tumpukan kami sekarang terlihat seperti ini untuk item pertama dalam daftar input:Kami mengalikan array ini dengan item saat ini, selesai dengan
y*
. Setelah itu, kami mendorongN
, yang menunjukkan indeks item saat ini (diindeks nol) dan memutar array yang berkali-kali ke kanan menggunakanFÁ}
. Akhirnya, kami menambahkan ini ke nilai awal kami (0
). Jadi, yang pada dasarnya dilakukan adalah sebagai berikut:Yang kemudian dicetak secara implisit. Menggunakan pengodean CP-1252 . Cobalah online! .
sumber
Jelly , 9 byte
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Sekam , 5 byte
Cobalah online!
Catatan: Saat memasok daftar nol-polinomial / kosong, Anda perlu menentukan tipenya (mis.
[]:LN
)!Penjelasan
sumber
Matlab, 33 byte
Cobalah online!
Buat matriks semua produk elemen-bijaksana dari input, kemudian jumlahkan sepanjang diagonal. Pada
,1
akhirnya memaksa matlab untuk menjumlahkan sepanjang arah yang benar ketika salah satu vektor input memiliki panjang 1.Dalam Oktaf
spdiags
tidak bekerja untuk vektor, menghasilkan kesalahan ketika salah satu input memiliki panjang 1. Matlab 2016b atau lebih baru diperlukan untuk perluasan eksplisit produk elemen-bijaksana.sumber
Ruby, 83 byte
Hampir secara langsung menarik keluar dari jawaban yang saya lakukan sebelumnya mengenai memperluas akar menjadi polinomial .
sumber
Python, 90 byte
sumber
JavaScript (ES6), 64 byte
Mengembalikan array kosong jika salah satu input kosong. Berdasarkan jawaban saya terhadap Polinomialepsi .
sumber
Julia,
6255 byteCobalah online!
sumber
Clojure, 104 byte
Penggabungan untuk
sorted-map
menjamin bahwa nilai dikembalikan dalam urutan yang benar. Saya berharap ada beberapa test case lagi.sumber