Saya suka pemrograman dan tahu setiap bahasa, tapi saya payah dalam matematika. Sayangnya, sekolah saya mengharuskan siswa komputer harus mengambil satu tahun kalkulus. Ada tes minggu depan, dan saya tidak tahu rumus apa pun untuk turunan!
Tolong bantu saya menemukan formula. Saya memerlukan lembar contekan - program (sesingkat mungkin sehingga guru saya tidak akan melihatnya) yang mengambil ekspresi (seperti 4*x^3-2
) sebagai input dan output turunannya. (Saya tidak peduli apakah input dan output menggunakan argumen baris perintah, STDIN, STDOUT, atau apa pun, karena saya tetap melakukan semua perhitungan di kepala saya.)
Tes ini mencakup beberapa jenis fungsi berikut:
- Konstanta, suka
-3
atau8.5
- Fungsi daya, seperti
x^0.5
ataux^-7
- Fungsi eksponensial, suka
0.5^x
atau7^x
(basis selalu positif) - Konstanta dikalikan dengan fungsi, seperti
3*x^5
atau-0.1*0.3^x
- Jumlah dan perbedaan beberapa fungsi, seperti
-5*x^2+10-3^x
Guru saya selalu memformat pertanyaannya dengan cara yang persis sama, seperti yang ditunjukkan di atas. Dia juga tidak menggunakan pecahan, angka seperti pi atau e , atau angka yang sangat besar (lebih dari 1.000). Dia tidak pernah menggunakan tanda kurung, dan selalu menunjukkan multiplikasi menggunakan tanda bintang ( *
). Satu-satunya variabel yang digunakan adalah selalu x .
Di sisi lain, guru saya cukup toleran terhadap jawaban. Mereka tidak perlu disederhanakan sama sekali atau diformat persis seperti yang ditunjukkan di atas, selama jelas apa yang dikatakan jawabannya.
Meskipun saya dapat menggunakan bahasa apa pun, ingatlah bahwa saya tidak dapat menemukan turunan sendiri. Jadi jika program menggunakan fungsi bawaan untuk menangani persamaan atau menghitung turunan, saya tidak akan bisa menggunakannya.
Selama pengujian, saya tidak akan memiliki akses ke Internet atau file apa pun selain program pada lembar contekan.
Catatan: Skenario ini sepenuhnya fiksi. Dalam kehidupan nyata, menipu dan membantu orang lain menipu adalah salah dan tidak boleh dilakukan.
x
selalu variabel untuk membedakan?Jawaban:
Wolfram
136134109 [Terima kasih kepada Calle atas komentarnya di bawah ini]Dukungan terbatas untuk aturan produk dan rantai.
Contoh:
Perhatikan bahwa ini tidak menggunakan "fungsi bawaan untuk berurusan dengan persamaan atau menghitung turunan": hanya pencocokan pola yang terlibat *.
[* Yah ... secara teknis interpreter juga mem-parsing dan membangun semacam AST dari input juga]
Tidak Disatukan:
sumber
Power
,Times
dll. Tentukan berapa banyak yang akan meningkatkan versi golf Anda, tetapi Anda memiliki setidaknya satuTimes
di sana sehingga Anda dapat def. simpan beberapa karakter. Perhatikan juga bahwa dalam versi Anda yang tidak disunat disebutkand[expr_]:= v/...
.Perl - 121
122(+2 untuk
-p
)Uji:
sumber
Haskell 38 Chars
Fungsi tersebut
d
mengambil fungsi dan mengembalikan fungsi. Dimasukkan dalam bentuk seri daya , dan dihasilkan dengan cara yang sama (yang merupakan jenis apa pun.)Misalnya, jika kita input
x->x^2
, kita dapatkanx->2*x
.Dan untuk fungsi eksponensial.
sumber
2^x
?4*x^3-2
) sebagai input", seperti yang disyaratkan oleh OP.Prolog 176
Operator yang didukung: biner
+
, biner-
, biner*
, biner^
, unary-
. Perhatikan bahwa unary+
tidak didukung.Contoh dijalankan:
Prolog bingung ketika berjalan ke dalam
^-
urutan. Sebuah spasi harus dimasukkan di antara^
dan-
untuk mem-parsing ekspresi dengan benar.Semoga guru Anda tidak keberatan dengan persamaan.
Waktu gila:
sumber
C, 260
Hei, kurasa aku tahu gurumu! Bukankah itu orang yang memiliki kemampuan supranatural untuk mendeteksi siswa yang menjalankan fungsi pencocokan pola perpustakaan di kepala mereka?
Jadi, menggunakan
sscanf
itu tidak mungkin ... Tapi jangan khawatir:Menjalankan contoh (input aktif
stdin
; output kestdout
):Format ini jauh lebih baik dari sekadar
12*x^2
, karena dengan cara ini guru Anda dapat memastikan bahwa Anda menghitung sendiri jawabannya dan tidak menipu dengan menyalinnya dari orang lain!Keluaran memiliki sedikit masalah domain
x=0
, tetapi hampir benar di mana-mana !Sebagai referensi, ini adalah versi yang tidak dikolonisasi, dapat dibaca (oleh manusia biasa). Menggunakan mesin negara dengan 5 negara dan 5 kategori karakter input.
PS Hati-hati dengan
gets
fungsi itu: ia memiliki kerentanan keamanan yang dapat membuat guru Anda menjalankan rootkit di pikiran Anda dengan memberikan input terlalu lama ...sumber
Lua
296268263Tidak terlalu bermain golf dan saat ini tidak dapat menangani beberapa istilah (Anda bisa menjalankannya beberapa kali, bukan?), Tetapi dapat menangani
n^x
,x^n
dann
sebagai input.Tidak disatukan ...
sumber
str.func(str,...)
==str:func(...)
, itu sebabnya string mendapatkan metatable setelah semua ...l
lokal. Hanya berharap input untuk disimpana
dan katakan output akan disimpanl
.a:find("x")
, juga perhatikan bahwa1then
hanya berfungsi di Lua 5.2()
opsional. Itu1then
hanya diperbaiki karena saya tidak memiliki 5,2 (tidak melakukan pembaruan CPU sampai setelah disertasi selesai b / c saya tidak ingin mengacaukan sesuatu).ECMAScript 6, 127 byte
Berikut ini adalah upaya regex saya (menggunakan regex tunggal dan beberapa logika dalam callback pengganti):
Ini mengharapkan string input untuk disimpan
i
dan hanya mengembalikan hasilnya. Cobalah di konsol yang sesuai ECMAScript 6 (seperti Firefox).sumber
sed, 110
Mengambil sangat harfiah "Mereka tidak perlu disederhanakan sama sekali atau diformat persis seperti yang ditunjukkan di atas, selama jelas apa yang dikatakan jawabannya":
Jumlah byte termasuk 1 untuk
r
flag.Tidak disatukan, dengan komentar:
Contoh dijalankan:
Saya bertaruh ini bisa di-golf lebih lanjut; ini percobaan pertama saya
sed
. Menyenangkan!sumber
Ruby, 152
... atau 150 jika Anda tidak perlu mencetak ... atau 147 jika Anda juga tidak masalah dengan array yang Anda butuhkan untuk bergabung sendiri.
jalankan bersama
ruby -nal
ungolfed:
Masalah utama saya dengan yang satu ini adalah jumlah karakter yang diperlukan pemisahan. Satu-satunya cara lain yang bisa saya pikirkan adalah
split(/(?<!\^)([-+])/)
memberi+
dan-
sebagai hasil mereka sendiri. Adakah petunjuk untuk solusi yang lebih baik?Juga, apakah ada cara yang lebih singkat untuk kembali
s
jika tidak kosong, tetapi sebaliknya kembaliy
? Saya sudah menggunakans[0]?y:s
? Di JS saya baru saja melakukannyas||y
, tetapi""
jujur di Ruby.sumber
split(/(?<!\^)(?=[-+])/)
?