Un sinistre de grandeur


24

introduction

Tout le monde a entendu parler du sinus (péché) , du cosinus (cos) , de la tangente (bronzage) , de la cotangente (cot) , de la sécante (sec) et de la cosécante (csc) . Presque tous les angles en ont.

Beaucoup moins connus ou oubliés sont l' exsécant (exsec) , l' excosécant (excsc) , la versine (versin) et la coverine (cvs) . Presque tous les angles en ont aussi. Il y en a qui sont encore moins connus, mais nous nous en tiendrons simplement à ceux-ci.

J'ai créé une visualisation de ceux-ci pour l'angle θ, qui est de 45 °.


Le défi

Créez un programme qui prend une entrée d'un angle n, en degrés, et produira:

  1. le sinus d'angle n

  2. le cosinus de l'angle n

  3. la tangente de l'angle n

  4. la sécante de l'angle n

  5. au moins un des éléments suivants. Chaque élément supplémentaire de cette liste gagnera un bonus de -5%, pour un maximum de -25%.

    • exsécant d'angle n

    • cosecant d'angle n

    • excosécant d'angle n

    • versine d'angle n

    • couvre-angle n

    • cotangente d'angle n

Si votre score est décimal après avoir appliqué un bonus, arrondissez au nombre entier le plus proche.


Contribution

Vous pouvez accepter votre entrée via STDIN ou via un appel de fonction. Un seul argument,, nsera transmis.

n sera toujours un entier entier supérieur à 0, mais inférieur ou égal à 90.


Sortie

Voici un exemple de sortie pour sinus de 45 °. Tous les éléments de sortie doivent être dans ce format. L'ordre des articles n'a pas d'importance.

sine: 0.70710678118

Tous les éléments doivent avoir exactement 4 chiffres après la décimale (précision aux dix millièmes). Voici quelques exemples d'arrondis.

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

Tous les résultats inexistants / non définis doivent être définis par défaut sur 0.


Exemple

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

Tableau d'affichage

Pour que votre score apparaisse sur le tableau, il doit être dans ce format:

# Language, Score

Ou si vous avez gagné un bonus:

# Language, Score (Bytes - Bonus%)

Les barrés ne devraient pas poser de problème.


L'ordre de sortie est-il important?
Jakube

12
Pedantry en avant: "Chaque angle les a" - pas vrai; les multiples impairs de 90 degrés n'ont pas de tangente, par exemple. (Il me semble extrêmement bizarre que vous ayez besoin de valeurs inexistantes pour donner une sortie de zéro. Utilisez-vous vraiment un programme qui a délibérément donné des réponses aussi trompeuses?) De plus, je serais intéressé de savoir pourquoi vous considérez la cosécante et la cotangente comme être plus obscur que le sécant; dans mes cours de mathématiques de niveau A, nous avons appris ces trois en même temps.
Hammerite

La capitalisation est-elle fixe en minuscules? J'aimerais la sortie 'Sine, Cosine ...'
edc65

Difficile à comprendre Programme complet vs entrée via un appel de fonction
edc65

1
L'angle est-il vraiment entré greater than 0, donc 0 n'est pas autorisé?
edc65

Réponses:


8

CJam, 94 89 85 81 80 octets

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

Le code fait 84 octets de long et donne droit à un bonus de 5% ( cotangente et cosécante ).

Essayez-le en ligne dans l' interpréteur CJam .

Comment ça marche

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

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

Non 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

Est-ce moi ou votre version "Dépliée" a une boucle supplémentaire?
David Arenburg

Vous seriez mieux sans exsécante et cotangente.
lirtosiast

@DavidArenburg La version longue a le même nombre de boucles, elle est simplement écrite différemment de la version courte.
Alex A.

@ThomasKwa Je sais, mais je ne vais pas gagner de toute façon. : P
Alex A.

5

Pyth, 66 - 10% = 59,4 octets

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

Calcule le sinus, la sécante et la tangente. Ensuite, les co-fonctions sont simplement calculées via la formule coF(x) = F(90 - x).


Est-ce que cela donne 0 pour indéfini?
lirtosiast

@ThomasKwa Ne pense pas.
orlp

1
Ensuite, il est actuellement invalide.
lirtosiast

