Напечатайте sin, cos и tan специальных углов


9

В тригонометрии существуют определенные углы, известные как «особые углы». Это потому, что когда вы берете sin, cos или tan одного из этих углов, вы получаете результат, который легко запомнить, потому что это квадратный корень из рационального числа. Эти специальные углы всегда кратны либо pi/6, либо pi/4. Вот визуализация всех специальных углов и их соответствующих значений триггера.

триггерные значения

Как видите, каждому углу соответствует пара чисел. Первое число - косинус этого угла, а второе - синус этого угла. Чтобы найти тангенс одного из этих углов, просто разделите грех на cos. Например, tan(pi/6)равно

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

Соревнование

Вы должны написать полную программу, которая занимает 3 входа.

  1. Один символ, представляющий функцию триггера, которую вы должны вычислить. Это будет «s» (грех), «c» (cos) или «t» (загар).

  2. Числитель угла ввода. Это может быть любое положительное целое число. Обратите внимание, что ввод 5 означает, что числитель 5 * пи.

  3. Знаменатель входного угла. Это всегда будет одним из следующих:1, 2, 3, 4, 6

Затем распечатайте точное значение функции триггера этого угла. Вот список значений sin, cos и tan всех углов до 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

Если вы получаете число больше 2pi, вычитайте из него 2pi, пока не получите число, которое находится в диапазоне. Например, sin(17pi/6)это то же самое, что и sin(5pi/6)== 1/2. Ожидается, что ваша программа будет выполнять базовое упрощение, например, если ваш ввод cos(2pi/4)такой же, как cos(pi/2)== 0. Встроенные тригонометрические функции запрещены.

Кратчайший ответ в байтах побеждает!


Должен ли формат вывода быть точно таким, как указано?
lirtosiast

@ThomasKwa да.
Джеймс


@DigitalTrauma Ха-ха, это будет следующий вызов! Jk ...
Джеймс

Ответы:


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

Давайте превратим его в питонический псевдокод:

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

Тест онлайн .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.