Un seno de grandeza


24

Introducción

Todo el mundo ha oído hablar de seno (sin) , coseno (cos) , tangente (tan) , cotangente (cot) , secante (seg) y cosecante (csc) . Casi todos los ángulos los tienen.

Mucho menos conocidos, o recordados, son el exsecante (exsec) , el excosecante (excsc) , la versina (versin) y la cubriente (cvs) . Casi todos los ángulos tienen esos también. Hay algunos que son aún menos conocidos, pero nos limitaremos a esto.

He creado una visualización de estos para el ángulo θ, que es de 45 °.


El reto

Cree un programa que tome una entrada de un ángulo n, en grados, y genere:

  1. el seno del ángulo n

  2. el coseno del ángulo n

  3. la tangente de angulo n

  4. la secante de ángulo n

  5. al menos uno de los siguientes. Cada artículo adicional de esta lista obtendrá un bono de -5%, por un máximo de -25%.

    • exsecante de ángulo n

    • cosecante de ángulo n

    • excosecante de ángulo n

    • versina de ángulo n

    • cubreobjetos de ángulo n

    • cotangente de ángulo n

Si su puntaje es un decimal después de aplicar un bono, redondee al número entero más cercano.


Entrada

Puede aceptar su entrada a través de STDIN o mediante una llamada de función. Se npasará un único argumento,

n siempre será un entero entero mayor que 0, pero menor o igual que 90.


Salida

Aquí hay un ejemplo de la salida para seno de 45 °. Todos los elementos de salida deben estar en este formato. El orden de los artículos no importa.

sine: 0.70710678118

Todos los elementos deben tener exactamente 4 números después del decimal (precisión a las diezmilésimas). A continuación se presentan algunos ejemplos de redondeo.

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

Cualquier resultado inexistente / indefinido debería ser 0 por defecto.


Ejemplo

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

Marcador

Para que su puntaje aparezca en el tablero, debe estar en este formato:

# Language, Score

O si ganaste un bono:

# Language, Score (Bytes - Bonus%)

Los tachados no deberían causar un problema.


¿Importa el orden de salida?
Jakube

12
Pedantry adelante: "Cada ángulo los tiene" - no es cierto; los múltiplos impares de 90 grados no tienen una tangente, por ejemplo. (Me parece extremadamente extraño que requiera valores inexistentes para obtener una salida de cero. ¿Realmente usaría un programa que deliberadamente dio respuestas tan engañosas?) Además, me interesaría saber por qué considera la cosecante y cotangente como siendo más oscuro que la secante; en mis clases de matemáticas de nivel A aprendimos sobre esos tres al mismo tiempo.
Hammerite

¿La capitalización se fija en minúsculas? Me gustaría la salida 'Sine, Cosine ...'
edc65

Difícil de entender Programa completo vs entrada a través de una llamada de función
edc65

1
¿Es realmente la entrada del ángulo greater than 0, entonces 0 no está permitido?
edc65

Respuestas:


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}

El código tiene 84 bytes de longitud y califica para una bonificación del 5% ( cotangente y cosecante ).

Pruébelo en línea en el intérprete de CJam .

Cómo 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

Sin golf:

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

¿Soy yo o tu versión "desplegada" tiene un bucle adicional?
David Arenburg

Estaría mejor sin exsecantes y cotangentes.
lirtosiast

@DavidArenburg La versión más larga tiene el mismo número de bucles, solo está escrita de manera diferente a la versión corta.
Alex A.

@ThomasKwa Lo sé, pero no voy a ganar de todos modos. : P
Alex A.

5

Pyth, 66-10% = 59.4 bytes

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

Calcula el seno, la secante y la tangente. Luego, las funciones compartidas se calculan simplemente mediante la fórmula coF(x) = F(90 - x).


¿Esto da 0 para indefinido?
lirtosiast

@ThomasKwa No lo creo.
orlp

1
Entonces es actualmente inválido.
lirtosiast

