Büyüklüğün Sinüsü


24

Giriş

Herkes sinüs (günah) , kosinüs (cos) , tanjant (tan) , kotanjant (karyola) , sekant (sn) ve cosecant (csc) 'yi duymuştur . Neredeyse her açıdan onlara sahip.

Daha az bilinen ya da hatırlanan, eski (exsec) , eski (excsc) , versine (versin) ve coversine'dir (cvs) . Neredeyse her açıdan da buna sahip. Daha az bilinen, bazıları var ama biz bunlara sadık kalacağız.

Bunların 45 ° 'lik açı θ için bir görselleştirmesi hazırladım.


Meydan okuma

Bir açı girişini, nderece cinsinden alan ve çıktısını alacak bir program oluşturun :

  1. açının sinüsü n

  2. açının kosinüsü n

  3. açının teğeti n

  4. açının sekantı n

  5. aşağıdakilerden en az biri. Bu listedeki her bir ek ürün, maksimum% -25 için% -5 bonus kazanacak.

    • açılı n

    • açılı cosecant n

    • açılı n

    • açının türü n

    • açının kapsülü n

    • açının kotanjanı n

Bir bonusu uyguladıktan sonra puanınız ondalık ise, en yakın tam sayıya yuvarlayın.


Giriş

Girişinizi STDIN veya bir işlev çağrısı yoluyla kabul edebilirsiniz. Tek bir argüman niletilecek.

n her zaman 0'dan büyük, ancak 90'dan küçük veya ona eşit bir tam sayı olacaktır.


Çıktı

İşte 45 ° sinüs için bir çıkış örneği. Tüm çıktı öğeleri bu biçimde olmalıdır. Maddelerin sırası önemli değil.

sine: 0.70710678118

Tüm öğeler, ondalık sayısından sonra tam olarak 4 sayı içermelidir (on binde bir hassasiyet). Aşağıda yuvarlama için birkaç örnek verilmiştir.

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

Var olmayan / tanımlanmamış sonuçlar varsayılan olarak 0 olmalıdır.


Örnek

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

sayı tahtası

Puanınızın tahtada görünmesi için, bu biçimde olması gerekir:

# Language, Score

Veya bonus kazanırsanız:

# Language, Score (Bytes - Bonus%)

Üstü çizilmeler bir soruna neden olmamalıdır.


Çıktının sırası önemli mi?
Jakube

12
Önümüzdeki Pedantry: "Her açıdan onlara sahip" - doğru değil; Örneğin, 90 derecelik garip katların teğeti yoktur. (Sıfırın çıktısını almak için varolmayan değerlere ihtiyaç duymaman çok garip görünüyor. Gerçekten de bu kadar yanıltıcı cevaplar veren kasten bir program kullanır mısın?) sekanttan daha belirsiz olmak; A seviyesi matematik derslerimde bu üçü aynı anda öğrendik.
Hammerite

Büyük harf küçük harf sabit mi? 'Sine, Cosine ...' çıkışını istiyorum
edc65

Anlamak zor Tam programa karşı bir işlev çağrısı yoluyla giriş
edc65

1
Açı girişi gerçekten greater than 0, yani 0'a izin verilmiyor mu?
edc65

Yanıtlar:


8

CJam, 94 89 85 81 80 bayt

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

Kod 84 bayttır ve% 5 bonus ( kotanjant ve cosecant ) için uygundur.

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

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

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

Bana mı öyle geliyor, yoksa "Unfolded" versiyonunun ek bir döngüsü var mı?
David Arenburg

Mükemmel ve cotangent olmadan daha iyi olursun.
lirtosiast

@DavidArenburg Uzun versiyon aynı sayıda döngüye sahip, sadece kısa versiyondan farklı yazılmış.
Alex A.

@ThomasKwa Biliyorum, ama yine de kazanmayacağım. : P
Alex A.

5

Pyth,% 66 - 10 = 59.4 bayt

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

Sinüs, sekant ve teğeti hesaplar. Daha sonra, fonksiyonlar basit bir şekilde formül üzerinden hesaplanır coF(x) = F(90 - x).


Bu tanımsız için 0 veriyor mu?
lirtosiast

@ThomasKwa Sanmıyorum.
orlp

1
O zaman şu anda geçersiz.
lirtosiast

5

Mathematica (Şu anda geçersiz), 134 121 104

Sadece eğlence için, kesinlikle çok aşağı golf olabilir

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

Ve% 5 bonus (Cot ve Csc) olmalı, dolayısıyla 99 karakterde olmalı

