Un seno di grandezza


24

introduzione

Tutti hanno sentito parlare di seno (sin) , coseno (cos) , tangente (abbronzatura) , cotangente (cot) , secante (sec) e cosecante (csc) . Quasi ogni angolo li ha.

Molto meno conosciuti o ricordati, sono exsecant (exsec) , excosecant (excsc) , versine (versin) e coversine (cvs) . Quasi ogni angolo ha anche quelli. Ci sono alcuni che sono ancora meno conosciuti, ma ci limiteremo a questi.

Ho creato una visualizzazione di questi per l'angolo θ, che è di 45 °.


La sfida

Crea un programma che accetta un input di un angolo n, in gradi, e produrrà:

  1. il seno dell'angolo n

  2. il coseno dell'angolo n

  3. la tangente dell'angolo n

  4. la secante dell'angolo n

  5. almeno una delle seguenti. Ogni oggetto aggiuntivo da questo elenco guadagnerà un bonus del -5%, per un massimo del -25%.

    • esente di angolo n

    • cosecante di angolo n

    • excosecant di angolo n

    • angolo di inclinazione n

    • copertine d'angolo n

    • cotangente di angolo n

Se il tuo punteggio è un decimale dopo aver applicato un bonus, arrotonda per eccesso al numero intero più vicino.


Ingresso

È possibile accettare l'input tramite STDIN o una chiamata di funzione. nVerrà passato un singolo argomento .

n sarà sempre un numero intero maggiore di 0, ma inferiore o uguale a 90.


Produzione

Ecco un esempio dell'uscita per seno di 45 °. Tutti gli elementi di output devono essere in questo formato. L'ordine degli articoli non ha importanza.

sine: 0.70710678118

Tutti gli elementi devono avere esattamente 4 numeri dopo il decimale (precisione al decimilionesimo). Di seguito sono riportati alcuni esempi di arrotondamento.

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

Qualsiasi risultato inesistente / indefinito dovrebbe essere impostato su 0.


Esempio

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

tabellone segnapunti

Affinché il tuo punteggio appaia sul tabellone, dovrebbe essere in questo formato:

# Language, Score

O se hai guadagnato un bonus:

# Language, Score (Bytes - Bonus%)

Le barrature non dovrebbero causare problemi.


L'ordine dell'output è importante?
Jakube,

12
Pedanteria avanti: "Ogni angolo li ha" - non è vero; multipli dispari di 90 gradi non hanno una tangente, per esempio. (Mi sembra estremamente bizzarro che tu abbia bisogno di valori inesistenti per dare un risultato pari a zero. Utilizzeresti davvero un programma che ha deliberatamente dato risposte così fuorvianti?) Inoltre, sarei interessato a sapere perché consideri il cosecante e cotangente come essere più oscuro del secante; nelle mie lezioni di matematica di livello A abbiamo appreso di questi tre allo stesso tempo.
Hammerite,

La capitalizzazione è fissa in minuscolo? Vorrei l'uscita "Sine, Cosine ..."
edc65,

Difficile da capire Programma completo vs input tramite una chiamata di funzione
edc65

1
L'ingresso dell'angolo è davvero greater than 0, quindi 0 non è consentito?
edc65,

Risposte:


8

CJam, 94 89 85 81 80 byte

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

Il codice è lungo 84 byte e si qualifica per un bonus del 5% ( cotangente e cosecante ).

Provalo online nell'interprete CJam .

Come funziona

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

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

Sono io o la tua versione "Unfolded" ha un loop aggiuntivo?
David Arenburg,

Staresti meglio senza exsecant e cotangent.
lirtosiast,

@DavidArenburg La versione più lunga ha lo stesso numero di loop, è scritta in modo diverso rispetto alla versione breve.
Alex A.

@ThomasKwa Lo so, ma non vincerò comunque. : P
Alex A.

5

Pyth, 66-10% = 59,4 byte

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

Calcola il seno, la secante e la tangente. Quindi, le co-funzioni vengono semplicemente calcolate tramite la formula coF(x) = F(90 - x).


Questo dà 0 per un indefinito?
lirtosiast,

@ThomasKwa Non la penso così.
orlp,

