Giúp tôi với lượng giác!


8

Cảm ơn các bạn rất nhiều vì sự giúp đỡ của bạn với tính toán . Bây giờ tôi cần một số trợ giúp với bài kiểm tra lượng giác sắp tới của tôi.

Trong bài kiểm tra, tôi sẽ cần đơn giản hóa các biểu thức. Tôi sẽ được cung cấp đầu vào như 4sin(x)/(2cos(x))và sẽ phải tạo một biểu thức đơn giản hơn nhưng tương đương (chẳng hạn như 2tan(x)). Tất cả các góc đều tính theo độ và chúng tôi sẽ giả vờ rằng không có vấn đề miền chia hoặc không hợp lệ. (Ví dụ: chúng tôi sẽ giả sử rằng tan (x + 1) cot (x + 1) sin (x) / sin (x) luôn là 1.)

Tôi lẻn vào văn phòng của giáo sư và nhận được một danh sách 100 vấn đề có thể có trong bài kiểm tra. Xin vui lòng cho tôi mã teh để giải quyết tất cả. Có thể một số vấn đề đã được đơn giản hóa hết mức có thể; Nếu vậy chỉ cần trả lại đầu vào.

Tôi cần các biểu thức được đơn giản hóa, nhưng tôi cũng muốn một chương trình ngắn (hoặc hàm) để giáo sư không chú ý. Cố gắng giảm thiểu tổng chiều dài của chương trình và tổng chiều dài của tất cả các giải pháp.

Chỉ cần làm rõ, sẽ ổn nếu một số biểu thức được trả về không thay đổi hoặc thậm chí được trả về ở dạng tương đương nhưng dài hơn. Ngoài ra, chương trình chỉ cần làm việc trên các biểu thức được liệt kê dưới đây; nó có thể trả về kết quả không chính xác hoặc thậm chí phá vỡ cho các đầu vào khác.

Như bạn có thể nói, tất cả các vấn đề đều theo một định dạng tương tự. xlà biến duy nhất được sử dụng, không có khoảng trắng và dấu ngoặc đơn theo từng tên hàm. (Các chức năng là sin, cos, tan, sec, csc, và tan.) Không có chức năng lồng nhau, nhưng bên trong một hàm có thể là một biểu hiện như 3x+4.5hay -2-.7x. Số mũ có thể được sử dụng, nhưng chỉ trên các hàm (ví dụ sin(x-.5)^7) và công suất luôn là một số nguyên trên một. Phép nhân được chỉ định thông qua ghép.

Các đầu ra cũng cần phải ở định dạng này. Không hợp lệ : sin x, sin(x)/cos(x)tan(x)[là tiếp tuyến được nhân hay chia?], cos(x[Đóng tất cả dấu ngoặc đơn] 4*sin(x),,sec(x)^1

Tôi có thể sử dụng bất kỳ ngôn ngữ lập trình nào, trừ khi nó phụ thuộc vào các chức năng đơn giản hóa hoặc xử lý biểu thức tích hợp. Chức năng trig tích hợp là ổn. (Tôi sẽ có một máy tính khoa học rất cơ bản trong quá trình thử nghiệm.) Ngoài ra, vì tôi sẽ đọc chương trình viết trên giấy, tôi chỉ có thể sử dụng các ký tự ASCII có thể in được (0x20 đến 0x7E) và các dòng mới.

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)

Lưu ý: Kịch bản này là hoàn toàn hư cấu. Trong cuộc sống thực, gian lận và giúp đỡ người khác gian lận là sai và không bao giờ nên làm.


5
Tôi đếm không dưới bốn mươi danh tính và tiên đề toán học khác nhau sẽ cần thiết để đơn giản hóa việc này. Ngay cả việc phân tích một trong các biểu thức và đưa nó vào một dạng biểu mẫu bên trong có cấu trúc nào đó cũng sẽ có một chút mã hợp lý. Quá giàu cho tôi. Nhưng có lẽ có một số người ở đây đang tìm kiếm loại thử thách này.
COTO

@COTO bạn không phải phân tích cú pháp. Bạn có thể cố gắng phát hiện vấn đề nào và mã hóa các câu trả lời ở dạng nén. Nó thậm chí có thể ngắn hơn phân tích cú pháp.
Ingo Bürk

3
nếu máy in của bạn không thể in bất kỳ ký tự không phải ASCII nào, bạn cần một máy in tốt hơn.
John Dvorak

3
Tôi chỉ cần WTF anh chàng này thậm chí có UPVOTES? Sau đó, tôi nhận thấy rằng đó không phải là toán học. Soo, ... vấn đề bối cảnh =)
flawr

1
@Ypnypn Oh, ok, vì vậy, ví dụ chúng ta không thể giảm sin(36000001) xuống.017452
Chấn thương kỹ thuật số

Câu trả lời:


8

Con trăn, 436 + 1909 = 2345

Đây phải là một trong những giải pháp kém hiệu quả nhất có thể tưởng tượng và các nhà toán học có thể sẽ co rúm lại, nhưng tôi đã xoay sở để ném một cái gì đó thực sự đơn giản hóa khoảng một nửa các biểu thức mà không cần mã hóa cứng:

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

