Stampa peccato, cos e abbronzatura di angoli speciali


9

Nella trigonometria, ci sono alcuni angoli noti come "angoli speciali". Questo perché quando prendi il peccato, il cos o l'abbronzatura di uno di questi angoli, ottieni un risultato che è facile da ricordare perché è una radice quadrata di un numero razionale. Questi angoli speciali sono sempre multipli di entrambi pi/6o pi/4. Ecco una visualizzazione di tutti gli angoli speciali e dei corrispondenti valori di trigge.

valori di trigger

Come puoi vedere, per ogni angolo c'è una corrispondente coppia di numeri. Il primo numero è il coseno di quell'angolo e il secondo è il seno di quell'angolo. Per trovare la tangente di uno di questi angoli, basta dividere il peccato per cos. Ad esempio, tan(pi/6)è uguale a

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

La sfida

È necessario scrivere un programma completo che richiede 3 input.

  1. Un singolo carattere che rappresenta la funzione trig che devi calcolare. Questo sarà 's' (sin), 'c' (cos) o 't' (abbronzatura).

  2. Il numeratore dell'angolo di input. Questo può essere qualsiasi numero intero positivo. Si noti che un input di 5 significa che il numeratore è 5 * pi.

  3. Il denominatore dell'angolo di input. Questo sarà sempre uno dei seguenti:1, 2, 3, 4, 6

Quindi stampare il valore esatto della funzione di attivazione di quell'angolo. Ecco un elenco di sin, cos e tan di tutti gli angoli fino a 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

Se ottieni un numero superiore a 2pi, sottrai 2pi da esso fino a ottenere un numero compreso nell'intervallo. Ad esempio, sin(17pi/6)è uguale a sin(5pi/6)== 1/2. Si prevede che il programma eseguirà una semplificazione di base, ad esempio se l'input cos(2pi/4)è lo stesso di cos(pi/2)== 0. Le funzioni di trigonometria incorporate non sono consentite.

Vince la risposta più breve in byte!


Il formato di output deve essere esattamente come specificato?
lirtosiast,

@ThomasKwa sì.
James,


@DigitalTrauma Haha, quella sarà la prossima sfida! Jk ...
James,

Risposte:


2

Pyth, 125 122 byte

Utilizza la formula n = 4 - |floor(4.5-9k)|, dove kπ = θie k è il quoziente del secondo e del terzo input, per determinare quale angolo speciale è in questione: gli angoli 0, 30, 45, 60 e 90 gradi sono numerati rispettivamente da 0 a 4 e i 90 ~ 180 gli angoli di gradi vanno al contrario; questa formula funziona per θ∈[0,π]. I valori dei corrispondenti seni sarebbero sqrt(n)/2e esistere , tangenti diversi da zero 3^(n/2-1). Tuttavia, la mia implementazione utilizza elenchi con stringhe compresse hardcoded per un maggiore controllo del formato di output e sembra che anche il codice sia più corto in questo modo.

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

Trasformiamolo in pseudocodice pitonico:

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

Test online .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.