打印特殊角度的sin,cos和tan


9

在三角学中,有某些角度称为“特殊角度”。这是因为当您采用这些角度之一的sin,cos或tan时,您得到的结果很容易记住,因为它是有理数的平方根。这些特殊角度始终是pi/6或的倍数pi/4。这是所有特殊角度及其对应的触发值的可视化。

触发值

如您所见,对于每个角度,它们都是一对对应的数字。第一个数字是该角度的余弦,第二个数字是该角度的正弦。要找到这些角度之一的切线,只需将sin除以cos。例如tan(pi/6)等于

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

挑战

您必须编写一个包含3个输入的完整程序。

  1. 代表您应该计算的trig函数的单个char。这将是“ s”(正弦),“ c”(cos)或“ t”(棕褐色)。

  2. 输入角度的分子。这可以是任何正整数。请注意,输入5表示分子为5 * pi。

  3. 输入角度的分母。这将始终是以下之一:1, 2, 3, 4, 6

然后打印出该角度的触发函数的精确值。以下是所有角度最大为2 * pi的sin,cos和tan的列表:

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

如果您得到的数字大于2pi,请从中减去2pi,直到获得范围内的数字。例如,sin(17pi/6)sin(5pi/6)== 1/2 相同。例如,如果您输入cos(2pi/4)的内容与cos(pi/2)== 0 相同,则您的程序应进行基本简化。不允许使用内置三角函数。

以字节为单位的最短答案胜出!


输出格式是否必须完全指定?
lirtosiast '16

@ThomasKwa是的。
詹姆斯,


@DigitalTrauma哈哈,这将是下一个挑战!Jk ...
James James

Answers:


2

Pyth,125 122字节

使用公式n = 4 - |floor(4.5-9k)|(其中kπ = θk是第二个输入和第三个输入的商)来确定有疑问的特殊角度:角度0、30、45、60和90度分别编号为0到4,以及90〜180度角反向;这个公式适用于θ∈[0,π]。相应的正弦值将为sqrt(n)/2并且存在,非零正切值将为3^(n/2-1)。但是,我的实现使用带有硬编码压缩字符串的列表来更好地控制输出格式,并且看起来代码也是如此。

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

让我们将其转换为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])

在线测试

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.