Bantu saya dengan trigonometri!

8

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. xadalah 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.5atau -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.

Ypnypn
sumber
5
Saya menghitung tidak kurang dari empat puluh identitas dan aksioma matematika yang berbeda yang diperlukan untuk menyederhanakan ini. Bahkan mengurai salah satu ekspresi dan memasukkannya ke dalam semacam bentuk internal terstruktur akan membutuhkan sedikit kode. Terlalu kaya untukku. Tapi mungkin ada beberapa di sini mencari tantangan semacam ini.
COTO
@COTO Anda tidak perlu menguraikannya. Anda dapat mencoba mendeteksi masalah mana yang menjadi dan meng-hardcode jawaban dalam bentuk terkompresi. Bahkan mungkin lebih pendek dari parsing.
Ingo Bürk
3
jika printer Anda tidak dapat mencetak karakter non-ASCII, Anda memerlukan printer yang lebih baik.
John Dvorak
3
Saya hanya tahu apakah orang ini bahkan mendapat UPVOTES? Kemudian saya perhatikan bahwa itu bukan math.SE, soo ... konteks penting =)
flawr
1
@Ypnypn Oh, ok, jadi misalnya kita tidak bisa mengurangi sin(36000001) ke.017452
Digital Trauma

Jawaban:

8

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:

from math import*
import exrex,re
d=lambda f:lambda x:f(x*pi/180)
sin,cos,tan=d(sin),d(cos),d(tan)
i=lambda f:lambda x:1/f(x)
sec,csc,cot=i(cos),i(sin),i(tan)
t=lambda s:[round(eval(re.sub('([\d\).])([\(a-z])','\\1*\\2',s).replace('^','**')+'+0')*1e9)for x in[1,44]]
def f(I):
 try:return min((s for s in exrex.generate('(-?\d|\(1/\d\.\))?([+-]?(sin|cos|tan|cot|sec|csc)\(x\)(\^\d)?){0,4}')if s and t(s)==t(I)),key=len)
 except:return I

Output untuk 100 kasus uji harus sebagai berikut (di mana #menandai ekspresi yang tidak disederhanakan):

cos(x)
7+sin(x)
#
2+tan(x)^2cos(x)^2
(1/2.)cos(x)
sin(x)cos(x)^2
#
sin(x)^2tan(x)^7
1
#
#
sin(x)cos(x)
-1
-1
tan(x)^2
-cot(x)cos(x)
-cot(x)cos(x)^2
#
sin(x)
2sin(x)cos(x)
0
cos(x)^5
#
#
#
#
tan(x)^2
sin(x)^2
sin(x)cos(x)
tan(x)sec(x)^2
-1
7+cot(x)^2+csc(x)
0
#
#
#
0
0
3sin(x)-tan(x)
#
tan(x)^2
-tan(x)sec(x)
2sin(x)tan(x)
3
cot(x)
#
#
tan(x)^2
0
#
1
#
1
csc(x)^2
-1
sec(x)^2
1
1
cot(x)^2
-1-sec(x)^2
cot(x)^2+sec(x)^2
sec(x)^4csc(x)^2
2
cot(x)+sec(x)^5
#
sin(x)+tan(x)-csc(x)-sec(x)
#
#
tan(x)+csc(x)
-1
sec(x)^2
sec(x)^2
cot(x)^2
-1
(1/3.)sec(x)^2
#
#
#
#
#
#
2tan(x)-cos(x)
cos(x)-csc(x)+sec(x)
0
0
#
2sec(x)
#
#
#
3
#
#
sec(x)^6
cot(x)^4csc(x)
#
#
#
1
#

Idenya cukup sederhana:

  • menghasilkan sejumlah besar kemungkinan ekspresi
  • pilih yang menghasilkan hasil yang sama dengan ekspresi yang ingin Anda sederhanakan, bandingkan dengan beberapa (di sini dua) nilai x
  • dari ekspresi yang setara menghasilkan yang terpendek

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):

'0|((-1|\(1/[23]\.\)|[1237])[+-]?)?(sin\(x\)(\^2)?)?-?(tan\(x\)(\^[27])?)?(cot\(x\)(\^[24])?)?[+-]?(cos\(x\)(\^[25])?)?(sec\(x\)(\^[2456])?)?(csc\(x\)(\^2)?)?'