Đầu ra cho 100 trường hợp thử nghiệm phải như sau (trong đó # đánh dấu các biểu thức không được đơn giản hóa):

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
#

Ý tưởng khá đơn giản:

  • tạo ra một lượng lớn các biểu thức có thể
  • chọn những kết quả mang lại kết quả giống như biểu thức bạn muốn đơn giản hóa, so sánh chúng với một số (ở đây hai) giá trị x
  • từ các biểu thức tương đương trả về cái ngắn nhất

Vấn đề là có khá nhiều biểu thức có thể kiểm tra, vì vậy tôi giới hạn nó trong một tập hợp con.

Thành thật mà nói, tôi đã không đủ kiên nhẫn để kiểm tra mã đánh gôn ở trên. (Hãy cho tôi biết nếu bạn nghĩ đó là gian lận.) Thay vào đó tôi đã sử dụng quy tắc dài hơn nhưng hiệu quả hơn để tạo ra một tập hợp biểu thức nhỏ hơn nữa mà hy vọng vẫn chứa tất cả các đơn giản hóa mong muốn. Nếu bạn muốn thử điều đó, hãy thay thế biểu thức chính quy trong dòng thứ hai đến dòng cuối cùng của mã bằng dòng sau (và được chuẩn bị cho một vài phút thời gian tính toán):

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

Chương trình cũng chứa khá nhiều chi phí cần thiết để làm cho Python hiểu các biểu thức toán học. Điều này liên quan

  • xác định lại sin, costan để một vài tham số trong độ thay vì radiens (đó là những gì tôi nghĩ OP dự định)
  • xác định sec, csccotđó không phải là một phần củamath gói
  • chèn tất cả các dấu hiệu nhân
  • thay thế toán tử lũy thừa

@Doorknob Làm thế nào là biểu thức cưỡng bức và so sánh hai giá trị bất kỳ của một "giải pháp thực sự" so với các giá trị khác?
Ingo Bürk

@Emil Vì bạn chỉ so sánh hai giá trị khác nhau cho `x ', bằng cách nào đó bạn có đảm bảo rằng sự đơn giản hóa thực sự chính xác không?
Ingo Bürk

Nhìn nhanh ra tôi không thể tìm thấy sự đơn giản hóa không chính xác (ấn tượng), nhưng theo hiểu biết của tôi 1/3.sec(x)^2thì không phải là đầu ra hợp lệ.
Ingo Bürk

1
@ IngoBürk, tất cả các câu trả lời được tính toán bằng tay hoặc với WolframAlpha trước và sau đó tôi đã so sánh chúng với kết quả đầu ra của chương trình. Trong hai hoặc ba trường hợp, chương trình thực sự tìm thấy sự đơn giản hóa mà WolframAlpha không xuất ra, nhưng tôi có thể xác nhận rằng các luận điểm cũng đúng. Nhưng tất nhiên là bạn đúng, có khả năng có thể có va chạm. Chỉ là bản chất của các hàm trong câu hỏi khiến cho hai biểu đồ riêng biệt không thể giao nhau tại hai điểm của tôi trong độ chính xác được sử dụng. Tôi đã thấy va chạm nếu tôi chỉ sử dụng một điểm hoặc nếu hai điểm quá gần nhau.
Emil

1
@Emil Được rồi. Tôi thực sự thích giải pháp này btw!
Ingo Bürk

6

CJam, 1 + 3000 = 3001

Cũng giống như giải pháp cơ bản để cung cấp cho mọi người thứ gì đó để đánh bại:

l

Điều này đọc STDIN trên ngăn xếp, có nội dung được in ở cuối chương trình.

Tôi chắc chắn điều này có thể bị đánh bại, nhưng tôi cũng chắc chắn rằng nhiều sự tối ưu hóa không thể được thực hiện trong các nhân vật sẽ đạt được.


Nó đã được nêu ở bất cứ nơi nào làm thế nào để tính điểm? Tôi thích phương pháp của bạn. Tuy nhiên, tôi sẽ không xem xét các dòng mới, để điểm cơ bản sẽ là 3000.
Emil

@Emil "Cố gắng giảm thiểu tổng chiều dài của chương trình và tổng chiều dài của tất cả các giải pháp." - Tôi đã phải đọc nó nhiều lần là tốt.
Ingo Bürk

Tôi tự hỏi tại sao Martin không sử dụng Golfscript. Không cần phải đọc rõ ràng đầu vào ở đó = D
Ingo Bürk

Tôi không hiểu Câu trả lời này như thế nào và câu hỏi dưới đây dù sao cũng liên quan đến câu hỏi, câu hỏi về lượng giác và công cụ
Trình tối ưu hóa

2
@ IngoBürk Vì tôi không biết GolfScript. : P
Martin Ender

5

Javascript (438 + 2498 = 2936)

Đối tượng ở giữa tùy chọn chứa các đầu ra được đơn giản hóa dựa trên độ dài của đầu vào và ký tự đầu tiên. Nếu không, đầu vào được trả lại không thay đổi.

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)

Khoảng trắng chỉ để trang trí và không bao gồm trong số lượng ký tự.

Thật xấu hổ khi thêm tất cả các giải pháp này chỉ giúp tôi tiết kiệm được một vài ký tự, nhưng tốt hơn là không có gì. Việc đơn giản hóa được thực hiện thông qua wolframalpha - Tôi sẽ chỉ tin tưởng nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.