5

Mathematica (non valide pour le moment), 134 121 104

Juste pour le plaisir, il peut sûrement être joué beaucoup

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

Et il devrait avoir un bonus de 5% (Cot et Csc), soit un total de 99 caractères

Exemple de sortie:

Example Output


N'obtiendriez-vous pas un meilleur score en ajoutant plus de fonctions?
fier haskeller

@proud haskeller, je peux essayer, mais je vais probablement perdre plus que gagner des personnages
WizardOfMenlo

4
Est-ce que cela écrit les noms des fonctions dans leur intégralité ou les utilise 0pour sec(90)?
lirtosiast du

@Thomas Kwa ça ne devrait pas, je le
testerai

Je doute vraiment que cette fonction affiche les noms réels des fonctions
David Arenburg

4

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

Modifier révisé après clarification, maintenant le bonus est de 5%

Edit a réalisé que l'angle ne peut pas être 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`
`

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

Pourriez-vous ajouter une virgule après "Javascript ES6" dans votre titre afin que votre score soit correctement analysé?
Zach Gates

3

R, 122 136 134 octets

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))),"")

Exemple d'utilisation

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

Exécuter avec -n(1 octet ajouté au score non corrigé).

$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

Rien d'extraordinaire. Il tire parti de l' -nentrée implicite, $_comme argument par défaut de sinet cos, et de mots nus pour les chaînes. La règle «undefined = 0» est codée en dur en utilisant l'opérateur ternaire ?:(elle ne s'applique que pour 90 °).

Une chose I learend est que , apparemment, vous ne pouvez pas (ou ne peut pas appeler ) un sous - programme nommé s(ou m, y, tr): sub s {print 1}; srendements Substitution pattern not terminated at -e line 1.


Pour une raison quelconque, votre score est analysé encore plus bizarrement.
Leif Willerts

Pourriez-vous ajouter une virgule après "Perl" pour que votre score soit analysé correctement?
Zach Gates

3

Python 3, 282 (375 - 25%)

La gestion des erreurs s'est avérée quelque peu compliquée par des erreurs à virgule flottante; à savoir, cos(90)est sorti à un très petit nombre au lieu de zéro.

Cela ne sera jamais la meilleure réponse, mais j'aime à penser que ce pourrait être la réponse toutes fonctions valide la plus courte dans un langage non golfique qui n'a pas les fonctions trig dans l'espace de noms par défaut . ;-)

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

Exemple de sortie:

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

ne serait pas '.4f'%(r)plus court?
xebtl

@xebtl: Merci. J'ai tendance à oublier que le formatage% existe toujours!
Tim Pederick

3

Perl, 165 (193 - 15%)

Je soumets cette réponse comme une nouvelle parce que l'idée est très différente de l' autre . Veuillez me faire savoir s'il est plus approprié de remplacer ma première tentative.

$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

Exécutez avec -n(1 octet ajouté).

Non 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

Puisqu'il remplit les quatre fonctions «co», je pense qu'il est admissible à un bonus de 3 * 5% = 15%.


3

Perl, 100 95 94 octets

Whoa, lotta perl répond.

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

Oui, et vous vous débrouillez assez bien avec cette approche simple :-). Vous pouvez raser certains octets en utilisant -n(compte pour 1 octet) au lieu de $_=<>. Cependant, vous devez convertir des degrés en radians et vous ne gérez pas le cas à 90 ° comme prescrit. (Avec ce dernier, il semble que vous n'êtes guère seul parmi les réponses ici.)
xebtl

Rappelez-vous également que l'ancêtre de Code Golf était Perl Golf :-)
xebtl

Je suis un peu confus ici ... cela utilise des radians. Devais-je utiliser des diplômes?
un spaghetto du

2

Haskell, 159 = 186 - 15% octets

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

Aucun ex-trucs pour garder mon schéma de nommage intelligent et puisque je ne savais pas comment raccourcir (\x->x-1). (-1)est juste un nombre.

Veuillez vous plaindre si vous voulez que je raffine ( mapM_ putStrLn) les lignes.


Merci! Même chose pour Alex A. et @orlp. Ce dernier devrait peut-être arrondir le score net.
Leif Willerts
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.