Drucken Sie sin, cos und tan in speziellen Winkeln


9

In der Trigonometrie gibt es bestimmte Winkel, die als "spezielle Winkel" bekannt sind. Dies liegt daran, dass Sie, wenn Sie Sünde, Cos oder Bräune in einem dieser Winkel nehmen, ein Ergebnis erhalten, das leicht zu merken ist, da es eine Quadratwurzel einer rationalen Zahl ist. Diese speziellen Winkel sind immer Vielfache von entweder pi/6oder pi/4. Hier finden Sie eine Visualisierung aller speziellen Winkel und ihrer entsprechenden Triggerwerte.

Triggerwerte

Wie Sie sehen können, ist für jeden Winkel ein entsprechendes Zahlenpaar vorhanden. Die erste Zahl ist der Kosinus dieses Winkels und die zweite der Sinus dieses Winkels. Um die Tangente eines dieser Winkel zu finden, teilen Sie einfach die Sünde durch cos. Zum Beispiel tan(pi/6)ist gleich

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

Die Herausforderung

Sie müssen ein vollständiges Programm schreiben, das 3 Eingaben akzeptiert.

  1. Ein einzelnes Zeichen für die Triggerfunktion, die Sie berechnen sollen. Dies ist entweder 's' (sin), 'c' (cos) oder 't' (tan).

  2. Der Zähler des Eingabewinkels. Dies kann eine beliebige positive Ganzzahl sein. Beachten Sie, dass eine Eingabe von 5 bedeutet, dass der Zähler 5 * pi ist.

  3. Der Nenner des Eingabewinkels. Dies wird immer eine der folgenden sein:1, 2, 3, 4, 6

Drucken Sie dann den genauen Wert der Triggerfunktion dieses Winkels aus. Hier ist eine Liste von sin, cos und tan aller Winkel bis zu 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

Wenn Sie eine Zahl größer als 2 pi erhalten, subtrahieren Sie 2 pi davon, bis Sie eine Zahl erhalten, die im Bereich liegt. Zum Beispiel sin(17pi/6)ist das gleiche wie sin(5pi/6)== 1/2. Von Ihrem Programm wird eine grundlegende Vereinfachung erwartet, z. B. wenn Ihre Eingabe cos(2pi/4)mit cos(pi/2)== 0 identisch ist. Integrierte Trigonometriefunktionen sind nicht zulässig.

Die kürzeste Antwort in Bytes gewinnt!


Muss das Ausgabeformat genau wie angegeben sein?
Lirtosiast

@ ThomasKwa ja.
James


@ DigitalTrauma Haha, das wird die nächste Herausforderung! Jk ...
James

Antworten:


2

Pyth, 125 122 Bytes

Verwendet die Formel n = 4 - |floor(4.5-9k)|, wobei kπ = θk der Quotient der zweiten und dritten Eingabe ist, um zu bestimmen, um welchen speziellen Winkel es sich handelt: Die Winkel 0, 30, 45, 60 und 90 Grad sind mit 0 bis 4 bzw. die Winkel 90 bis 180 nummeriert Gradwinkel gehen umgekehrt; Diese Formel funktioniert für θ∈[0,π]. Die Werte der entsprechenden Sinusse wären sqrt(n)/2und existieren, Tangenten ungleich Null wären 3^(n/2-1). Meine Implementierung verwendet jedoch Listen mit fest codierten komprimierten Zeichenfolgen, um das Ausgabeformat besser steuern zu können, und es scheint, dass der Code auch auf diese Weise kürzer ist.

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

Lassen Sie es uns in einen pythonischen Pseudocode verwandeln:

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

Online testen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.