Drukuj grzech, cos i opaleniznę pod specjalnymi kątami


9

W trygonometrii istnieją pewne kąty znane jako „kąty specjalne”. Dzieje się tak dlatego, że biorąc grzech, cos lub opaleniznę pod jednym z tych kątów, otrzymujesz wynik, który jest łatwy do zapamiętania, ponieważ jest pierwiastkiem kwadratowym liczby wymiernej. Te specjalne kąty są zawsze wielokrotnością albo pi/6, albo pi/4. Oto wizualizacja wszystkich specjalnych kątów i odpowiadających im wartości wyzwalających.

wartości trig

Jak widać, dla każdego kąta jest to odpowiednia para liczb. Pierwsza liczba to cosinus tego kąta, a druga to sinus tego kąta. Aby znaleźć styczną jednego z tych kątów, po prostu podziel grzech przez cos. Na przykład tan(pi/6)jest równy

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

Wyzwanie

Musisz napisać pełny program, który przyjmuje 3 wejścia.

  1. Pojedynczy znak reprezentujący funkcję trig, którą należy obliczyć. Będzie to albo „s” (sin), „c” (cos), albo „t” (tan).

  2. Licznik kąta wejściowego. Może to być dowolna dodatnia liczba całkowita. Zauważ, że wejście 5 oznacza, że ​​licznik to 5 * pi.

  3. Mianownik kąta wejściowego. Zawsze będzie to jedna z następujących czynności:1, 2, 3, 4, 6

Następnie wydrukuj dokładną wartość funkcji trig tego kąta. Oto lista grzechu, cos i opalenizny pod każdym kątem do 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

Jeśli otrzymasz liczbę większą niż 2pi, odejmij od niej 2pi, aż uzyskasz liczbę z zakresu. Na przykład sin(17pi/6)jest taki sam jak sin(5pi/6)== 1/2. Oczekuje się, że twój program wykona podstawowe uproszczenia, na przykład, jeśli twoje dane wejściowe są cos(2pi/4)takie same jak cos(pi/2)== 0. Wbudowane funkcje trygonometrii są niedozwolone.

Najkrótsza odpowiedź w bajtach wygrywa!


Czy format wyjściowy musi być dokładnie taki, jak określono?
lirtosiast

@ThomasKwa tak.
James


@DigitalTrauma Haha, będzie to kolejne wyzwanie! Jk ...
James

Odpowiedzi:


2

Pyth, 125 122 bajtów

Wykorzystuje wzór n = 4 - |floor(4.5-9k)|, w którym kπ = θtj. K jest ilorazem drugiego i trzeciego wejścia, aby określić, który kąt specjalny jest kwestionowany: kąty 0, 30, 45, 60 i 90 stopni są ponumerowane odpowiednio od 0 do 4, a 90 ~ 180 kąty stopni idą do tyłu; ta formuła działa dla θ∈[0,π]. Wartości odpowiednich sinusów byłyby sqrt(n)/2i istniałyby, niezerowe styczne byłyby 3^(n/2-1). Jednak moja implementacja korzysta z list ze skompresowanymi ciągami skompresowanymi w celu lepszej kontroli formatu wyjściowego i wydaje się, że kod również jest krótszy.

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

Przekształćmy go w pseudokod pythonowy:

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

Przetestuj online .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.