Ein Sinus der Größe

24

Einführung

Jeder kennt Sinus (Sünde) , Cosinus (Cosinus) , Tangens (Tan) , Cotangens (Cot) , Sekant (Sec) und Cosekant (Csc) . Fast jeder Winkel hat sie.

Weit weniger bekannt oder in Erinnerung geblieben sind die exsecant (exsec) , excosecant (excsc) , versine (versin) und coversine (cvs) . Fast jeder Winkel hat auch diese. Es gibt einige, die noch weniger bekannt sind, aber wir werden uns nur an diese halten.

Ich habe eine Visualisierung für diesen Winkel θ erstellt, der 45 ° beträgt.


Die Herausforderung

Erstellen Sie ein Programm, das die Eingabe eines Winkels nin Grad akzeptiert und Folgendes ausgibt:

  1. der Sinus des Winkels n

  2. der Kosinus des Winkels n

  3. der Tangens des Winkels n

  4. die Sekante des Winkels n

  5. mindestens eines der folgenden. Für jeden weiteren Gegenstand aus dieser Liste erhalten Sie einen Bonus von -5% und maximal -25%.

    • außerhalb des Winkels n

    • Cosecant des Winkels n

    • Excosekans des Winkels n

    • Winkelversine n

    • Coversine des Winkels n

    • Kotangens des Winkels n

Wenn Ihre Punktzahl nach dem Einlösen eines Bonus eine Dezimalstelle ist, runden Sie auf die nächste ganze Zahl auf.


Eingang

Sie können Ihre Eingabe über STDIN oder über einen Funktionsaufruf annehmen. Ein einzelnes Argument nwird übergeben.

n wird immer eine ganze Zahl sein, die größer als 0, aber kleiner oder gleich 90 ist.


Ausgabe

Hier ist ein Beispiel für die Ausgabe eines Sinus von 45 °. Alle Ausgabeelemente müssen in diesem Format vorliegen. Die Reihenfolge der Artikel spielt keine Rolle.

sine: 0.70710678118

Alle Artikel müssen genau 4 Nachkommastellen haben (Zehntausendstelgenauigkeit). Nachfolgend einige Beispiele zur Rundung.

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

Nicht vorhandene / undefinierte Ergebnisse sollten standardmäßig auf 0 gesetzt werden.


Beispiel

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

Anzeigetafel

Damit Ihre Partitur auf der Tafel erscheint, sollte sie in folgendem Format vorliegen:

# Language, Score

Oder wenn Sie einen Bonus verdient haben:

# Language, Score (Bytes - Bonus%)

Durchgestrichene Symbole sollten kein Problem verursachen.

Zach Gates
quelle
Ist die Reihenfolge der Ausgabe wichtig?
Jakube,
12
Pedanterie voraus: "Jeder Winkel hat sie" - nicht wahr; Beispielsweise haben ungerade Vielfache von 90 Grad keine Tangente. (Es erscheint mir äußerst bizarr, dass Sie nicht vorhandene Werte benötigen, um eine Ausgabe von Null zu erhalten. Würden Sie wirklich ein Programm verwenden, das absichtlich solche irreführenden Antworten gibt?) Außerdem würde mich interessieren, warum Sie den Kosekanten und den Kotangens als betrachten dunkler sein als der Sekant; In meinen Mathematikkursen auf A-Level lernten wir diese drei gleichzeitig kennen.
Hammerite
Ist die Großschreibung in Kleinbuchstaben festgelegt? Ich möchte Ausgabe 'Sinus, Cosinus ...'
edc65
Schwer zu verstehen Vollständiges Programm vs Eingabe über einen Funktionsaufruf
edc65
1
Ist die Winkeleingabe wirklich greater than 0so, dass 0 nicht erlaubt ist?
EDC65

Antworten:

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}

Der Code ist 84 Byte lang und berechtigt zu einem Bonus von 5% ( Kotangens und Kosekant ).

Versuchen Sie es online in dem CJam Dolmetscher .

Wie es funktioniert

"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#
Dennis
quelle
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
Alex A.
quelle
Habe ich oder deine "Unfolded" -Version eine zusätzliche Schleife?
David Arenburg
Ohne Exsecant und Cotangent geht es dir besser.
Lirtosiast
@DavidArenburg Die längere Version hat die gleiche Anzahl von Schleifen, sie ist nur anders geschrieben als die kurze Version.
Alex A.
@ThomasKwa Ich weiß, aber ich werde trotzdem nicht gewinnen. : 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

Berechnet den Sinus, die Sekante und die Tangente. Dann werden die Co-Funktionen einfach über die Formel berechnet coF(x) = F(90 - x).

orlp
quelle
Gibt dies 0 für undefiniert?
Lirtosiast
@ThomasKwa Glaube nicht.
Orlp
1
Dann ist es derzeit ungültig.
Lirtosiast
5

Mathematica (derzeit ungültig), 134 121 104

Nur zum Spaß kann man sicher viel Golf spielen

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

