Sebuah Sine of Greatness


24

pengantar

Semua orang mendengar tentang sinus (dosa) , cosinus (cos) , garis singgung (tan) , kotangen (pondok) , garis potong (detik) , dan cosecant (siklus) . Hampir setiap sudut memilikinya.

Jauh kurang dikenal, atau diingat, adalah exsecant (exsec) , excosecant (excsc) , versine (versin) , dan coversine (cvs) . Hampir setiap sudut memiliki itu juga. Ada beberapa yang bahkan kurang dikenal, tetapi kami hanya akan bertahan pada ini.

Saya telah membuat visualisasi ini untuk sudut θ, yaitu 45 °.


Tantangan

Buat program yang mengambil input dari sudut n, dalam derajat, dan akan menampilkan:

  1. sinus sudut n

  2. cosinus sudut n

  3. tangen sudut n

  4. garis potong sudut n

  5. setidaknya satu dari yang berikut ini. Setiap item tambahan dari daftar ini akan mendapat bonus -5%, maksimum -25%.

    • sudut dari sudut n

    • cosecant of angle n

    • excosecant of angle n

    • sudut pandang n

    • Menutupi sudut n

    • sudut kemiringan n

Jika skor Anda adalah desimal setelah menerapkan bonus, kumpulkan hingga seluruh angka terdekat.


Memasukkan

Anda dapat menerima input Anda melalui STDIN atau melalui panggilan fungsi. Argumen tunggal n,, akan diajukan.

n akan selalu menjadi bilangan bulat utuh yang lebih besar dari 0, tetapi kurang dari atau sama dengan 90.


Keluaran

Berikut adalah contoh output untuk sinus 45 °. Semua item output harus dalam format ini. Urutan barang tidak masalah.

sine: 0.70710678118

Semua item harus memiliki tepat 4 angka setelah desimal (presisi hingga seperseribu). Berikut adalah beberapa contoh pembulatan.

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

Setiap hasil yang tidak ada / tidak terdefinisi harus default ke 0.


Contoh

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

Papan angka

Agar skor Anda muncul di papan tulis, itu harus dalam format ini:

# Language, Score

Atau jika Anda mendapat bonus:

# Language, Score (Bytes - Bonus%)

Dicoret tidak seharusnya menyebabkan masalah.


Apakah urutan output penting?
Jakube

12
Pedantry depan: "Setiap sudut memilikinya" - tidak benar; kelipatan ganjil 90 derajat tidak memiliki garis singgung, misalnya. (Tampaknya sangat aneh bagi saya bahwa Anda memerlukan nilai yang tidak ada untuk memberikan output nol. Apakah Anda benar-benar menggunakan program yang dengan sengaja memberikan jawaban yang menyesatkan seperti itu?) menjadi lebih tidak jelas daripada garis potong; di kelas matematika A-level saya, kami belajar tentang ketiganya secara bersamaan.
Hammerite

Apakah huruf besar tetap huruf kecil? Saya ingin keluaran 'Sine, Cosine ...'
edc65

Sulit dimengerti Program lengkap vs input melalui pemanggilan fungsi
edc65

1
Apakah input sudut benar-benar greater than 0, sehingga 0 tidak diizinkan?
edc65

Jawaban:


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}

Kode panjangnya 84 byte dan memenuhi syarat untuk bonus 5% ( cotangent dan cosecant ).

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

"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

Tidak Disatukan:

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

Apakah ini saya atau versi "Tidak Lipat" Anda memiliki loop tambahan?
David Arenburg

Anda akan lebih baik tanpa berlebihan dan cotangent.
lirtosiast

@ DavidVenburg Versi yang lebih panjang memiliki jumlah loop yang sama, hanya saja ditulis berbeda dari versi pendek.
Alex A.

@ ThomasKwa saya tahu, tapi saya tidak akan menang juga. : 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

Menghitung sinus, garis potong dan garis singgung. Kemudian, fungsi-fungsi tersebut dihitung secara sederhana melalui rumus coF(x) = F(90 - x).


Apakah ini 0 untuk undefined?
lirtosiast

@ThomasKwa Jangan berpikir begitu.
orlp

1
Maka saat ini tidak valid.
lirtosiast

5

Mathematica (Tidak valid saat ini), 134 121 104

Hanya untuk bersenang-senang, pasti bisa bermain golf banyak

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

