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_integer
dan lowercase_ASCII_letters
cukup jelas.
Misalnya, String 3x2y-x3y-x2y+5
berarti 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+y3x2
juga 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-5w3y
sehubungan 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 0
karena a
tidak 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+10y
tidak3-y0z
akan valid dan harus ditransformasikan ke10y
dan3-z
, masing-masing.Angka tersebut
1
seharusnya 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-4b5a2
bukan merupakan keluaran yang valid, dan seharusnya menjadi-a2b5
gantinya. 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^2
atau 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 ab
dan ba
sebagai 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
xx
tidak akan muncul dan akan selalu disajikan sebagaix2
, juga tidak akan sesuatu sepertia3b4a2
muncul.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+2up2
adalah output yang valid. Tanda untuk istilah terkemuka dapat berupa positif atau negatif dan-y+3x
dan3x-y
keduanya 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!
-9
muncul di output?
take derivative
danmerge
no exponent 1
, meskipun Anda tampaknya tidak menyatakan ini