Örnek çıktı:

Örnek çıktı


Daha fazla fonksiyon ekleyerek daha iyi bir puan almaz mıydınız?
Gurur haskeller 19:15

@proud haskeller, ben deneyebilirsiniz, ancak muhtemelen kazanç karakterden daha fazla kaybedecek
WizardOfMenlo

4
Bu işlevlerin isimlerini tam olarak yazıyor mu, yoksa bunun 0için sec(90)mi kullanıyor ?
lirtosiast

@Thomas Kwa yapmamalı, şansım olduğunda test edeceğim
WizardOfMenlo 19:15 '

Bu şovun asıl işlev adlarından şüpheliyim
David Arenburg

4

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

Açıklamadan sonra düzeltilen düzenleme , şimdi bonus% 5

Düzen , açının 0 olamayacağını fark etti

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

Başlığınıza "Javascript ES6" dan sonra virgül eklerseniz puanınız doğru şekilde ayrıştırılır mı?
Zach Gates,

3

R, 122 136 134 bayt

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

Örnek kullanım

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

Çalıştır -n(düzeltilmemiş puana 1 bayt eklendi).

$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

Hiçbir şey fantezi. Bu yararlanır -n, örtük girişi için $_varsayılan bir argüman olarak sinve cosve dizeler için barewords. “Undefined = 0” kuralı üçlü operatör kullanılarak kodlanmıştır ?:(yalnızca 90 ° için geçerlidir).

Bir şey learend görünüşte, sahip olamaz (ya edemezler çağrı ) bir altprogram adlı s(veya m, y, tr): sub s {print 1}; sverimleri Substitution pattern not terminated at -e line 1.


Bazı nedenlerden dolayı puanınız daha da tuhaf ayrılıyor.
Leif Willerts

"Perl" den sonra virgül ekler misiniz, böylece puanınız doğru şekilde ayrıştırılır?
Zach Gates,

3

Python 3, 282 (375 -% 25)

Hata işleme kayan nokta hataları ile biraz karmaşık olduğu ortaya çıktı; yani cos(90)sıfır yerine çok küçük bir sayıya çıktı.

Asla en iyi cevap olmayacak, ancak varsayılan ad alanında trig işlevlerine sahip olmayan golf dışı bir dilde en kısa geçerli tüm işlevler yanıtı olabileceğini düşünüyorum . ;-)

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

Örnek çıktı:

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

daha '.4f'%(r)kısa olmaz mıydı ?
xebtl

@ xebtl: Teşekkürler. Yüzde biçimlendirmenin hala var olduğunu unutma eğilimindeyim!
Tim Pederick 22:15

3

Perl, 165 (193 -% 15)

Bu mesajı yeni bir cevap olarak sunuyorum çünkü fikir diğerinden oldukça farklı . Lütfen ilk girişimin yerine getirilmesinin daha uygun olup olmadığını bana bildirin.

$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

Çalıştır -n(1 byte eklendi).

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

Dört "ortak" işlevi yerine getirdiğinden, 3 * 5% = 15% bonus için uygun olduğunu düşünüyorum.


3

Perl, 100 95 94 bayt

Whoa, lotta perl cevaplar.

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

Evet, ve bu basit yaklaşımla oldukça iyi gidiyorsunuz :-). Kullanarak bazı baytları tıraş edebilirsiniz -n(1 bayt için sayar)$_=<> . Bununla birlikte, derecelerden radyanlara dönüşmeniz gerekir ve 90 ° kasayı belirtilen şekilde kullanmazsınız. (İkincisi ile, buradaki cevaplar arasında pek yalnız değilsiniz gibi görünüyor.)
xebtl 23:15

Ayrıca, Code Golf'un atalarının Perl Golf :-) olduğunu unutmayın
xebtl

Kafam biraz karıştı ... radyan kullanıyor. Dereceleri kullanmam mı gerekiyordu?
Bir spaghetto

2

Haskell, 159 = 186 -% 15 bayt

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

Zekice isimlendirme planımı sürdürecek hiçbir şey yok ve o zamandan beri nasıl kısaltacağımı bilmiyordum (\x->x-1). (-1)sadece bir sayıdır.

Lütfen mapM_ putStrLnçizgileri güzelleştirmek ( ) yapmamı istiyorsanız şikayet edin .


Teşekkürler! Alex A. ve @orlp için aynı. İkincisi, net puanı toparlayabilir.
Leif Willerts
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.