Diferensiasi Simbolik 1: Gone Coefishin '
Tugas
Tulis sebuah program yang mengambil polinomial dalam x dari stdin (1 <deg (p) <128) dan bedakan. Input polinomial akan berupa string dengan bentuk berikut:
"a + bx + cx^2 + dx^3 +" ...
di mana koefisien setiap istilah adalah bilangan bulat (-128 <a <128). Setiap istilah dipisahkan oleh satu spasi, +, dan ruang lain; istilah linear dan konstan muncul seperti di atas (yaitu, tidak ada x^0
atau x^1
). Persyaratan akan muncul dalam urutan peningkatan derajat, dan kekuatan-kekuatan dengan koefisien nol dihilangkan. Semua istilah dengan koefisien 1 atau -1 menampilkan koefisien itu secara eksplisit.
Output Anda harus memiliki bentuk yang persis sama. Perhatikan bahwa koefisien dalam output mungkin sebesar 127 * 127 == 16129.
Contohnya
"3 + 1x + 2x^2" ==> "1 + 4x"
"1 + 2x + -3x^2 + 17x^17 + -1x^107" ==> "2 + -6x + 289x^16 + -107x^106"
"17x + 1x^2" ==> "17 + 2x"
Mencetak gol
Skor Anda adalah panjang program Anda dalam byte, dikalikan tiga jika Anda menggunakan built-in atau perpustakaan yang melakukan aljabar simbolis.
Jawaban:
Retina ,
534342414035 byteUntuk menghitung tujuan setiap baris masuk dalam file terpisah, tetapi Anda dapat menjalankan di atas sebagai file tunggal dengan memanggil Retina dengan
-s
bendera.Ini mengharapkan angka-angka dalam string input untuk diberikan secara unary dan akan menghasilkan output dalam format yang sama. Misalnya
dari pada
Penjelasan
Kode ini menjelaskan satu penggantian satu regex, yang pada dasarnya 4 substitusi dikompresi menjadi satu. Perhatikan bahwa hanya satu cabang yang akan mengisi grup
$2
sehingga jika salah satu dari tiga kecocokan lainnya, kecocokan hanya akan dihapus dari string. Jadi kita dapat melihat empat kasus berbeda secara terpisah:Jika mungkin untuk mencapai ruang dari awal string tanpa menemukan
x
yang berarti istilah pertama adalah istilah konstan dan kami menghapusnya. Karena keserakahan+
, ini juga akan cocok dengan plus dan spasi kedua setelah suku konstan. Jika tidak ada istilah yang konstan, bagian ini tidak akan pernah cocok.Ini cocok dengan
x
yang diikuti oleh spasi, yaitux
istilah linear (jika ada), dan menghapusnya. Kita dapat yakin bahwa ada spasi setelahnya, karena tingkat polinomial selalu minimal 2.Ini melakukan penggandaan koefisien oleh eksponen. Ini cocok dengan satu
1
dalam koefisien dan menggantinya dengan seluruh eksponen yang sesuai melalui lookahead.Ini mengurangi semua eksponen yang tersisa dengan mencocokkan trailing
1
(dipastikan oleh lookahead). Jika mungkin untuk mencocokkan^11
(dan batas kata) kami menghapusnya sebagai gantinya, yang mengurus menampilkan istilah linear dengan benar.Untuk kompresi, kami perhatikan bahwa sebagian besar kondisi tidak saling memengaruhi.
(\^1)?
tidak akan cocok jika lookahead dalam kasus ketiga benar, jadi kita bisa menggabungkan keduanyaSekarang kita sudah memiliki lookahead yang dibutuhkan untuk kasus kedua dan yang lain tidak pernah benar ketika mencocokkan
x
, jadi kita bisa menggeneralisasi1
ke\w
:Kasus pertama tidak benar-benar memiliki kesamaan dengan yang lain, jadi kami menyimpannya secara terpisah.
sumber
CJam,
4341 byteTerima kasih kepada @ jimmy23013 karena menunjukkan satu bug dan bermain golf dengan dua byte!
Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
Perl,
6463 byteKode 62b + 1 baris perintah (-p)
Tidak luar biasa saat ini, tetapi saya akan terus mencoba mempersingkatnya.
Contoh penggunaan:
Terima kasih Denis untuk -1b
sumber
Julia, 220 byte
Tidak ada ekspresi reguler!
Ini menciptakan fungsi lambda yang menerima string dan mengembalikan string. Jeroan meniru apa yang terjadi ketika kode Julia dievaluasi: string diurai menjadi simbol, ekspresi, dan panggilan. Saya mungkin benar-benar mencoba menulis fungsi diferensiasi simbolis Julia penuh dan mengirimkannya untuk menjadi bagian dari Julia.
Penjelasan + tidak dikumpulkan:
sumber
C,
204162 bytePada dasarnya parsing setiap istilah dan cetak istilah yang dibedakan secara berurutan. Cukup mudah.
sumber
JavaScript ES6, 108 byte
Cuplikan ES5:
sumber
Python 2, 166 byte
Wah, sepertinya ini lebih lama dari seharusnya.
Fungsi ini
d
mengambil istilah yang tidak konstant
dan mengembalikan turunannya. Alasan sayadef
fungsinya daripada menggunakan lambda adalah agar saya dapat menetapkan eksponen minus 1 kee
, yang kemudian digunakan empat kali lagi. Hal menjengkelkan utama adalah harus bolak-balik antara string dan int, meskipun operator backtick Python 2 membantu dengan itu.Kami kemudian membagi input menjadi istilah dan memanggil
d
masing-masing yang ada"x"
di dalamnya, sehingga menghilangkan istilah konstan. Hasilnya disatukan kembali dan dicetak.sumber
CJam,
62575549 byteNah, Dennis mempermalukan ini bahkan sebelum saya perhatikan bahwa situs itu kembali. Tapi ini ciptaan saya:
Versi terbaru menyimpan beberapa byte dengan cara pintas yang disarankan oleh @Dennis (gunakan variabel, dan pisahkan di ruang alih-alih
+
).Cobalah online
sumber
_({'^a\}{;}?
lebih panjang 1 byte dari:T({T'^a\}&
.~
di blok yang lain dan dapat menghilangkan yang juga.x
. Saya menemukan beberapa peningkatan saat saya melakukannya. Sebagian besar, karena saya memiliki nilai-nilai dalam variabel sekarang, saya dapat mengingatnya di mana saya benar-benar membutuhkannya, menyimpan beberapa manipulasi tumpukan. Saya juga memiliki nyasara
yang seharusnya dihapus ketika saya mengoptimalkan generasi keluaran sebelumnya.Pyth, 62 byte
Solusi yang cukup jelek, menggunakan beberapa penggantian regex.
sumber
Python 3, 176 byte
Memang, gangguan utama adalah harus mengkonversi antara string dan int. Juga, jika syarat konstan diperlukan, kode hanya 153 byte.
sumber
Python 2, 229 byte
sumber
Python 2, 174 byte
Sayangnya, trik DLosc untuk mengubah nama metode split dan melakukan diferensiasi dalam fungsi tertentu tidak mempersingkat kode saya ...
sumber