Und es sollte einen 5% Bonus (Cot und Csc) haben, also 99 Zeichen

Beispielausgabe:

Beispielausgabe

WizardOfMenlo
quelle
Würden Sie nicht ein besseres Ergebnis erzielen, wenn Sie mehr Funktionen hinzufügen?
stolzer Haskeller
@proud haskeller, ich kann versuchen, aber wahrscheinlich werde ich mehr als gewinnen Zeichen verlieren
WizardOfMenlo
4
Schreibt dies die Namen der Funktionen vollständig aus oder verwendet es 0dafür sec(90)?
Lirtosiast,
@ Thomas Kwa sollte es nicht, ich werde es testen, wenn ich eine Chance habe
WizardOfMenlo
Ich bezweifle wirklich, dass dies tatsächliche Funktionsnamen zeigt
David Arenburg
4

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

Änderung nach Klärung überarbeitet, jetzt beträgt der Bonus 5%

Edit erkannte, dass der Winkel nicht 0 sein kann

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

edc65
quelle
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
`
Dendrobium
quelle
Können Sie Ihrem Titel ein Komma nach "Javascript ES6" hinzufügen, damit Ihre Punktzahl korrekt analysiert wird?
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))),"")

Anwendungsbeispiel

> 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
David Arenburg
quelle
2
scan()/(180/pi)-> scan()*pi/180?
Lirtosiast
3

Perl, 182 177 (236 - 25%)

Ausführen mit -n(1 Byte zum nicht korrigierten Ergebnis hinzugefügt).

$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

Nichts Außergewöhnliches. Es nutzt -nimplizite Eingaben $_als Standardargument für sinund cosund Barewords für Zeichenfolgen. Die Regel „undefined = 0“ ist mit dem ternären Operator fest codiert ?:(gilt nur für 90 °).

Eine Sache , die ich learend ist , dass es scheint, können Sie nicht (oder nicht nennen ) ein Unterprogramm namens s(oder m, y, tr): sub s {print 1}; sAusbeuten Substitution pattern not terminated at -e line 1.

xebtl
quelle
Aus irgendeinem Grund wird Ihre Punktzahl noch seltsamer analysiert.
Leif Willerts
Können Sie nach "Perl" ein Komma einfügen, damit Ihre Punktzahl korrekt analysiert wird?
Zach Gates
3

Python 3, 282 (375 - 25%)

Die Fehlerbehandlung gestaltete sich durch Gleitkommafehler etwas kompliziert. kam nämlich cos(90)auf eine sehr kleine Zahl statt auf Null.

Es wird nie die Top-Antwort sein, aber Ich mag es zu denken , könnte die seiner kürzesten gültigen all-Funktionen in einer nicht-Golfy Sprache beantworten , die nicht die trigonometrischen Funktionen im Standard - Namespace hat . ;-)

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

Beispielausgabe:

>>> 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
Tim Pederick
quelle
wäre nicht '.4f'%(r)kürzer
Xebtl
@xebtl: Danke. Ich neige dazu zu vergessen, dass% -Formatierung noch vorhanden ist!
Tim Pederick
3

Perl, 165 (193 - 15%)

Ich reiche dies als neue Antwort ein, weil die Idee ganz anders ist als die andere . Bitte lassen Sie mich wissen, ob es sinnvoller ist, meinen ersten Versuch zu ersetzen.

$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

Ausführen mit -n(1 Byte hinzugefügt).

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

Da es die vier "Co" -Funktionen ausführt, qualifiziert es sich meiner Meinung nach für einen 3 * 5% = 15% Bonus.

xebtl
quelle
3

Perl, 100 95 94 Bytes

Whoa, lotta perl antwortet.

$_=<>;printf"sine: %.4f\ncosine: %.4f\ntangent: %.4f\nsecant: %.4f\n",sin,cos,(sin)/cos,1/cos
ein Spaghetto
quelle
Ja, und du machst es ziemlich gut mit diesem einfachen Ansatz :-). Sie können einige Bytes abschneiden, indem Sie -n(zählt für 1 Byte) anstelle von verwenden $_=<>. Sie müssen jedoch von Grad in Bogenmaß umrechnen und behandeln den 90 ° -Fall nicht wie vorgeschrieben. (Mit letzterem scheint es, als ob Sie bei den Antworten hier kaum allein sind.)
Xebtl
Denken Sie
Ich bin hier ein bisschen verwirrt ... hier wird Bogenmaß verwendet. Sollte ich Abschlüsse verwenden?
ein 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

Keine Ex-Dinger, um mein cleveres Namensschema beizubehalten und da ich nicht wusste, wie ich kürzen sollte (\x->x-1). (-1)ist nur eine Zahl.

Bitte beschweren Sie sich, wenn ich mapM_ putStrLndie Zeilen verschönern soll .

Leif Willerts
quelle
Vielen Dank! Gleiches gilt für Alex A. und @orlp. Letzteres sollte vielleicht die Nettowertung aufrunden.
Leif Willerts