Imprimer le péché, le cos et le bronzage d'angles spéciaux

9

En trigonométrie, il existe certains angles appelés "angles spéciaux". En effet, lorsque vous prenez sin, cos ou tan de l'un de ces angles, vous obtenez un résultat facile à retenir car il s'agit d'une racine carrée d'un nombre rationnel. Ces angles spéciaux sont toujours des multiples de l'un pi/6ou de l'autre pi/4. Voici une visualisation de tous les angles spéciaux et de leurs valeurs de trig correspondantes.

valeurs trig

Comme vous pouvez le voir, pour chaque angle, il s'agit d'une paire de nombres correspondante. Le premier nombre est le cosinus de cet angle et le second est le sinus de cet angle. Pour trouver la tangente d'un de ces angles, il suffit de diviser sin par cos. Par exemple, tan(pi/6)est égal à

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

Le défi

Vous devez écrire un programme complet qui prend 3 entrées.

  1. Un seul caractère représentant la fonction trig que vous êtes censé calculer. Ce sera soit 's' (sin), 'c' (cos), soit 't' (tan).

  2. Le numérateur de l'angle d'entrée. Cela peut être n'importe quel entier positif. Notez qu'une entrée de 5 signifie que le numérateur est 5 * pi.

  3. Le dénominateur de l'angle d'entrée. Ce sera toujours l'un des suivants:1, 2, 3, 4, 6

Imprimez ensuite la valeur exacte de la fonction trig de cet angle. Voici une liste de sin, cos et tan de tous les angles jusqu'à 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 vous obtenez un nombre supérieur à 2pi, soustrayez-en 2pi jusqu'à ce que vous obteniez un nombre qui est dans la plage. Par exemple, sin(17pi/6)c'est la même chose que sin(5pi/6)== 1/2. Votre programme devrait effectuer une simplification de base, par exemple, si votre entrée est cos(2pi/4)identique à cos(pi/2)== 0. Les fonctions de trigonométrie intégrées ne sont pas autorisées.

La réponse la plus courte en octets gagne!

James
la source
Le format de sortie doit-il être exactement comme spécifié?
lirtosiast
@ThomasKwa oui.
James
@DigitalTrauma Haha, ce sera le prochain défi! Jk ...
James

Réponses:

2

Pyth, 125 122 octets

Utilise la formule n = 4 - |floor(4.5-9k)|, où kπ = θie k est le quotient des deuxième et troisième entrées, pour déterminer quel angle spécial est en question: les angles 0, 30, 45, 60 et 90 degrés sont numérotés de 0 à 4 respectivement, et les 90 ~ 180 les angles de degrés vont en sens inverse; cette formule fonctionne pour θ∈[0,π]. Les valeurs des sinus correspondants seraient sqrt(n)/2et existantes, les tangentes non nulles seraient 3^(n/2-1). Cependant, mon implémentation utilise des listes avec des chaînes compressées codées en dur pour un meilleur contrôle du format de sortie, et il semble que le code soit également plus court de cette façon.

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

Transformons-le en pseudocode pythonique:

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

Testez en ligne .

busukxuan
la source