pengantar
Tulis program untuk menghitung turunan parsial dari polinomial (mungkin multivarian) berkenaan dengan variabel.
Tantangan
Derivatif adalah alat matematika yang sangat penting yang telah banyak diterapkan dalam fisika, kimia, biologi, ekonomi, psikologi dan banyak lagi untuk menangani semua jenis masalah. Ekspresi dengan banyak variabel juga sangat umum.
Dalam lingkup tantangan ini, string polinomial ("polystr") didefinisikan oleh BNF berikut (bentuk Backus-Naur):
<polystr> ::= <term> | <term><plusminus><polystr>
<plusminus> ::= "+" | "-"
<term> ::= <coeff> | <coeff><baseterm> | <baseterm>
<baseterm> ::= <variable> | <variable><exponent> | <baseterm><baseterm>
<coeff> ::= positive_integer
<exponent> ::= positive_integer
<variable> ::= lowercase_ASCII_letters
Di mana positive_integerdan lowercase_ASCII_letterscukup jelas.
Misalnya, String 3x2y-x3y-x2y+5berarti 3*(x^2)*y-(x^3)*y-(x^2)*y+5. Istilah yang diberikan dalam input dapat muncul dalam urutan apa pun, dan variabel dalam setiap istilah juga dapat muncul dalam urutan apa pun. Jadi misalnya 5-yx2-x3y+y3x2juga merupakan input yang valid dan sebenarnya sama dengan contoh sebelumnya.
Aturan untuk mengambil turunan parsial hanya melakukannya istilah demi istilah. Jika variabel yang muncul tidak muncul dalam istilah, turunannya adalah nol. Jika tidak, koefisien istilah dikalikan dengan eksponen variabel itu, dan kemudian eksponen variabel berkurang satu. Eksponen untuk variabel lain tidak berubah. Ini hanya mengikuti definisi dalam matematika. Selain itu, jika eksponen yang dihasilkan adalah nol, hapus variabel dari istilah tersebut.
Misalnya, untuk mengambil turunan parsial 5z-z2y2-5w3ysehubungan dengan y. Proses berikut ini dilakukan (sesuai dengan BNF yang didefinisikan di atas, "koefisien" semuanya dianggap bilangan positif, yaitu tanda-tanda dianggap secara terpisah)
5z - z2y2 - 5w3y
Coeff 1->1*2=2 5->5*1=5
Expon 2->2-1=1 1->1-1=0
Term - 2yz2 - 5w3
(y is not here (expon 0->y removed)
so the term is 0)
Hasilnya adalah -2yz2-5w3y.
Di sisi lain, jika ungkapan di atas diambil sebagian turunan sehubungan dengan a, hasilnya adalah 0karena atidak ada ketentuan.
Tugas Anda adalah menulis fungsi atau program lengkap untuk menghitung turunan ini. Itu harus mengambil string polinomial dan satu karakter (variabel untuk mengambil turunan sehubungan dengan), dan mengembalikan turunan dalam bentuk paling sederhana.
"Bentuk paling sederhana" berarti tiga hal.
Angka
0(bukan digit) tidak akan muncul dalam output kecuali jika output itu sendiri adil0. Jadi output0+10ytidak3-y0zakan valid dan harus ditransformasikan ke10ydan3-z, masing-masing.Angka tersebut
1seharusnya tidak muncul sebagai eksponen atau koefisien, tetapi dapat muncul sebagai istilah yang berdiri sendiri.Istilah dengan himpunan variabel dan eksponen yang persis sama harus digabungkan, yang berarti
3a2b5-4b5a2bukan merupakan keluaran yang valid, dan seharusnya menjadi-a2b5gantinya. Informasi lebih lanjut tentang input dan output dapat ditemukan di bagian "Spesifikasi".
Uji Kasus
Input
Output
2xy+4ax-5+7mx4-4-7x4m, x
2y+4a
4upv+5u2v3w4-4w4u2v3+qr-v,v
4up+3u2v2w4-1
12ux-7x2m3+ab5,q
0
-a+10ca11y-1nv3rt3d-poly, a
-1+110ca10y
1y+1x3y, y
1+x3
Spesifikasi
- Masukan dapat diambil melalui formulir standar . Dengan kata lain, Anda dapat mengambil input sebagai string, daftar karakter, array koefisien, variabel (mungkin dilambangkan dengan nilai ASCII dikurangi minus 'a' atau yang serupa) dan eksponen, dll. Anda juga bebas untuk mengubah string ke
2*x^3y^2atau sama, bukan2x3y2.
Namun, tolong jangan gunakan input [2,0,0,0,1,0,0,3,0,0,...0](array dari 27 elemen) untuk istilah 2dg, atau format verbose lain yang menyebutkan 26 huruf seperti ini. Format input Anda juga harus dapat memperlakukan abdan basebagai input yang berbeda (sehingga format array 27-elemen tidak valid karena pembatasan ini juga).
Setiap variabel (huruf) hanya akan muncul sekali dalam setiap istilah input, itu berarti
xxtidak akan muncul dan akan selalu disajikan sebagaix2, juga tidak akan sesuatu sepertia3b4a2muncul.Untuk mengulangi, istilah dalam input dapat muncul dalam urutan apa pun.
Anda juga bebas memilih format output asalkan format verbose yang disebutkan di atas dihindari. Namun output harus selalu dalam bentuk paling sederhana seperti yang didefinisikan di atas. Sama seperti input, istilah dalam output dapat muncul dalam urutan apa pun, dan variabel dalam setiap istilah juga dapat muncul dalam urutan apa pun dan tidak harus konsisten di antara istilah. Itu artinya
pu+2up2adalah output yang valid. Tanda untuk istilah terkemuka dapat berupa positif atau negatif dan-y+3xdan3x-ykeduanya valid+3x-y.Input selalu diberikan sedemikian rupa sehingga semua koefisien dan eksponen dalam output akan kurang dari 2 32 -1, atau bilangan bulat terbesar yang dapat ditangani bahasa Anda, mana yang lebih kecil. Mengklaim bahwa bilangan bulat terbesar yang dapat ditangani bahasa Anda terlalu kecil dan meremehkan tantangannya masuk dalam kategori celah default.
Ini adalah kode-golf , jumlah byte terendah yang menang.
Seperti biasa, celah default berlaku di sini.
Sunting: Karena sebagian besar jawaban sejauh ini ternyata adalah internal yang melakukan seluruh tantangan, dan meskipun tahu ada builtin saya tidak punya niat untuk melarang internal seperti itu dari awal, saya juga tidak punya sekarang. Saya akan membuat kriteria kemenangan yang didasarkan pada basis per-bahasa, yaitu pengiriman dengan byte terkecil di setiap bahasa akan menang dalam bahasa itu. Saya akan menambahkan potongan standar untuk katalog jika ada cukup banyak pengiriman. Jangan ragu untuk mengirimkan kiriman bawaan untuk menunjukkan kekuatan bahasa Anda, tetapi jangan ragu untuk mengirimkan jawaban non-bawaan Anda meskipun itu jauh lebih lama dan bahasa Anda tidak memiliki bawaan. Selamat bermain golf kode dalam bahasa favorit Anda!
-9muncul di output?
take derivativedanmerge
no exponent 1, meskipun Anda tampaknya tidak menyatakan ini