Dan itu harus memiliki bonus 5% (Cot dan Csc), oleh karena itu berjumlah 99 karakter

Contoh output:

Contoh Output


Tidakkah Anda mendapatkan skor yang lebih baik dengan menambahkan lebih banyak fungsi?
haskeller bangga

@proud haskeller, saya bisa mencoba, tapi mungkin saya akan kehilangan lebih dari mendapatkan karakter
WizardOfMenlo

4
Apakah ini menuliskan nama fungsi secara penuh, atau digunakan 0untuk sec(90)?
lirtosiast

@ Thomas Kwa seharusnya tidak, saya akan mengujinya ketika saya punya kesempatan
WizardOfMenlo

Saya sangat meragukan ini menunjukkan nama fungsi sebenarnya
David Arenburg

4

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

Edit revisi setelah klarifikasi, sekarang bonusnya adalah 5%

Sunting menyadari bahwa sudut tidak boleh 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`
`

Tidak Disatukan:

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

Bisakah Anda menambahkan koma setelah "Javascript ES6" di judul Anda sehingga skor Anda akan diuraikan dengan benar?
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))),"")

Contoh penggunaan

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

Jalankan dengan -n(1 byte ditambahkan ke skor yang tidak dikoreksi).

$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

Tidak ada yang mewah. Ini mengambil keuntungan dari -ninput implisit, $_sebagai argumen default untuk sindan cos, dan kata kunci untuk string. Aturan "undefined = 0" hardcoded dalam menggunakan operator ternary ?:(hanya berlaku untuk 90 °).

Satu hal yang saya learend adalah bahwa tampaknya, Anda tidak dapat memiliki (atau tidak dapat memanggil ) subroutine bernama s(atau m, y, tr): sub s {print 1}; shasil Substitution pattern not terminated at -e line 1.


Untuk beberapa alasan, skor Anda diuraikan bahkan lebih aneh.
Leif Willerts

Bisakah Anda menambahkan koma setelah "Perl" sehingga skor Anda diuraikan dengan benar?
Zach Gates

3

Python 3, 282 (375 - 25%)

Penanganan kesalahan ternyata agak rumit oleh kesalahan floating-point; yaitu, cos(90)keluar ke angka yang sangat kecil, bukan nol.

Itu tidak akan pernah menjadi jawaban teratas, tapi saya suka berpikir itu mungkin jawaban terpendek semua fungsi yang valid dalam bahasa non-golfy yang tidak memiliki fungsi trigonometri di namespace default . ;-)

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

Output sampel:

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

tidak '.4f'%(r)akan lebih pendek?
xebtl

@ xebtl: Terima kasih. Saya cenderung lupa bahwa% -formatting masih ada!
Tim Pederick

3

Perl, 165 (193 - 15%)

Saya mengajukan ini sebagai jawaban baru karena idenya sangat berbeda dari yang lain . Harap beri tahu saya jika lebih tepat untuk mengganti upaya pertama saya.

$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

Jalankan dengan -n(1 byte ditambahkan).

Tidak Disatukan:

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

Karena itu melakukan empat "co" -fungsi, saya pikir itu memenuhi syarat untuk bonus 3 * 5% = 15%.


3

Perl, 100 95 94 byte

Whoa, lotta perl menjawab.

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

Ya, dan Anda melakukannya dengan cukup baik dengan pendekatan langsung ini :-). Anda dapat mencukur beberapa byte dengan menggunakan -n(dihitung untuk 1 byte) alih-alih $_=<>. Namun, Anda harus mengkonversi dari derajat ke radian, dan Anda tidak menangani casing 90 ° seperti yang ditentukan. (Dengan yang terakhir, sepertinya Anda tidak sendirian di antara jawaban di sini.)
xebtl

Juga, ingat bahwa leluhur Code Golf adalah Perl Golf :-)
xebtl

Saya agak bingung di sini ... ini menggunakan radian. Apakah saya seharusnya menggunakan derajat?
spaghetto

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

Tidak ada mantan untuk menjaga skema penamaan saya yang cerdas dan karena saya tidak tahu bagaimana memendekkan (\x->x-1). (-1)hanya angka.

Silakan mengeluh jika Anda ingin saya melakukan prettify ( mapM_ putStrLn) dialog.


Terima kasih! Sama untuk Alex A. dan @orlp. Yang terakhir mungkin harus mengumpulkan skor bersih.
Leif Willerts
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.