Um seno de grandeza


24

Introdução

Todo mundo já ouviu falar em seno (pecado) , cosseno (cos) , tangente (bronzeado) , cotangente (berço) , secante (s) e cossecante (csc) . Quase todos os ângulos os têm.

Muito menos conhecidos ou lembrados são o exsecante (exsec) , o excosecante (excsc) , a versina (versin) e a coversina (cvs) . Quase todos os ângulos têm esses também. Existem alguns que são ainda menos conhecidos, mas vamos nos ater a isso.

Eu criei uma visualização para o ângulo θ, que é 45 °.


O desafio

Crie um programa que inclua uma entrada de ângulo n, em graus, e produza:

  1. o seno de ângulo n

  2. o cosseno do ângulo n

  3. a tangente do ângulo n

  4. a secante de ângulo n

  5. pelo menos um dos seguintes. Cada item adicional desta lista ganhará um bônus de -5%, para um máximo de -25%.

    • exsecante de ângulo n

    • co-ângulo de ângulo n

    • excosecante de ângulo n

    • versina de ângulo n

    • cobertura de ângulo n

    • cotangente de ângulo n

Se sua pontuação for decimal após a aplicação de um bônus, arredondar para o número inteiro mais próximo.


Entrada

Você pode aceitar sua entrada através do STDIN ou através de uma chamada de função. Um único argumento,, nserá passado.

n sempre será um número inteiro inteiro maior que 0, mas menor ou igual a 90.


Saída

Aqui está um exemplo da saída para seno de 45 °. Todos os itens de saída devem estar neste formato. A ordem dos itens não importa.

sine: 0.70710678118

Todos os itens devem ter exatamente 4 números após o decimal (precisão de dez milésimos). Abaixo estão alguns exemplos de arredondamentos.

0 -> 0.0000
1 -> 1.0000
0.2588190451 -> 0.2588
5.67128181962 -> 5.6713
10 -> 10.0000
12.4661204396 -> 12.4661

Quaisquer resultados inexistentes / indefinidos devem ter como padrão 0.


Exemplo

myprogram(60)

sine: 0.8660
cosine: 0.5000
tangent: 1.7321
secant: 2.0000
exsecant: 1.0000
cosecant: 1.1547
excosecant: 0.1547
versine: 0.5000
coversine: 0.1340
cotangent: 0.5774

Placar

Para que sua pontuação apareça no quadro, ela deve estar neste formato:

# Language, Score

Ou se você ganhou um bônus:

# Language, Score (Bytes - Bonus%)

Tacadas não devem causar problemas.


A ordem da saída é importante?
Jakube 19/09/2015

12
Pedantismo à frente: "Todo ângulo os tem" - não é verdade; múltiplos ímpares de 90 graus não têm tangente, por exemplo. (Parece-me extremamente bizarro que você exija valores inexistentes para fornecer uma saída de zero. Você realmente usaria um programa que deliberadamente forneceu respostas tão enganosas?) Além disso, eu estaria interessado em saber por que você considera o co-agente e cotangente sendo mais obscuro que o secante; nas minhas aulas de matemática no nível A, aprendemos sobre esses três ao mesmo tempo.
Hammerite

A capitalização é corrigida em minúsculas? Gostaria saída 'Sine, Cosine ...'
edc65 19/09/2015

Difícil de entender programa completa vs entrada através de uma chamada de função
edc65

11
A entrada de ângulo é realmente greater than 0, portanto, 0 não é permitido?
edc65

Respostas:


8

CJam, 94 89 85 81 80 bytes

"sine tangent secant"S/{"co"1$+}%rd90/_i33Yb@[P*2/__ms\mc@mt]_Wf#W%+?.{d": %.4f"e%N}

O código tem 84 bytes de comprimento e se qualifica para um bônus de 5% ( cotangente e cossecante ).

Experimente online no intérprete CJam .

Como funciona

"sine tangent secant" e# Push that string.
S/                    e# Split it at spaces.
{"co"1$+}%            e# For each chunk, append a copy to the string "co", pushing
                      e# ["sine" "cosine" "tangent" "cotangent" "secant" "cosecant"].
