Terima kasih banyak atas bantuan Anda dengan kalkulus . Sekarang saya butuh bantuan dengan tes trigonometri saya yang akan datang.
Pada tes, saya perlu menyederhanakan ekspresi. Saya akan diberikan input seperti 4sin(x)/(2cos(x))
dan harus menghasilkan ekspresi yang lebih sederhana, tetapi setara (seperti 2tan(x)
). Semua sudut dalam derajat, dan kami akan berpura-pura tidak ada masalah pembagian-oleh-nol atau domain-tidak valid. (Misalnya, kita akan mengasumsikan bahwa tan (x + 1) cot (x + 1) sin (x) / sin (x) selalu 1.)
Saya menyelinap ke kantor profesor, dan mendapat daftar 100 masalah yang mungkin di tes. Tolong beri saya kode untuk menyelesaikan semuanya. Ada kemungkinan bahwa beberapa masalah sudah disederhanakan sebanyak mungkin; jika demikian berikan saja inputnya.
Saya perlu ekspresi yang disederhanakan, tetapi saya juga ingin program pendek (atau fungsi) sehingga profesor tidak akan memperhatikan. Cobalah untuk meminimalkan jumlah panjang program dan total panjang semua solusi.
Hanya untuk memperjelas, tidak apa-apa jika beberapa ekspresi dikembalikan tidak berubah, atau bahkan dikembalikan dalam bentuk yang setara tetapi lebih lama. Selain itu, program ini hanya perlu bekerja pada ekspresi yang tercantum di bawah ini; dapat mengembalikan hasil yang salah atau bahkan merusak input lainnya.
Seperti yang Anda tahu, semua masalah mengikuti format yang sama. x
adalah satu-satunya variabel yang digunakan, tidak ada spasi, dan tanda kurung mengikuti setiap nama fungsi. (Fungsi yang sin
, cos
, tan
, sec
, csc
, dan tan
.) Ada fungsi bersarang, tapi dalam fungsi mungkin ekspresi seperti 3x+4.5
atau -2-.7x
. Eksponen dapat digunakan, tetapi hanya pada fungsi (misalnya sin(x-.5)^7
), dan daya selalu bilangan bulat di atas yang. Perkalian ditunjukkan melalui penggabungan.
Keluaran harus dalam format ini juga. Valid: sin x
, sin(x)/cos(x)tan(x)
[? Adalah tangen dikalikan atau dibagi], cos(x
[tutup semua kurung], 4*sin(x)
,sec(x)^1
Saya dapat menggunakan bahasa pemrograman apa pun, kecuali bergantung pada penyederhanaan bawaan atau fungsi penanganan ekspresi. Fungsi trigonometri internal baik-baik saja. (Saya akan memiliki kalkulator ilmiah yang sangat mendasar selama ujian.) Juga, karena saya akan membaca program yang ditulis di atas kertas, saya hanya dapat menggunakan karakter ASCII yang dapat dicetak (0x20 hingga 0x7E) dan baris baru.
1/(sec(x))
4+sin(x)+3
(cos(7x+4)-sin(-3x))/(sin(-3x))
2sin(x)2tan(x).25cos(x)^3cos(x)+1+1
7cos(x)sec(x)/(14tan(x)csc(x))
sin(x)cos(x)/sec(x)
8sin(x)cos(x)sin(x)/tan(x)+8sin(x)
sin(x)^9cos(x)cot(x)sec(x)csc(x)sec(x)tan(x)/(cot(x)^2tan(x)cos(x)^4cot(x)sin(x))
tan(x)cos(x)csc(x)
tan(x+1)sin(x-1)cos(x+1)^3tan(x-1)^2sin(-x+1)csc(x+1)tan(-x+1)/(cos(x-1)cot(x+1))
(cos(2x)+cot(2x)-sin(2x)+csc(2x)^3)/(cot(2x)+sin(2x))
cos(90-x)cos(x)
sin(x+180)sec(450-x)
tan(-x)sin(x+90)sec(x-90)
tan(x+180)^2
cot(-x)cos(-x)
cot(180-x)^3cos(270-x)^2
sin(.1x-.2)sin(.1x-.2)sin(.1x-.2)sin(.2-.1x)sin(.2-.1x)
sin(x)
sin(90-x)sin(x)+cos(90-x)/sec(x)
tan(3x+2)cos(3x+2)/sin(3x+2)-1
cos(x)cos(x)cos(x)cos(x)cos(x)
sec(2x+1)sec(-1-2x)+sec(-2x-1)sec(2x+1)
cos(4x)cot(4x)tan(4x)sin(4x)csc(4x)
-cos(x)+cos(x)+sin(2x-4)-1/csc(2x-4)
sec(x)sec(x+2)cot(x)tan(x-2)tan(x+180)
tan(x)(tan(x))
3sin(x)sin(x)/(3)
cos(x)sin(x)
tan(x)sec(x)^2
tan(x)^2-sec(x)^2
7+sin(x)csc(x)csc(x)+cot(x)^2
sin(90)+cos(-90)+sec(180)
csc(1)+csc(10)-csc(30)-csc(60)+csc(90)
sin(36000001)
csc(800)+(cot(720+x)-sec(4x-720))
sin(-x)+sin(x)
csc(-x)+csc(x)
4sin(x)-sin(x)+tan(x)-2tan(x)
cot(x)+10cot(x+90)+99cot(x+180)+.01cot(x-90)
tan(x)tan(x+180)
sec(x)sin(x+180)tan(x-270)cot(x-450)csc(x+90)
sin(x)/cot(x)+sin(x)/cot(x)
sin(x)csc(x)+tan(x)cot(x)+cos(x)sec(x)
cot(x)
9tan(x+90)+90tan(x+9)
cos(x-9999)+tan(x+99999)
2tan(x)tan(x)/2
tan(x)/tan(x-360)+cos(x+180)/cos(x)
csc(4x)sec(270-4x)
cot(91+x)tan(x-449)
csc(2x)(csc(2x)-sin(2x))
csc(x+1)^2-cot(x+1)cot(x+1)
cot(x)cot(x)+1
tan(x)^2-sec(x)sec(x)
tan(x)/cot(x)+csc(x)/csc(x)
cot(x)sin(x)/cos(x)
csc(x)tan(x)cos(x)
csc(x)cot(x)cos(x)
csc(x+90)csc(-x+270)-1
cot(x)/cot(x)+tan(x)/cot(x)+cot(x)cot(x)
sec(x)sec(x)sec(x)sec(x+90)sec(x-90)sec(x+180)
1-cos(x)cos(x+180)+sin(x)^2
sec(x)sec(x)sec(x)sec(x)/cos(x)+cot(x)
cot(x+1)csc(x-1)sec(x+1)tan(x-1)sin(x+1)cos(x-1)
sin(x)-cos(x)+tan(x)-sec(x)+cos(x)-csc(x)
tan(x+23515)-sec(-.27x-23456)
sec(-.9x)
-tan(-x)-csc(360-x)
cos(-x)sec(x)sin(x)csc(-x)
tan(-x)^2-sin(-x)/sin(x)
tan(x)tan(x)+1
csc(x)^2-1
cot(2x)cot(2x)-csc(2x)/sin(2x)
2sec(x)/(6cos(x))
sec(0)+tan(30)cos(60)-csc(90)sin(120)cot(150)+tan(180)csc(210)sin(240)-cos(270)sec(300)+cot(330)
tan(x-1234567)sec(4781053+x)^2
tan(-1234567x)sec(4781053x)^2
sin(x)^9+cos(x)^7+csc(x)^5-cot(x)^3
cos(-33x-7.7)
sec(-.1-x)+tan(-2x-77)
tan(x)+sin(x)-cos(x)+tan(x)-sin(x)
cos(x)-sec(x)/tan(x)+tan(x)/sin(x)
cot(x)-cos(x)/sin(x)
3cos(x)+2/sec(x)-10sin(x)/(2tan(x))
tan(x+3)^11+sin(x+3)^8-cos(x+3)^5+5
sec(x)+sec(x)
csc(.1x)csc(-.1x)csc(x)
cot(x-7)cot(x-7)cot(x+173)cot(x-7)cot(x+173)cot(x-367)
cos(.0001x+1234567)
cot(45)+tan(225)-sin(210)+cos(-60)
sin(12345)cos(23456)tan(34567)sec(45678)csc(56789)cot(67890)
cos(1234x)+cot(1234)+tan(1234x)+sec(1234)+csc(1234)+sin(1234x)
sec(x)sec(x)sec(x)sec(x)sec(x)sec(x)
csc(x)cot(x)sec(x)csc(x)tan(x)sec(x)cot(x)csc(x)cot(x)cos(x)cos(x)cot(x)sin(x)sin(x)cot(x)
csc(2553273)+cot(1507348)-sec(5518930)+csc(5215523)+tan(3471985)-sec(4985147)
sin(20x)+cos(20x)-tan(20x)+sin(20x)-csc(20x)+cot(20x)-tan(20x)+csc(20x)
cot(100000)+cot(100000x)+cot(100000x)+cot(100000)
csc(5x+777)sin(5x+777)
csc(4.5x)
Catatan: Skenario ini sepenuhnya fiksi. Dalam kehidupan nyata, menipu dan membantu orang lain menipu adalah salah dan tidak boleh dilakukan.
sin(36000001)
ke.017452
Jawaban:
Python, 436 + 1909 = 2345
Ini pasti salah satu solusi paling tidak efisien yang dapat dibayangkan dan matematikawan mungkin akan merasa ngeri, tetapi saya telah berhasil menyatukan sesuatu yang sebenarnya menyederhanakan sekitar setengah dari ekspresi tanpa hardcoding:
Output untuk 100 kasus uji harus sebagai berikut (di mana
#
menandai ekspresi yang tidak disederhanakan):Idenya cukup sederhana:
Masalahnya adalah bahwa ada cukup banyak kemungkinan ekspresi untuk diperiksa, jadi saya membatasinya menjadi subset.
Sejujurnya saya tidak cukup sabar untuk menguji kode golf di atas. (Katakan jika menurut Anda itu curang.) Sebaliknya, saya menggunakan aturan yang jauh lebih lama namun lebih efisien untuk menghasilkan subset ekspresi yang lebih kecil yang diharapkan masih mengandung semua penyederhanaan yang diinginkan. Jika Anda ingin mencobanya, ganti ekspresi reguler di baris kedua hingga terakhir kode dengan yang berikut (dan bersiaplah untuk beberapa menit waktu perhitungan):
Program ini juga mengandung beberapa overhead yang diperlukan untuk membuat Python memahami ekspresi matematika. Ini terlibat
sin
,cos
dantan
untuk mengambil argumen dalam derajat bukannya radiens (yang saya pikir OP maksudkan)sec
,csc
dancot
yang bukan bagian darimath
paketsumber
1/3.sec(x)^2
bukan hasil yang valid.CJam, 1 + 3000 = 3001
Sama seperti solusi dasar untuk memberi orang sesuatu untuk dikalahkan:
Ini membaca STDIN ke tumpukan, yang isinya dicetak di akhir program.
Saya yakin ini bisa dikalahkan, tetapi saya juga yakin bahwa banyak optimisasi tidak dapat diimplementasikan dalam karakter yang akan diperoleh.
sumber
Javascript (438 + 2498 = 2936)
Objek di tengah secara opsional berisi output yang disederhanakan berdasarkan pada panjang input dan karakter pertama. Jika tidak, input dikembalikan tanpa dimodifikasi.
Ruang putih hanya untuk dekorasi dan tidak termasuk dalam jumlah karakter.
Sayang sekali bahwa menambahkan semua solusi ini hanya menyelamatkan saya beberapa karakter, tetapi lebih baik daripada tidak sama sekali. Penyederhanaan dilakukan melalui wolframalpha - Saya hanya akan mempercayainya.
sumber