Program ini juga mengandung beberapa overhead yang diperlukan untuk membuat Python memahami ekspresi matematika. Ini terlibat

  • mendefinisikan ulang sin, cosdan tanuntuk mengambil argumen dalam derajat bukannya radiens (yang saya pikir OP maksudkan)
  • mendefinisikan sec, cscdan cotyang bukan bagian dari mathpaket
  • memasukkan semua tanda multiplikasi tersirat
  • mengganti operator eksponensial
Emil
sumber
@ Doorknob Bagaimana ekspresi kasar dan membandingkan dua nilai lebih dari "solusi nyata" daripada yang lain?
Ingo Bürk
@ Emil Karena Anda hanya membandingkan dua nilai berbeda untuk `x ', sudahkah Anda memastikan bahwa penyederhanaan sebenarnya benar?
Ingo Bürk
Melihatnya dengan cepat, saya tidak dapat menemukan penyederhanaan yang salah (mengesankan), tetapi menurut saya 1/3.sec(x)^2bukan hasil yang valid.
Ingo Bürk
1
@ IngoBürk, semua jawaban dihitung dengan tangan atau dengan WolframAlpha terlebih dahulu dan saya kemudian membandingkannya dengan output program. Dalam dua atau tiga kasus, program tersebut sebenarnya menemukan penyederhanaan yang tidak dihasilkan oleh WolframAlpha, tetapi saya dapat mengkonfirmasi bahwa tesis ini juga benar. Tapi tentu saja Anda benar, mungkin ada tabrakan. Hanya saja sifat dari fungsi yang dimaksud membuatnya sangat tidak mungkin bahwa dua grafik yang berbeda harus berpotongan pada dua titik saya dalam akurasi yang digunakan. Saya telah melihat tabrakan jika saya menggunakan hanya satu titik atau jika dua titik terlalu berdekatan.
Emil
1
@Emil Baiklah. Saya sangat suka solusi ini btw!
Ingo Bürk
6

CJam, 1 + 3000 = 3001

Sama seperti solusi dasar untuk memberi orang sesuatu untuk dikalahkan:

l

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.

Martin Ender
sumber
Apakah dinyatakan di mana saja bagaimana cara menghitung skor? Saya suka metode Anda. Namun, saya tidak akan mempertimbangkan baris baru, sehingga skor dasar menjadi 3000.
Emil
@Emil "Cobalah untuk meminimalkan jumlah panjang program dan total panjang semua solusi." - Saya harus membacanya beberapa kali juga.
Ingo Bürk
Saya bertanya-tanya mengapa Martin tidak menggunakan Golfscript. Tidak perlu secara eksplisit membaca input di sana = D
Ingo Bürk
Saya tidak mengerti. Bagaimana jawaban ini dan yang di bawah ini terkait dengan pertanyaan, yang menanyakan tentang trigonometri dan lainnya
Pengoptimal
2
@ IngoBürk Karena saya tidak tahu GolfScript. : P
Martin Ender
5

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.

s='sin(x)';(p=prompt)({
    352:s+"^2cos(x)^3+2",
    307:"cos(x)/2",
    348:s+"8(1+cos(x)^2)",
    "81s":s+"^2tan(x)^7",
    "55s":"-sin(0.2-0.1x)^5",
    "39s":"2sec(2x+1)^2",
    "35c":"cos(4x)",
    "36-":0,
    173:s+"^2",
    "25s":0,
    294:s+"3-tan(x)",
    "27s":s+"2/cot(x)",
    "40c":"1+tan(x)^2+cot(x)^2",
    "48c":1,
    "41s":s+"+tan(x)-csc(x)-sec(x)",
    "26c":-1,
    "24t":"1+tan(x)^2",
    "96s":"2.5+1/cos(30)",
    "34t":"2tan(x)-cos(x)",
    353:0,
    "36s":"6sec(x)",
    "90s":"cot(x)^4csc(x)"
}[(i=p()).length+i[0]]||i)

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.

Ingo Bürk
sumber