rd90/                 e# Read a Double from STDIN and divide it by 90.
_i                    e# Push a copy and cast it to integer.
33Yb                  e# Push 33 in base 2, i.e., [1 0 0 0 0 1].
@                     e# Rotate the Double on top of the stack.
[                     e#
  P*2/                e# Multiply by Pi and divide by 2.
  __                  e# Push two copies of the result.
  ms                  e# Compute the sine of the topmost copy.
  \mc                 e# Swap and compute the cosine of the next copy.
  @mt                 e# Rotate and compute the tangent of the original.
 ]                    e#
 _Wf#                 e# Copy the array and raise all Doubles to the power -1.
                      e# This computes cosecant, secant and cotangent.
 W%                   e# Reverse their order.
 +                    e# Append to the original array.
 ?                    e# Select 33Yb if the integer part of the input divided by 90 is
                      e# (i.e., if the input is 90), the constructed array otherwise.
 .{                   e# For each function name and result:
   d                  e# Cast to Double (needed for 33Yb).
   ": %.4f"           e# Push a format string containing ": " and a 4-decimal float.
   e%                 e# Apply the formatting to the Double on the stack.
   N                  e# Push a linefeed.
 }                    e#

6

Julia, 162 - 10% = 144 bytes

n->for z=zip(split("sine cosine tangent secant exsecant cosecant cotangent"),[sind,cosd,tand,secd,i->secd(i)-1,cscd,cotd]) @printf("%s: %.4f\n",z[1],z[2](n))end

Ungolfed:

function f(n)
    # Construct a vector of names
    s = split("sine cosine tangent secant exsecant cosecant cotangent")

    # Construct a vector of functions
    o = [sind, cosd, tand, secd, i -> secd(i) - 1, cscd, cotd]

    # Print each in a loop
    for z = zip(s, o)
        @printf("%s: %.4f\n", z[1], z[2](n))
    end
end

Sou eu ou sua versão "Desdobrado" tem um loop adicional?
David Arenburg

Você seria melhor sem exsecant e cotangent.
lirtosiast

@DavidArenburg A versão mais longa tem o mesmo número de loops, mas foi escrita de forma diferente da versão curta.
Alex A.

@ThomasKwa eu sei, mas não vou ganhar de qualquer maneira. : P
Alex A.

5

Pitão, 66 - 10% = 59,4 bytes

j+V+Jc"sine secant tangent")+L"co"Jsmm%": %.4f"^.t.td7k^_1k3,Q-90Q

Calcula o seno, secante e tangente. Então, as co-funções são simplesmente calculadas através da fórmula coF(x) = F(90 - x).


Isso dá 0 para indefinido?
precisa saber é o seguinte

@ThomasKwa Não pense assim.
orlp

11
Então é atualmente inválido.
lirtosiast 20/09/2015

5

Mathematica (inválido no momento), 134 121 104

Apenas por diversão, certamente pode ser jogado muito

