Imprime sin, cos y tan de ángulos especiales

9

En trigonometría, hay ciertos ángulos conocidos como "ángulos especiales". Esto se debe a que cuando tomas pecado, cos o tan de uno de estos ángulos, obtienes un resultado que es fácil de recordar porque es una raíz cuadrada de un número racional. Estos ángulos especiales son siempre múltiplos de cualquiera pi/6, o pi/4. Aquí hay una visualización de todos los ángulos especiales y sus valores trigonométricos correspondientes.

valores trigonométricos

Como puede ver, para cada ángulo hay un par de números correspondiente. El primer número es el coseno de ese ángulo, y el segundo es el seno de ese ángulo. Para encontrar la tangente de uno de estos ángulos, simplemente divide sin por cos. Por ejemplo, tan(pi/6)es igual a

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

El reto

Debe escribir un programa completo que tome 3 entradas.

  1. Un único carácter que representa la función trigonométrica que se supone que debes calcular. Esto será 's' (sin), 'c' (cos) o 't' (tan).

  2. El numerador del ángulo de entrada. Esto puede ser cualquier número entero positivo. Tenga en cuenta que una entrada de 5 significa que el numerador es 5 * pi.

  3. El denominador del ángulo de entrada. Este siempre será uno de los siguientes:1, 2, 3, 4, 6

Luego imprima el valor exacto de la función trigonométrica de ese ángulo. Aquí hay una lista de sin, cos y tan de todos los ángulos hasta 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

Si obtiene un número mayor que 2pi, reste 2pi hasta obtener un número que esté dentro del rango. Por ejemplo, sin(17pi/6)es lo mismo que sin(5pi/6)== 1/2. Se espera que su programa haga una simplificación básica, por ejemplo, si su entrada cos(2pi/4)es la misma que cos(pi/2)== 0. Las funciones de trigonometría incorporadas no están permitidas.

¡La respuesta más corta en bytes gana!

James
fuente
¿El formato de salida debe ser exactamente como se especifica?
lirtosiast
@ThomasKwa sí.
James
@DigitalTrauma Jaja, ¡ese será el próximo desafío! Jk ...
James

Respuestas:

2

Pyth, 125 122 bytes

Utiliza la fórmula n = 4 - |floor(4.5-9k)|, donde kπ = θes decir, k es el cociente de la segunda y tercera entrada, para determinar qué ángulo especial está en cuestión: los ángulos 0, 30, 45, 60 y 90 grados están numerados del 0 al 4 respectivamente, y el 90 ~ 180 los ángulos de grados van en reversa; Esta fórmula funciona para θ∈[0,π]. Los valores de los senos correspondientes serían sqrt(n)/2y las tangentes existentes no nulas serían 3^(n/2-1). Sin embargo, mi implementación usa listas con cadenas comprimidas codificadas para un mayor control del formato de salida, y parece que el código también es más corto de esa manera.

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

Convirtámoslo en pseudocódigo pitónico:

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

Prueba en línea .

busukxuan
fuente