1
Quindi non è attualmente valido.
lirtosiast,

5

Mathematica (non valido al momento), 134 121 104

Solo per divertimento, sicuramente si può giocare molto a golf

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

E dovrebbe avere un bonus del 5% (Cot e Csc), quindi pari a 99 caratteri

Esempio di output:

Esempio di output


Non otterresti un punteggio migliore aggiungendo più funzioni?
orgoglioso haskeller il

@proud haskeller, posso provare, ma probabilmente perderò più di guadagnare personaggi
WizardOfMenlo,

4
Fa questo articolo i nomi delle funzioni in piena, o l'uso 0per sec(90)?
lirtosiast,

Thomas Kwa non dovrebbe, lo
proverò

Dubito davvero che questo mostra i nomi delle funzioni attuali
David Arenburg,

4

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

Modifica revisionata dopo il chiarimento, ora il bonus è del 5%

Modifica realizzato che l'angolo non può essere 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
`

Potresti aggiungere una virgola dopo "Javascript ES6" nel titolo in modo che il tuo punteggio venga analizzato correttamente?
Zach Gates,

3

R, 122 136 134 byte

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

Esempio di utilizzo

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

Esegui con -n(1 byte aggiunto al punteggio non corretto).

$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

Nulla di bello. Sfrutta l' -ninput implicito, $_come argomento predefinito per sine cos, e le parole d'ordine per le stringhe. La regola "undefined = 0" è codificata nell'uso dell'operatore ternario ?:(si applica solo per 90 °).

Una cosa che ho learend è che a quanto pare, non si può avere (o non può chiamare ) una subroutine di nome s(o m, y, tr): sub s {print 1}; sle rese Substitution pattern not terminated at -e line 1.


Per qualche motivo, il tuo punteggio viene analizzato ancora più strano.
Leif Willerts,

Potresti aggiungere una virgola dopo "Perl" in modo che il tuo punteggio venga analizzato correttamente?
Zach Gates,

3

Python 3, 282 (375-25%)

La gestione degli errori si è rivelata in qualche modo complicata da errori in virgola mobile; vale a dire, è cos(90)venuto fuori un numero molto piccolo invece di zero.

Non sarà mai la risposta migliore, ma mi piace pensare che potrebbe essere la risposta valida per tutte le funzioni più breve in un linguaggio non golfy che non ha le funzioni di attivazione nello spazio dei nomi predefinito . ;-)

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

Uscita campione:

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

non '.4f'%(r)sarebbe più breve?
xebtl,

@xebtl: grazie. Tendo a dimenticare che la formattazione% esiste ancora!
Tim Pederick,

3

Perl, 165 (193-15%)

Sto presentando questa come una nuova risposta perché l'idea è abbastanza diversa dalla dall'altra . Per favore fatemi sapere se è più appropriato sostituire il mio primo tentativo.

$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

Esegui con -n(1 byte aggiunto).

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

Dal momento che svolge le quattro funzioni "co", penso che si qualifichi per un bonus 3 * 5% = 15%.


3

Perl, 100 95 94 byte

Whoa, lotta perl risponde.

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

Sì, e stai andando abbastanza bene con questo approccio diretto :-). Puoi eliminare alcuni byte usando -n(conta per 1 byte) invece di $_=<>. Tuttavia, devi convertire da gradi a radianti e non gestisci il caso a 90 ° come prescritto. (Con quest'ultimo, sembra che tu non sia quasi solo tra le risposte qui.)
xebtl

Inoltre, ricorda che l'antenato di Code Golf era Perl Golf :-)
xebtl

Sono un po 'confuso qui ... questo usa i radianti. Avrei dovuto usare i gradi?
uno spaghetto il

2

Haskell, 159 = 186-15% byte

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

Nessun ex-cosa per mantenere il mio intelligente schema di denominazione e dal momento che non sapevo accorciare (\x->x-1).(-1)è solo un numero.

Si prega di lamentarsi se si desidera che prettify ( mapM_ putStrLn) le righe.


Grazie! Lo stesso per Alex A. e @orlp. Quest'ultimo dovrebbe forse arrotondare il punteggio netto.
Leif Willerts
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.