5

Mathematica (no válido en este momento), 134 121 104

Solo por diversión, seguramente se puede jugar mucho golf

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

Y debe tener una bonificación del 5% (Cot y Csc), por lo tanto, con un valor de 99 caracteres.

Salida de ejemplo:

Salida de ejemplo


¿No obtendrías una mejor puntuación agregando más funciones?
orgulloso Haskeller

@proud haskeller, puedo intentarlo, pero probablemente perderé más que ganar personajes
WizardOfMenlo

44
¿Escribe esto los nombres de las funciones en su totalidad, o usa 0para sec(90)?
lirtosiast

@Thomas Kwa no debería, lo probaré cuando tenga la oportunidad
WizardOfMenlo

Realmente dudo que esto muestre nombres de funciones reales
David Arenburg

4

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

Editar revisado después de la aclaración, ahora la bonificación es del 5%

Editar se dio cuenta de que el ángulo no puede 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% de)

(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`
`

Sin golf:

(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
`

¿Podría agregar una coma después de "Javascript ES6" en su título para que su puntaje se analice correctamente?
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))),"")

Ejemplo 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

3

Perl, 182 177 (236 - 25%)

Ejecutar con -n(1 byte agregado a la puntuación no corregida).

$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 sofisticado. Aprovecha la -nentrada implícita,$_ como argumento predeterminado para siny cos, y las palabras simples para cadenas. La regla "undefined = 0" está codificada al usar el operador ternario ?:(se aplica solo para 90 °).

Una cosa que learend es que, al parecer, no se puede tener (o no se puede llamar ) una subrutina llamada s(o m, y, tr): sub s {print 1}; srendimientos Substitution pattern not terminated at -e line 1.


Por alguna razón, su puntaje se analiza aún más raro.
Leif Willerts

¿Podría agregar una coma después de "Perl" para que su puntaje se analice correctamente?
Zach Gates

3

Python 3, 282 (375 - 25%)

El manejo de errores resultó ser algo complicado por errores de punto flotante; a saber,cos(90) salió a un número muy pequeño en lugar de cero.

Nunca será la respuesta principal, pero me gusta pensar que podría ser la respuesta válida más corta para todas las funciones en un lenguaje que no sea de golf que no tenga las funciones trigonométricas en el espacio de nombres predeterminado . ;-)

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

Salida de muestra:

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

no '.4f'%(r)seria mas corto?
xebtl

@xebtl: Gracias. Tiendo a olvidar que todavía existe el formato%.
Tim Pederick

3

Perl, 165 (193 - 15%)

Presento esto como una nueva respuesta porque la idea es bastante diferente de la otra . Avíseme si es más apropiado reemplazar mi primer intento.

$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

Ejecutar con -n(1 byte agregado).

Sin golf:

# π/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 cumple las cuatro funciones "co", creo que califica para un bono de 3 * 5% = 15%.


3

Perl, 100 95 94 bytes

Whoa, responde Lotta Perl.

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

Sí, y lo estás haciendo bastante bien con este enfoque directo :-). Puede eliminar algunos bytes usando -n(cuenta para 1 byte) en lugar de $_=<>. Sin embargo, debe convertir de grados a radianes, y no maneja el caso de 90 ° según lo prescrito. (Con esto último, parece que no estás solo entre las respuestas aquí.)
xebtl

Además, recuerde que el antepasado de Code Golf fue Perl Golf :-)
xebtl

Estoy un poco confundido aquí ... esto usa radianes. ¿Se suponía que debía usar grados?
un 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

No ex-cositas para mantener mi ingenioso esquema de nombres y ya que no sabía cómo acortar (\x->x-1). (-1)Es solo un número.

Por favor, quejarse si quiere que embellezca ( mapM_ putStrLn) las líneas.


¡Gracias! Lo mismo para Alex A. y @orlp. Este último quizás debería redondear el puntaje neto.
Leif Willerts
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.