In sin, cos và tan các góc đặc biệt


9

Trong lượng giác, có một số góc nhất định được gọi là "góc đặc biệt". Điều này là do khi bạn lấy sin, cos hoặc tan của một trong các góc này, bạn sẽ nhận được một kết quả dễ nhớ vì nó là căn bậc hai của một số hữu tỷ. Những góc đặc biệt này luôn là bội số của một trong hai pi/6, hoặc pi/4. Dưới đây là một hình dung của tất cả các góc đặc biệt, và các giá trị trig tương ứng của chúng.

giá trị trig

Như bạn có thể thấy, với mỗi góc của chúng là một cặp số tương ứng. Số thứ nhất là cosin của góc đó và số thứ hai là sin của góc đó. Để tìm tiếp tuyến của một trong những góc này, chỉ cần chia tội lỗi cho cos. Ví dụ, tan(pi/6)bằng

sin(pi/6) / cos(pi/6) == 
(1/2) / (√3/2) ==
1/√3 ==
√3/3

Các thách thức

Bạn phải viết một chương trình đầy đủ có 3 đầu vào.

  1. Một char duy nhất đại diện cho hàm trig mà bạn phải tính toán. Đây sẽ là 's' (sin), 'c' (cos) hoặc 't' (tan).

  2. Tử số của góc đầu vào. Đây có thể là bất kỳ số nguyên dương. Lưu ý rằng đầu vào là 5 có nghĩa là tử số là 5 * pi.

  3. Mẫu số của góc đầu vào. Đây sẽ luôn là một trong những điều sau đây:1, 2, 3, 4, 6

Sau đó in ra giá trị chính xác hàm trig của góc đó. Dưới đây là danh sách các tội lỗi, cos và tan của tất cả các góc lên tới 2 * pi:

sin(0pi):    0
sin(pi/6):   1/2
sin(pi/4):   root(2)/2
sin(pi/3):   root(3)/2
sin(pi/2):   1
sin(2pi/3):  root(3)/2
sin(3pi/4):  root(2)/2
sin(5pi/6):  1/2
sin(1pi):    0
sin(7pi/6):  -1/2
sin(5pi/4):  -root(2)/2
sin(4pi/3):  -root(3)/2
sin(3pi/2):  -1
sin(5pi/3):  -root(3)/2
sin(7pi/4):  -root(2)/2
sin(11pi/6): -1/2
sin(2pi):    0

cos(0pi):    1
cos(pi/6):   root(3)/2
cos(pi/4):   root(2)/2
cos(pi/3):   1/2
cos(pi/2):   0
cos(2pi/3):  -1/2
cos(3pi/4):  -root(2)/2
cos(5pi/6):  -root(3)/2
cos(1pi):    -1
cos(7pi/6):  -root(3)/2
cos(5pi/4):  -root(2)/2
cos(4pi/3):  -1/2
cos(3pi/2):  0
cos(5pi/3):  1/2
cos(7pi/4):  root(2)/2
cos(11pi/6): root(3)/2
cos(2pi):    1

tan(0pi):    0
tan(pi/6):   root(3)/3
tan(pi/4):   1
tan(pi/3):   root(3)
tan(pi/2):   nan
tan(2pi/3):  -root(3)
tan(3pi/4):  -1
tan(5pi/6):  -root(3)/3
tan(1pi):    0
tan(7pi/6):  root(3)/3
tan(5pi/4):  1
tan(4pi/3):  root(3)
tan(3pi/2):  nan
tan(5pi/3):  -root(3)
tan(7pi/4):  -1
tan(11pi/6): -root(3)/3
tan(2pi):    0

Nếu bạn nhận được một số lớn hơn 2pi, hãy trừ 2pi cho đến khi bạn nhận được một số nằm trong phạm vi. Ví dụ: sin(17pi/6)giống như sin(5pi/6)== 1/2. Chương trình của bạn dự kiến ​​sẽ thực hiện đơn giản hóa cơ bản, ví dụ, nếu đầu vào của bạn cos(2pi/4)giống như cos(pi/2)== 0. Các hàm lượng giác dựng sẵn không được phép.

Câu trả lời ngắn nhất trong byte chiến thắng!


Định dạng đầu ra phải chính xác như được chỉ định?
lirtosiast 6/2/2016

@ThomasKwa vâng.
James


@DigitalTrauma Haha, đó sẽ là thử thách tiếp theo! Jk ...
James

Câu trả lời:


2

Bình thường, 125 122 byte

Sử dụng công thức n = 4 - |floor(4.5-9k)|, trong đó kπ = θtức là k là thương số của đầu vào thứ hai và thứ ba, để xác định góc đặc biệt nào trong câu hỏi: các góc 0, 30, 45, 60 và 90 độ được đánh số từ 0 đến 4 và 90 ~ 180 góc độ đi ngược lại; công thức này làm việc cho θ∈[0,π]. Các giá trị của các sin tương ứng sẽ là sqrt(n)/2và tồn tại, các tiếp tuyến khác không sẽ là 3^(n/2-1). Tuy nhiên, việc triển khai của tôi sử dụng danh sách với các chuỗi nén được mã hóa cứng để kiểm soát định dạng đầu ra cao hơn và có vẻ như mã cũng ngắn hơn theo cách đó.

A,c." t8¾Îzp³9ÓÍÕ¬$ ·Íb³°ü"dc." t@a'óè©ê¶oyÑáîwÀ(";J+cEE?qz\c.5ZK-4.as-4.5*3*3%J1?qz\t+?>%J1 .5\-k@GK+?>%J2 1\-k@HK

Chúng ta hãy biến nó thành mã giả pythonic:

                                   z = input()
                                   k = ""
                                   d = " "
                                   Z = 0
A,c." t8¾Îzp³9ÓÍÕ¬$ ·Íb³°ü"d       G = "0 sqrt(3)/3 1 sqrt(3) nan".split(d)
  c." t@a'óè©ê¶oyÑáîwÀ(";          H = "0 1/2 sqrt(2)/2 sqrt(3)/2 1".split()
J+cEE                              J = eval(input())/eval(input()) +
  ?qz\c.5Z                             0.5 if z == "c" else Z
                                   # the second term converts sin to cos
K-4.as-4.5*3*3%J1                  K = 4 - abs(int(4.5 - 3*3*(J%1)))
                                   # 9* would lose precision so 3*3* instead
?qz\t                              if z == "t"
  +?>%J1 .5\-k                         print(("-" if J%1 > 0.5 else k) +
   @GK                                     G[K])
                                   else:
  +?>%J2 1\-k                          print(("-" if J%2 > 1 else k) +
   @HK                                     H[K])

Kiểm tra trực tuyế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.