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!
sumber
-9
muncul di output?take derivative
danmerge
no exponent 1
, meskipun Anda tampaknya tidak menyatakan iniJawaban:
Python 2 ,
252245 byteCobalah online!
Mengambil input sebagai daftar koefisien dan persyaratan yang bersarang:
Misalnya, contoh pertama (
5z-z2y2-5w3y
) diberikan sebagai:Footer berisi fungsi yang mem-parsing input string untuk format masukan yang diinginkan:
parse(s)
.Edit:
sumber
Retina ,
249233 byteCobalah online! Tautan termasuk kasus uji. Penjelasan:
Tambahkan
_
setelah setiap kemunculan variabel yang diberikan.Bagi input menjadi beberapa istilah.
Simpan hanya istilah yang mereferensikan variabel.
Awali a
+
jika istilah pertama tidak memiliki tanda.Sortir setiap istilah berdasarkan abjad. (Tandanya cocok, tapi itu tidak masalah; toh itu semacam di awal.)
Ubah semua eksponen variabel menjadi unary.
Awali 1 sementara untuk istilah-istilah itu tanpa pengganda.
Lipat gandakan pengali dengan eksponen variabel, biarkan hasilnya dalam unary.
Sortir semua persyaratan.
Tambahkan persyaratan dengan tanda yang sama.
Kurangi istilah tanda yang berbeda.
Hapus istilah yang dibatalkan dengan ketentuan tanda yang berbeda.
Ubah pengganda kembali ke desimal.
Eksponen penurunan lebih besar dari tiga dan dikonversi kembali ke desimal.
a) Hapus
+
tanda memimpin b) Gabungkan semua istilah kembali bersama-sama c) konversi kuadrat dari variabel ke variabel biasa d) hapus variabel jika tidak memiliki eksponen.Hapus sementara 1 kecuali tidak punya apa-apa lagi untuk berkembang biak.
Jika tidak ada istilah yang tersisa maka hasilnya adalah nol.
Mendukung istilah duplikat menghabiskan hampir setengah dari jumlah byte saya. Solusi 123 byte sebelumnya yang tidak menggunakan istilah deduplicate:
Cobalah online! Penjelasan:
Tambahkan
_
setelah setiap kemunculan variabel yang diberikan.Bagi input menjadi beberapa istilah.
Simpan hanya istilah yang mereferensikan variabel.
Ubah semua eksponen variabel menjadi unary.
Awali 1 sementara untuk istilah-istilah itu tanpa pengganda.
Lipat gandakan pengali dengan eksponen variabel.
Eksponen penurunan lebih besar dari tiga dan dikonversi kembali ke desimal.
a) Hapus
+
tanda memimpin b) Gabungkan semua istilah kembali bersama-sama c) konversi kuadrat dari variabel ke variabel biasa d) hapus variabel jika tidak memiliki eksponen.Hapus sementara 1 kecuali tidak punya apa-apa lagi untuk berkembang biak.
Jika tidak ada istilah yang tersisa maka hasilnya adalah nol.
sumber
Bahasa Wolfram (Mathematica) ,
2120 byte-1 byte terima kasih kepada Jonathan Frech !
Cobalah online!
Input diformat sehingga setiap istilah mengikuti
coeff * var1 ^ exp1 * var2 ^ exp2 ...
. Jika input dapat diambil sebagai ungkapan daripada string, solusinya adalah 1 byte:D
.sumber
#1
bisa#
.Physica , 3 byte
Ini tidak menggunakan fitur baru apa pun.
∂
dan alternatif ASCII-nya saja,Differentiate
telah diperkenalkan lebih dari 10 hari yang lalu .Demo
Diasumsikan bahwa ekspresi dan variabel dilewatkan sebagai string. Kode pengujian:
Output yang tepat:
Format ekspresi:
*
untuk multiplikasi,**
untuk eksponensial,+
dan-
untuk penambahan dan pengurangan sesuai.sumber
Python 3 + SymPy , 23 byte
Cobalah online!
sumber
Pari / GP , 5 byte
Cobalah online!
sumber