f[n_]:=(a={Sin,Cos,Tan,Sec,Cot,Csc};TableForm[N[#@n,4]&/@a,TableHeadings->{ToString[#]<>":"&/@a,None}])

E deve ter um bônus de 5% (Cot e Csc), totalizando 99 caracteres

Exemplo de saída:

Saída de exemplo


Você não obteria uma pontuação melhor adicionando mais funções?
haskeller orgulhoso

haskeller @proud, posso tentar, mas provavelmente vou perder mais do que personagens de ganho
WizardOfMenlo

4
Isso escreve os nomes das funções na íntegra ou usa-os 0para sec(90)?
lirtosiast 19/09/15

@Thomas Kwa não deveria, vou testá-lo quando tiver uma chance
WizardOfMenlo

Eu realmente duvido que isso mostra nomes de funções reais
David Arenburg

4

JavaScript (ES6), 173 (182 - 5%)

Edição revisada após esclarecimentos, agora o bônus é de 5%

Edit percebeu que o ângulo não pode ser 0

// TEST - redefine alert
alert=x=>O.innerHTML=x

r=(a=prompt(i=0))*(M=Math).PI/180,V=_=>[s=M.sin(r),c=M.cos(r),(f=a-90)&&s/c,c/s,f&&1/c,1/s][i++].toFixed(4);
alert(`sine
tangent
secant`.replace(/.+/g,h=>h+`: ${V()}
co${h}: ${V()}`))

/* More bonus, but too longer 
r=(a=prompt(i=0))*(M=Math).PI/180,V=_=>[s=M.sin(r),c=M.cos(r),1-c,1-s,(f=a-90)&&s/c,c/s,f&&1/c,1/s][i++].toFixed(4);
alert(`sine
versine
tangent
secant`.replace(/.+/g,h=>h+`: ${V()}
co${h}: ${V()}`))
*/
<pre id=O></pre>


4

Javascript ES6, 154 148 (198 - 25%)

(n=0)=>[S='sine',(O='co')+S,T='tangent',C='secant',X=O+C,O+T,V='ver'+S,O+V,'ex'+C,'ex'+X].map((q,i)=>q+': '+[s=Math.sin(n),c=Math.cos(n),t=s/c,e=1/c,o=1/s,1/t,1-c,1-s,e-1,o-1][i].toFixed(4)).join`
`

Ungolfed:

(n=0)=>          // function declaration, accepts number, defaults to 0
  [              // create array of trig function names
    S='sine',    // sine
    (O='co')+S,  // cosine
    T='tangent', // tangent
    C='secant',  // secant
    X=O+C,       // cosecant
    O+T,         // cotangent
    V='ver'+S,   // versine
    O+V,         // coversine
    'ex'+C,      // exsecant
    'ex'+X       // excosecant
  ].map((q,i)=>  // map over names
                 // append ": <value rounded to 4 decimals>" to function name:
    q+': '+[s=Math.sin(n),c=Math.cos(n),t=s/c,e=1/c,o=1/s,1/t,1-c,1-s,e-1,o-1][i].toFixed(4)
  ).join`        // add newline between each function
`

Você poderia adicionar uma vírgula após "Javascript ES6" no seu título para que sua pontuação seja analisada corretamente?
Zach Gates

3

R, 122 136 134 bytes

n=scan()*pi/180;write(paste0(c("sine","cosine","tangent","secant","versine"),sprintf(": %.4f",c(sin(n),r<-cos(n),tan(n),1/r,1-r))),"")

Exemplo de uso

> n=scan()*pi/180;write(paste0(c("sine","cosine","tangent","secant","versine"),sprintf(": %.4f",c(sin(n),r<-cos(n),tan(n),1/r,1-r))),"")
1: 60
2: 
Read 1 item
sine: 0.8660
cosine: 0.5000
tangent: 1.7321
secant: 2.0000
versine: 0.5000

2
scan()/(180/pi)-> scan()*pi/180?
lirtosiast 20/09/2015

3

Perl, 182177 (236 - 25%)

Execute com -n(1 byte adicionado à pontuação não corrigida).

$b=$_==90;$_/=57.296;$c=cos;$s=sin;sub f{printf"%s: %.4f\n",@_}$T=tangent;f$T,$b?0:$s/$c;f co.$T,$c/$s;$S=sine;f $S,$s;f co.$S,$c;$C=secant;f$C,$b?0:1/$c;f co.$C,1/$s;f ex.$C,$b?0:1-1/$c;f exco.$C,1/$s-1;$V=ver.$S;f$V,1-$c;f co.$V,1-$s

Nada chique. Ele tira proveito da -nentrada implícita, $_como um argumento padrão para sine cos, e palavras de barra para seqüências de caracteres. A regra “undefined = 0” é codificada no uso do operador ternário ?:(aplica-se apenas a 90 °).

Uma coisa que eu learend é que, aparentemente, não se pode ter (ou não pode chamar ) uma sub-rotina com o nome s(ou m, y, tr): sub s {print 1}; srendimentos Substitution pattern not terminated at -e line 1.


Por alguma razão, sua pontuação é analisada ainda mais estranha.
Leif Willerts

Você pode adicionar uma vírgula após "Perl" para que sua pontuação seja analisada corretamente?
Zach Gates

3

Python 3, 282 (375 - 25%)

O tratamento de erros acabou sendo um pouco complicado por erros de ponto flutuante; ou seja, cos(90)saiu para um número muito pequeno em vez de zero.

Essa nunca será a resposta principal, mas eu acho que pode ser a resposta mais curta para todas as funções válidas em um idioma que não seja golfe e que não possua as funções trigonométricas no espaço de nomes padrão . ;-)

import math as m
def p(q,r):print(q+':','%.4f'%r)
def a(n):
 n=n*m.pi/180
 C,S=round(m.cos(n),8),m.sin(n)
 A=S,1,0,C,1,S,C,0,C,S,1,C,0,1,S,1,C,-1,1,S,C,1,1,S,1
 def t():
  nonlocal A;u,v,w,x,y,*A=A;z=-1 if w>0 else 1
  try:return z*u/v+w,z*x/y+w
  except:return 0,0
 def q(y,x=''):J,K=t();p(x+y,J);p(x+'co'+y,K)
 q('sine');q('tangent');s='secant';q(s);q(s,'ex');q('versine')

Saída de amostra:

>>> a(60)
sine: 0.8660
cosine: 0.5000
tangent: 1.7321
cotangent: 0.5774
secant: 2.0000
cosecant: 1.1547
exsecant: 1.0000
excosecant: 0.1547
versine: 0.5000
coversine: 0.1340

não '.4f'%(r)seria mais curto?
Xebtl

@ xebtl: Obrigado. Costumo esquecer que a formatação% ainda existe!
precisa saber é o seguinte

3

Perl, 165 (193 - 15%)

Estou enviando esta como uma nova resposta, porque a idéia é bem diferente da outra . Informe-me se é mais apropriado substituir minha primeira tentativa.

$p=atan2 1,0;$b=$_-90;%h=qw(sine $s tangent $b?$s/$c:0 secant $b?1/$c:0 versine 1-$c);$_/=90/$p;sub e{$c=cos;$s=sin}e;sub f{eval"printf'$x$_: %.4f
',$h{$_}"for keys%h}f;$b=1;$_=$p-$_;e;$x=co;f

Execute com -n(1 byte adicionado).

Ungolfed:

# π/2
$p=atan2 1,0;

# trouble?
$b=$_-90;

# Construct a hash whose keys are the “base” function names,
# and whose values are the corresponding expressions in terms of sin and cos
%h=qw(sine $s tangent $b?$s/$c:0 secant $b?1/$c:0 versine 1-$c);

# Thanks to ‘-n’, input is in $_; convert to radians
$_/=90/$p;

# Compute sin and cos in a reusable way
sub e{$c=cos;$s=sin}
e;

sub f {
   eval "printf '$x$_: %.4f
', $h{$_}" 
      for keys %h
}

f;

# Now the “co” functions
# No trouble here
$b=1;

# x ← π/2 - x
$_=$p-$_;

e;
$x=co;
f

Como ele executa as quatro funções "co", acho que se qualifica para um bônus de 3 * 5% = 15%.


3

Perl, 100 95 94 bytes

Whoa, lotta perl responde.

$_=<>;printf"sine: %.4f\ncosine: %.4f\ntangent: %.4f\nsecant: %.4f\n",sin,cos,(sin)/cos,1/cos

Sim, e você está indo muito bem com essa abordagem direta :-). Você pode cortar alguns bytes usando -n(conta para 1 byte) em vez de $_=<>. No entanto, você precisa converter de graus em radianos e não lida com o caso de 90 ° conforme prescrito. (Com este último, parece que você está quase sozinho entre as respostas aqui.)
xebtl

Além disso, lembre-se que o ancestral do Código Golf foi Perl Golf :-)
xebtl

Estou um pouco confuso aqui ... isso usa radianos. Eu deveria usar diplomas?
a spaghetto

2

Haskell, 159 = 186 - 15% bytes

s x=zipWith(\a b->a++": "++show b)(concatMap(\n->[n,"co"++n])$words"sine tangent versine secant")$map($(x*pi/180))[sin,cos,t,(1/).t,(1-).cos,(1-).sin,e.t,e.(1/).t]
e=sqrt.(+1).(^2)
t=tan

Não há coisas para manter meu esquema de nomes inteligente e como eu não sabia encurtar (\x->x-1). (-1)é apenas um número.

Por favor, reclame se você quer que eu prettify ( mapM_ putStrLn) as linhas.


Obrigado! Mesmo para Alex A. e @orlp. O último talvez deva arredondar a pontuação líquida.
Leif Willerts
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.