Cetak dosa, cos, dan tan dari sudut khusus

9

Dalam trigonometri, ada sudut tertentu yang dikenal sebagai "sudut khusus". Ini karena ketika Anda mengambil dosa, cos atau tan dari salah satu sudut ini, Anda mendapatkan hasil yang mudah diingat karena itu adalah akar kuadrat dari bilangan rasional. Sudut khusus ini selalu merupakan kelipatan dari keduanya pi/6, atau pi/4. Berikut adalah visualisasi dari semua sudut khusus, dan nilai trigonometri yang sesuai.

nilai trigonometri

Seperti yang Anda lihat, untuk setiap sudut mereka adalah pasangan angka yang sesuai. Angka pertama adalah cosinus dari sudut itu, dan yang kedua adalah sinus dari sudut itu. Untuk menemukan garis singgung dari salah satu sudut ini, cukup bagi dosa dengan cos. Misalnya, tan(pi/6)sama dengan

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

Tantangan

Anda harus menulis program lengkap yang membutuhkan 3 input.

  1. Satu arang mewakili fungsi trigonometri yang seharusnya Anda hitung. Ini akan menjadi 's' (dosa), 'c' (cos), atau 't' (tan).

  2. Pembilang dari sudut input. Ini bisa berupa bilangan bulat positif. Perhatikan bahwa input 5 berarti pembilangnya 5 * pi.

  3. Penyebut dari sudut input. Ini akan selalu menjadi salah satu dari yang berikut:1, 2, 3, 4, 6

Kemudian cetak nilai persisnya fungsi trigonometri dari sudut itu. Berikut adalah daftar dosa, cos, dan tan dari semua sudut hingga 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

Jika Anda mendapatkan angka yang lebih besar dari 2pi, kurangi 2pi darinya hingga Anda mendapatkan angka yang ada dalam jangkauan. Misalnya, sin(17pi/6)sama dengan sin(5pi/6)== 1/2. Program Anda diharapkan untuk melakukan penyederhanaan dasar, misalnya, jika input Anda cos(2pi/4)sama dengan cos(pi/2)== 0. Fungsi trigonometri bawaan tidak diizinkan.

Jawaban terpendek dalam byte menang!

James
sumber
Haruskah format output persis seperti yang ditentukan?
lirtosiast
@ Thomas, ya.
James
@DigitalTrauma Haha, itu akan menjadi tantangan berikutnya! Jk ...
James

Jawaban:

2

Pyth, 125 122 byte

Menggunakan rumus n = 4 - |floor(4.5-9k)|, di mana kπ = θk adalah hasil bagi input kedua dan ketiga, untuk menentukan sudut khusus mana yang dipertanyakan: sudut 0, 30, 45, 60 dan 90 derajat diberi nomor masing-masing 0 hingga 4, dan 90 ~ 180 derajat sudut bergerak terbalik; rumus ini berfungsi untuk θ∈[0,π]. Nilai-nilai sinus yang sesuai akan sqrt(n)/2dan ada, garis singgung non-nol akan 3^(n/2-1). Namun, implementasi saya menggunakan daftar dengan string terkompresi hard-code untuk kontrol yang lebih tinggi dari format output, dan sepertinya kode lebih pendek juga.

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

Mari mengubahnya menjadi kodesemu 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])

Tes online .

busukxuan
sumber