Trigonometri başlasın!


20

Giriş:

Sinüs ve xaşağıdaki formül ile verilir:

sin(x) = x - x^3/3! + x^5/5! - x^7/7! + x^9/9! - x^11/11! // and more follows...

Kosinüs arasında x, aşağıdaki formül ile verilir:

cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8! - x^10/10! // and more follows...

Görev:

Değeri verilir xve nbir program çıkışına (herhangi bir fonksiyon, vs.) değeri bilgileri sin(x)ve cos(x)doğru kadar nyukarıdaki formülün koşulları. Bunun xradyan cinsinden olduğunu varsayın .

Giriş:

x n

Bir ondalık sayı x(3 ondalık basamağa kadar) ve bir tam sayı n. Giriş stdin veya bir istem iletişim kutusunda olmalıdır (diliniz stdin'i desteklemiyorsa)

Çıktı:

[sin(x)]
[cos(x)]

Her iki değeri sin(x)ve cos(x)6 ondalık basamağa yuvarlanmış olmalıdır. Eğer sin(x)bir 0.5588558855(10 ondalık hane), bu yuvarlanmalıdır 0.558856(6 ondalık hane). Yuvarlama, bu Wiki makalesindeki tablonun beşinci sütunu "En yakına yuvarla" bölümünde açıklandığı gibi en yakın yerde gerçekleşmelidir .

Kısıtlamalar:

1 <= x <= 20
1 <= n <= 20

Örnekler:

----
5 3

10.208333
14.541667
----
8.555 13

0.765431
-0.641092
----
9.26 10

-3.154677
-8.404354
----
6.54 12

0.253986
0.967147
----
5 1

5.000000
1.000000
----
20 20

-5364.411846
-10898.499385
----

Notlar:

  1. Standart boşluklar yasaktır.
  2. Yerleşik matematik fonksiyonları ve trigonometri (sin, cos, tan vb.), Faktöriyel ve üs alma operatörleri kullanılamaz. Hesaplamanın sonucunu sin(x)ve cos(x)6. ondalık basamağı tahmin etmek için yerleşik bir yuvarlama işlevi kullanabilirsiniz .
  3. Yanlış girişleri işlemeye gerek yoktur.
  4. Programda yalnızca ASCII karakterleri kullanılabilir, kod sıkıştırmaya izin veren Çince Unicode karakterleri kullanılamaz.
  5. Programınız girdiyi 3 saniye içinde sonlandırmalı ve görüntülemelidir.
  6. Cevabınız, kodun açıklamasının yanı sıra ungolfed koduna da eşlik etmelidir (kod, dilinize aşina olmayan programcılar, özellikle GolfScript, J, vb. İçin hemen açık değilse zorunludur).
  7. Lütfen programınızın test edilebileceği bir çevrimiçi derleyiciye bağlantı ekleyin.

puanlama:

Beyaz boşluk, sekmeler vb. Gibi karakterlerde en düşük kod uzunluğuna sahip cevap kazanır! Kazanan 21 Mayıs 2014'te ilan edilecek.

EDIT : 21/05/14 Kazanan CJam dili kullanan aditsu olduğunu . İkincisi, J dili ile jpjacobs'u takip eder ve ikinci ikincisi Perl dili ile primo . Tebrikler!


(Mod notu: yorumlar nuked. İstediğiniz herhangi bir kayıp bilgi için lütfen bana ping atın; önceden
uyarımdan

İlk paragrafta, "günah" değil "sinüs" olmalıdır
Charles

"En yakına yuvarla" hala bir zorunluluk mudur yoksa yerleşik yuvarlama tesislerini kullanabilir miyiz? örneğin sıfıra mı yuvarlanıyor?
Dijital Travma

mod 2piGirişlerin daha hızlı birleşmesi için bir işlemin eşdeğerini istemek oldukça yararlı olacaktır - bu işlevlerle uğraşırken gerçek dünyanın kullandığı birçok iyileştirmeden biridir. (aslında mod pi ve işaret farkındalığı).
Floris

1
@Floris Bunu hiç bilmiyordum. Şimdi hiçbir şey yapamayız, kurallar zaten çok değişti ve cevaplayıcıları daha fazla rahatsız etmek için onları değiştirmeye devam etmek istemiyorum. Yine de öneri için teşekkürler!
Gaurang Tandon

Yanıtlar:


6

CJam - 42

rd:X;1_ri2*,1>{_2%2*(*/X*_}/;]2/z{:+6mO}/p

Http://cjam.aditsu.net adresinden çevrimiçi olarak deneyin

Açıklama:

rGiriş bir belirteç okur
ddouble dönüştürür
:Xdeğişken X atar
;yığından değer
1yığında koyar 1 (ilk dönem)
_1 çoğaltan
rbir sonraki jetonu (n) okur
itamsayıya dönüştürür
2*,1>{...}/döngü bir tür ila 1 * n, 2 ila - 1:
- 2*çarpar 2 ile
- ,-1 (son değer) 0 ile bir dizi yapar
- 1>dizinin ilk madde kaldırır (0)
- {...}/dizideki her madde için bir blok yürütür
_"döngü çoğaltır değişken "(buna k diyelim)
2%2*(çift ​​/ tekten -1/1'e dönüştürür:
- 2%modulo 2'dir (-> 0/1)
- 2*2 ile çarpılır (-> 0/2)
-(azalmalar (-> -1/1)
*çarpar, böylece her saniye göstergede işareti değiştirmek
/yığındaki terimi k veya -k'ye böler; bu "/ k!" işaret değişikliği ile birlikte hesaplamanın bir kısmı
X*X ile çarpılır; bu hesaplamanın "X ^ k" kısmıdır; dizideki bir sonraki terimi bir
_sonraki yinelemede
;(döngüden sonra) sonraki terimi hesaplamak için kullanılacak terimi çoğaltır, yinelenen son yinelenen terim
]dizideki yığındaki terimleri toplar.
Bu noktada bir dizi var [ 1 X -X ^ 2/2! -X ^ 03/03! X ^ 04/04! X ^ 05/05! ...] cos (x) ve sin (x) için ihtiyacımız olan tüm terimleri içeren, araya eklenmiş
2/bu diziyi çiftler halinde böler
z matrisi dönüştürür ve sonuç olarak cos (x) terimleriyle dizi ve sin (x) terimleriyle dizi , "matris satırları" olarak
{...}/ her bir dizi öğesinin (matris satırı) için bloğu tekrar yürüttüğü matrisi aktarır:
- :+elemanları ekler birlikte matris sıranın
- 6mO6 ondalık mermi
Bu noktada yığını istenen cos (x) ve sin (x) sahip
pbir yeni satır ardından baskı yığın son ürünün temsili (sin (x))
'de programın sonunda, yığının kalan içeriği (cos (x)) otomatik olarak yazdırılır.


1
Beni hiç duymadığım ve muhtemelen kullanmayacağım bir dile tanıttığınız için +1.
Alex

@Alex teşekkürler, CJam steroidlerde GolfScript gibi
aditsu

Soruyu gönderdikten sonra kuralları değiştirmeyi sevmiyorum, ancak Unicode karakterlerin kodu sıkıştırmak için kullanılabileceğini bilmediğim için kod sıkıştırma-izin veren-Unicode karakterlere izin vermedim. Artık yalnızca ASCII karakterleri kullanılabilir. Lütfen yayınınızı düzenleyin. Rahatsızlık için üzgünüm.
Gaurang Tandon

@GaurangTandon Ben de bundan pek hoşlanmıyorum. Bu problemde Çince karakterlerin başka ne için kullanılabileceğini düşünüyorsun? Her neyse, düzenlendi.
aditsu

18

Perl - 72 bayt

$~=<>=~$"+$'*2;$_=1-$_*$`/$~--/$~*$`for($,,$;)x$';printf'%f
%f',$`*$,,$;

Veya komut satırı seçeneklerini her biri 1 bayt, 70 bayt olarak saymak :

#!perl -n
$-=/ /+$'*2;$_=1-$_*$`/$---/$-*$`for($,,$;)x$';printf'%f
%f',$`*$,,$;

Veya Perl 5.8'e izin verirseniz 63 baytta :

#!perl -p
$.+=$'<</ /;$_=1-$_*$`/$.--/$.*$`for($_=$#='%f
',$\)x$';$_*=$`

ama neden yaptın.

Düzenleme : Yeni kurallara uyma. %fvarsayılan olarak 6 yere yuvarlar, ne kadar uygun!


Algoritma

Taylor serisinin günah (x) açısından incelenmesi :

her terimin birbirini takip eden her terimi eşit olarak böldüğü görülebilir. Bu nedenle, zahmetsizce iç içe bir ifadeye dönüştürülebilir:

cos (x) , önde gelen x olmadan benzer şekilde dönüşür ve payda terimleri daha küçük .

Ayrıca, bu iç içe ifade, ters özyinelemeli bir ifade olarak yeniden formüle edilebilir:

ile s = 0 ve sin (x) = · s 1 kullanılır, ne de olsa, hangi.


Ungolfed

<> =~ m/ /;          # read one line from stdin, match a space
                     # prematch ($`) is now x, postmatch ($') is now n
($x, $n) = ($`, $'); # reassign, for clarity
$i = 2*$n + 1;       # counting variable (denominators)

for (($s, $c)x$n) {  # iterate over $s and $c, n times each
  # compute the next term of the recursive expression
  # note: inside this loop $_ is not the _value_
  # of $s and $c alternately, it _is_ $s and $c

  $_ = 1 - $_ * $x**2 / $i-- / $i;
}

# formated output
printf("%f\n%f", $x*$s, $c);

Örnek Kullanımı

$ echo 5 3 | perl sin-cos.pl
10.208333
14.541667

$ echo 8.555 13 | perl sin-cos.pl
0.765431
-0.641092

$ echo 9.26 10 | perl sin-cos.pl
-3.154677
-8.404354

$ echo 6.54 12 | perl sin-cos.pl
0.253986
0.967147

$ echo 5 1 | perl sin-cos.pl
5.000000
1.000000

$ echo 20 20 | perl sin-cos.pl
-5364.411846
-10898.499385

Bunu çevrimiçi olarak test etmek istiyorsanız, compileonline.com kullanmanızı öneririz . Kodu kopyalayıp Yapıştırın main.plve girişi STDINkutuya yapıştırın Execute Script.


2
Girdiyi ayrıştırmak için ne kadar da sade bir yol ... bunu çözümümde kullanabilir miyim? :)
Tal

@Tal Çekinmeyin.
primo

2
Bence perl (ve özellikle kodunuz) "dilinize aşina olmayan programcılar için hemen belli değil" olarak sayılır
aditsu

1
@aditsu Kabul etti. Daha temiz bir kod ve algoritmanın bir açıklamasını ekleyeceğim.
primo

2
Bu cevap gerçekten son derece eğiticiydi!
Tal

10

Python 3 (102) / Python 2 (104)

Python 3 (102)

x,n=map(float,input().split())
k=2*n
t=1
while k>1:k-=1;t=1+t*1j*x/k
print('%.6f\n'*2%(t.imag,t.real))

Python 2,7 (104)

x,n=map(float,raw_input().split())
k=2*n
t=1
while k>1:k-=1;t=1+t*1j*x/k
print'%.6f\n'*2%(t.imag,t.real)

Temelde aynı kod. İki karakteri parenlere ihtiyaç duymamaktan kurtarırız, printancak dört karakteri ihtiyaçtan kaybederiz raw_input.

Örnek çalışma

Bunları burada çalıştırabilirsiniz .

>>>
20 20
-5364.411846
-10898.499385

Kod açıklaması

Ana fikir, 2*nterimlerin hesaplanması e^(ix)ve daha sonra terimlere sinve cosdeğerlerin yaklaşıklaştırılması için hayali ve gerçek rolün alınmasıdır n. Taylor serisinin kesilmesini kullanıyoruz:

e^(ix)≈sum_{k=0}^{2n-1} (i*x)^k/k!

Bu, i * x'de polinomdur, ancak her terimi toplayarak değerini hesaplamak yerine , diziyi hesaplamak için değiştirilmiş bir Horner Yöntemi kullanırız (yinelemeli olarak tersine tanımlanır)

t_{2n} = 1
t_k = 1 + t_{k+1}*i*x/k,

bu t_1da istenen değere eşittir.

Python dize biçimlendirme işlemleri, değerleri 6 ondalık basamağa yuvarlanmış olarak görüntülemek için kullanılır.

Düzenle: Yeni kurallara göre 6 basamağa yuvarlandı. Başka bir değişikliğe gerek yoktu.


Çevrimiçi bir py3 tercümanı için ideone'yi deneyin :)
Harry Beadle

@BritishColour Teşekkürler! Gönderiye ekledim.
xnor

Lütfen cevabınızı güncelleyin. Söz konusu ayrıntılara bakın. Teşekkürler.
Gaurang Tandon

8

J 98 70 69 58

Bu muhtemelen daha süslü işlevler kullanarak biraz kısaltılabilir rağmen ... yorum bekliyoruz:

exit echo 0j6":,.-/(($%&(*/)1+i.@[)"0~i.@,&_2)/".}:stdin''

not 2: EOF alırken giriş sona erer (linux'da ctrl-D). Düzenleme: güzel içine üs ve faktör birleştirme, bütün olarak daha J ish: ($ %&(*/) >:@i.@[ ). Bu, y'nin x kopyalarını ve 1'den y'ye kadar bir sayı dizisini almak için kaynar. Her birini çarpın ve sonucu bölün. Bu kopyadan kurtulur */.

Algoritma sayesinde, 7 karakter daha kapalı.

Sondaki yeni satırdan kurtulmak için kesimi ortadan kaldırdı.

Çatalları bilmenin bir zorunluluk olduğu daha uzun versiyon.

NB. recursive Factorial
f=: */@>:@i.      NB. multiply all from 1 to n
NB. Exponential
e=: */@$          NB. replicate y x times, take the product.
NB. the x t y is the Nth (general) term without sign of the joint series
t=: (e % f@[)"0  NB. pretty straight forward: divide by (x!) on the exponential

NB. Piece the parts together, from right to left:
NB. read from stdin, cut the linefeed off , make the 2 n terms in 2 columns, which
NB. effectively splits out pair and odd terms, put in the minuses, put in rows
NB. instead of columns, echo, exit
exit echo 0j6&": ,. (-/) (i.@(,&_2)@{: t {.) , (". ;. _2) stdin''

Çevrimiçi J tercümanı yok, ancak birkaç yıldan beri açık kaynak; bu talimatlarla kurulum kolaydır:

http://www.jsoftware.com/jwiki/System/Installation/J801

İrc.freenode.org üzerindeki #jsoftware üzerinde bir de J botu vardır.

Stdin ran bir dosyadan, komut ile, başka değiştirdiğinizde çalışır stdin ''ile 'a b;'a ve b komut geçti olurdu sayılardır.


5
Ben bununla başladığını seviyorumexit
Dijital Travma

Lütfen cevabınızı güncelleyin. Söz konusu ayrıntılara bakın. Teşekkürler.
Gaurang Tandon

6 ondalık basamak için güncellendi. Başka bir şey varsa, lütfen belirtin. Teşekkürler
jpjacobs

Sen kaldırabilirsiniz &gelen 0j6&":bir char tasarrufu için. Ayrıca, başka bir 6 (i.@(,&_2)@{:($%&(*/)>:@i.@[)"0{.)için yeniden yazılabilir (($%&(*/)1+i.@[)"0~i.@,&_2)/.
algoritmalarhark

Bu görevler çığlık atıyor T.(n-terim Taylor serisinin yaklaşık fonksiyonu), ama bence bu standart bir boşluk.
FUZxxl

6

Perl, 120 108 104 89 85

<>=~/ /;$c=$t=1;for(1..2*$'-1){$t*=$`/$_;$_%2?$s:$c+=$_&2?-$t:$t}printf"%f\n"x2,$s,$c

Ungolfed:

<> =~ / /;
$cosine = $t = 1;
for (1.. 2*$' - 1){
  $t *= $` / $_;
  ($_%2 ? $sine : $cosine) += $_&2?-$t:$t
}
printf "%.6f\n" x2, $sine, $cosine

İlk satır girişi okur ve boşluk bulmak için normal ifadeyi kullanır; bu, değeri otomatik olarak $ `ve boşluktan sonraki değeri $ 'olarak koyar.

Şimdi 1'den 1'e dönüyoruz 2*n-1. $tdöngünün xdöngü diziniyle tekrar tekrar çarptığı ve bölündüğü terimimizdir ($_ ) . Döngü 0 yerine 1'den başlar, çünkü kosinüs 1 olarak başlatılır ve bu da beni sıfıra bölmeyle uğraşmaktan kurtarır.

Güncellemeden sonra $t, üçlü operatör $sineya $cosine, dizinin tek veya çift olmasına bağlı olarak ya da döner ve $tbuna değer ekler . Sihirli formül$_&2?-$t:$t bu değerin eklenip çıkarılmayacağını veya çıkarılacağını (temel olarak bir bit-ve dizin üzerinde ve 2 "yineleme, toplama, çıkarma, çıkarma" dizisini oluşturmak için) belirler.

Bu kodu compileonline.com adresinden test edebilirsiniz .


Lütfen için çıktılarınızı düzeltin 20 20.
Gaurang Tandon

1
Sanırım for döngünüzün 1..$n*2-1yerine gitmesi gerekebilir 1..$n. Burada olduğum sürece ... $smükemmel ince sol olarak, başlatılmamış olması undefdeğerlendirir için 0sayısal bir bağlamda. Üçlü atama parantez ihtiyacı yoktur: $_&1?$s:$c+=$t. sondaki satırsonu eklemenin bir sonucu "%.8f\n%.8f"olarak kısaltılabilir "%.8f\n"x2.
primo

@ Primo Teşekkürler, bunlardan bazılarını bilmiyordum. Ve şimdi bile doğru sonucu da üretiyor.
Tal

@Tal Benim için zevkti. Ayrıca, biraz daha iyi büyü: $t*(1-($_&2))=> $_&2?-$t:$t.
primo

Lütfen cevabınızı güncelleyin. Söz konusu ayrıntılara bakın. Teşekkürler.
Gaurang Tandon

5

Fortran: 89 109 125 102 101 98 bayt

complex*16::t=1;read*,x,n;do k=2*n-1,1,-1;t=1+t*(0,1)*x/k;enddo;print'(f0.6)',aimag(t),real(t);end

Örtük yazmayı kötüye kullanıyorum, ancak ne yazık ki böyle bir örtük karmaşık tür mevcut değil, bu yüzden bunu ve kompleksi belirtmek zorunda kaldım i. Gfortran çıktıyı 8 ondalık basamakta doğal olarak keser, bu yüzden bu spesifikasyonda iyiyiz. Ne yazık ki, orijinal çıktı yöntemim, print*,tspesifikasyonları karşılamadı, bu yüzden hayali ve gerçek bileşenleri çıkarmak ve gerekli 8 ondalık basamağa ulaşmak için 16 karakter eklemek zorunda kaldım.

Ventero sayesinde, çıktı ve döngü arasında 23 bayt kaydetmeyi başardım. Ve doğru cevaplar ve biçimlendirilmiş çıktı almak için başka bir karakter. Ve 3 ifade daha read.

Ungolfed,

complex*16::t=1
read*,x,n
do k=2*n-1,1,-1
   t=1+t*(0,1)*x/k
enddo
print'(f0.6)',aimag(t),real(t)
end

Lütfen cevabınızı güncelleyin. Söz konusu ayrıntılara bakın. Teşekkürler!
Gaurang Tandon

1
@GaurangTandon: Muhtemelen sorunun ayrıntılarını değiştirmeyi bırakmalısınız.
Kyle Kanos

Biliyorum ve istemiyorum, ama yardım edemem. Aslında, 5 cevabı test ettikten sonra, hemen hemen hepsinin farklı sonuçlar verdiği ortaya çıktı (bu tamamen şüphesizdi). Başka bir yaklaşımı takip edebilirdim, ama bu mevcut cevapların algoritmalarının tamamen değişmesini gerektirecekti. Bu anlayabileceğim en iyisi.
Gaurang Tandon

2
Benim mükemmel çalıştığını biliyorum, bu yüzden tamamen kontrol almalıyım: D;)
Kyle Kanos

4

C, 120

double s,c,r,x;main(i,n){for(scanf("%lf %d",&x,&n),r=1;i<n*2;s+=r,r*=-x/i++)c+=r,r*=x/i++;printf("%.8lf\n%.8lf\n",s,c);}

Bir baytı kaydetmek için sinüs değerini güncelleyen ifadeler for() , ancak aslında kosinüs değerini güncelleyen kapanış parantezini izleyen ifadelerden sonra yürütülür. (Sanırım programın çıktısındaki son satırsonu karakterini kaldırarak birkaç bayt daha kaydedebilirim.)

Küresel değişkenler s, c, rve xörtülü olarak, sıfır başlangıç ve ikomut satırında sağlanan hiçbir tartışma yoktur sürece değeri 1 olacaktır. Ne yazık ki printf()varsayılan olarak 6 ondalık basamak anlamına gelir, bu nedenle çıktı biçimi biraz ayrıntılıdır.

Ungolfed:

İşte işlerin biraz daha açık bir şekilde yapıldığını göstermek için biraz yeniden düzenleme içeren kod:

double s,c,r,x;
main(i,n) {
    scanf("%lf %d",&x,&n);
    r=1;
    for(;i<n*2;) {
        c+=r;
        r*=x/i++;
        s+=r;
        r*=-x/i++;
    }
    printf("%.8lf\n%.8lf\n",s,c);
}

Örnek çıktı:

$ echo 1.23 4 | ./sincos
0.94247129
0.33410995

Çevrimiçi deneyin:

http://ideone.com/URZWwo


3

Python> = 2.7.3, 186 184 211 200 182 170 karakter

Cehennem gibi basit. Sinüs ve kosinüs için parametreleştirilen sorudan formül kullanır.

Online tercüman bulunabilir İşte İşte

x,n=map(eval,raw_input().split())
f=lambda n:n<2and 1or n*f(n-1.)
for i in[1,0]:print"%.6f"%sum((1-j%2*2)*reduce(lambda o,p:o*p,[x]*(i+2*j),1)/f(i+2*j)for j in range(n))

Düzenleme: Tüm kısıtlamalarla geçerli sürüm

Edit2:round Python 2.7.1'deki geçersiz işlev çıktısı nedeniyle çevrimiçi yorumlayıcı ideone.com olarak değiştirildi

Edit3: Gereksiz satır içi lambda kullandığım ortaya çıktı + yuvarlamayı dize biçimine değiştirdi ( xnor'dan çalındı ​​:))

Edit4:join İşlevsel olmayan ana fordöngü ile değiştirildi


Merhaba boşuna, yakın zamanda yerleşik operatörlerin üs alma için izin vermeyen kuralları düzenledim ( **sanırım ne yapıyor). Sanırım cevabınızı düzenlemek zorunda kalacaksınız. Rahatsızlık için üzgünüm. Yanlışım varsa lütfen düzelt.
Gaurang Tandon

1
Sanırım başka değişiklikler xnor'ın cevabı ile işe yaramaz :)
avall

@avail Açık 20 20, çıktı alıyorum -5364.4118142500001. 8 ondalık sayıya sabitlemek isteyebilir.
Gaurang Tandon

Repl.it Python sürümü nedeniyle 2.7.1. İdeone.com (Python 2.7.3) üzerinde çalıştırırsanız düzgün çalışır. ideone.com/JsYNNK
avall

Şimdi güzel çalışıyor! +1
Gaurang Tandon

3

JavaScript - 114 karakter

y=(z=prompt)().split(' ');for(x=l=s=+y[0],c=d=1;--y[1];c+=l*=-x/++d,s+=l*=x/++d);z(s.toFixed(6)+'\n'+c.toFixed(6))

James'in harika cevabına dayanarak. Aynı algoritma, ilk adımda c = 1 ve s = x'in başlatılmasıyla kaçınıldı. Çıktı için dizi yerine 2 değişken kullanmak döngüyü basitleştirir.

Ungolfed

y = ( z = prompt)().split(' ');
for ( 
    x = l = s = +y[0], /* init to value x, note the plus sign to convert from string to number */
    c = d = 1;
    --y[1]; /* No loop variable, just decrement counter */
    c += (l *= -x / ++d), /* Change sign of multiplier on each loop */
    s += (l *= x / ++d) 
); /* for body is empty */
z(s.toFixed(6) + '\n' + c.toFixed(6))     

Minör yazım hatası: Yasadışı kodda olacaktı s += (l *= x / ++d)ve olmayacaktı s += (l* = x / ++d).
Gaurang Tandon

1
@GaurangTandon sabit
edc65

2

JavaScript (ECMAScript 6 Taslak) - 97 96 Karakter

Özyinelemeli bir çözüm:

f=(x,n,m=1,i=0,s=x,c=1)=>i<2*n?f(x,n,m*=-x*x/++i/++i,i,s+m*x/++i,c+m):[s,c].map(x=>x.toFixed(8))

Çıktı:

f(0.3,1)
["0.29550000", "0.95500000"]

f(0.3,24)
["0.29552021", "0.95533649"]

Bu yuvarlama ile ilgili spesifikasyonu karşılamıyor.
Martin Ender

@ m.buettner düzeltildi
MT0

1
Giriş formatını ve no functionsgereksinimini karşılamıyor.
avall

Lütfen cevabınızı güncelleyin. Söz konusu ayrıntılara bakın. Teşekkürler.
Gaurang Tandon

2

Cı, 114

Yorum yapmak için yetersiz itibar, ancak Squeamish Offisrage'ın C cevabına ek olarak , çift ve boşlukları kaldırmak için float kullanarak ve 'r' bildirimini ve başlamasını birleştirerek 7 bayt azaltma

float s,c,r=1,x;main(i,n){for(scanf("%f%d",&x,&n);i<n*2;s+=r,r*=-x/i++)c+=r,r*=x/i++;printf("%.8f\n%.8f\n",s,c);}

burada deneyin .


Programlama bulmacaları ve kod golf hoş geldiniz. Cevabınızı @ squeamishossifrage'ın (hala düzenlememde yanlış yazmayı başardım.) Küçük bir gelişme olduğunu kabul etmek için iyi yaptım. BTW, rdeklarasyonda başladığını fark ettim . floatGerekli hassasiyeti verip vermediğini test etmedim .
Level River St

@steveverrill Ben floatde gerekli hassasiyeti vereceğini düşünmedim , ama işe yarıyor :) Ve PPCG'ye hoş geldiniz, user2702245!
Gaurang Tandon

O zaman floatdeğişkenler ile yanlış cevaplar almak benim mi? İçin x=5ve n=3ben almak sin(x)=10.20833206ve cos(x)=14.54166412:-( (Intel Core Duo, eğer merak edildi)
alıngan ossifrage

Bunu söz konusu cevaba yapılan bir yoruma dönüştürmemi ister misiniz?
Kapı tokmağı

@Doorknob Şimdi de bırakabilir :-)
squeamish ossifrage

2

Bash tarafından yönlendirilen GNU bc, 128 bayt

Çok fazla bayt ondalık basamakları ve en yakın yuvarlamayı ayarlamak için harcadı. Ah, işte burada:

bc -l<<<"m=1000000
w=s=$1
c=1
for(p=2;p/2<$2;s+=w){w*=-1*$1/p++
c+=w
w*=$1/p++}
s+=((s>0)-.5)/m
c+=((c>0)-.5)/m
scale=6
s/1
c/1"

Çıktı:

$ ./trig.sh 5 3
10.208333
14.541667
./trig.sh 8,555 13
0,765431
-.641092
$ ./trig.sh 9,26 10
-3,154677
-8,404354
./trig.sh 6,54 12
0,253986
0,967147
$ ./trig.sh 5 1
5.000000
1.000000
20 $ / tr.sh 20 20
-5.364,411846
-10.898,499385
$ 

Linux komut satırı araçları, 97 unicode karakter

Unicode saldırı yanıtı OP'nin isteği üzerine kaldırıldı. İlgileniyorsanız düzenleme geçmişine bakın.


Soruyu gönderdikten sonra kuralları değiştirmeyi sevmiyorum, ancak Unicode karakterlerin kodu sıkıştırmak için kullanılabileceğini bilmediğim için kod sıkıştırma-izin veren-Unicode karakterlere izin vermedim. Artık yalnızca ASCII karakterleri kullanılabilir. Lütfen yayınınızı düzenleyin. Rahatsızlık için özür dilerim
Gaurang Tandon

@GaurangTandon Gerçekten sıkıştırma değil - unicode sürümü aslında daha fazla bayt (ancak daha az karakter) alır. Ama sizin görüşünüze katılıyorum - aslında puanlamanın kesinlikle bayt sayımı kullanılarak yapılmasını tercih ediyorum, ancak OP'nizdeki Çince karakterler hakkında biraz direnemedim.
Dijital Travma

Yasadışı üstel işleç kullanıyorsunuz
avall

@ avall Hata! Bu bana 4 byte mal oldu.
Dijital Travma

1

Yakut, 336

Muhtemelen burada en uzun olanı, ama eminim daha kısa yapılabilir :(

def f(n)
n==0 ? 1: 1.upto(n).inject(:*)
end
def p(x,y)
i=1
return 1 if y==0 
y.times {i *= x}
i
end
def s(x,n)
a = 0.0
for k in 0...n
a += p(-1,k) * p(x.to_f, 1+2*k)/f(1+2*k)
end
a.round(8)
end
def c(x,n)
a= 0.0
for k in 0...n
a +=p(-1,k) * p(x.to_f, 2*k)/f(2*k)
end
a.round(8)
end
x = gets.chomp
n = gets.chomp.to_i
puts s(x,n), c(x,n)

1

JavaScript (ES6) - 185 karakter

i=(h,n)=>n?h*i(h,n-1):1;q=x=>x?x*q(x-1):1;p=(a,j,n)=>{for(c=b=0,e=1;c++<n;j+=2,e=-e)b+=e*i(a,j)/q(j);return b.toFixed(6)}
_=(y=prompt)().split(" ");y(p(_[0],1,_[1])+"\n"+p(_[0],0,_[1]))

Bir işlev kullanır q , faktöryel için iüs için ve phem gerçekleştirmek için sinve cos. Jsbin.com'da çalıştırın. Herhangi bir değişiklik yapmadan formülü tam olarak kullanır.

EDIT : 8Ondalık basamakları 6ondalık basamaklara değiştirdi. 15 / Mayıs / 14

Kodlanmamış Kod :

/*Note that `name=args=>function_body` is the same as `function name(args){function_body} */

// factorial
function fact(x) {
    return x > 1 ? x * fact(x - 1) : 1
}

// Exponentiation
function expo(number, power){
    return power > 0 ? number * expo(number, power - 1) : 1;
}

function sin_and_cos(number, starter, terms) {
    for (count = sum = 0, negater = 1;
            count++ < terms;
            starter += 2, negater = -negater) 

        sum += (negater * expo(number, starter)) / fact(starter);

    // to 6-decimal places
    return sum.toFixed(6);
}

input = (out = prompt)().split(" ");

out(sin_and_cos(input[0], 1,input[1]) 
        + "\n" +                
        sin_and_cos(input[0], 0, input[1]));

1

JavaScript - 133 karakter

y=(z=prompt)().split(" "),s=[0,0],l=1;for(i=0;i<y[1]*2;i++){s[i%2]+=i%4>1?-1*l:l;l*=y[0]/(i+1)}z(s[1].toFixed(6));z(s[0].toFixed(6));

Ungolfed

var y = prompt().split(" ");

var out = [0,0]; // out[1] is sin(x), out[0] is cos(x)
var l = 1; // keep track of last term in series
for (var i=0; i < y[1] * 2; i++) {
    out[i % 2] += (i % 4 > 1) ? -1 * l : l;
    l *= y[0] / (i + 1);
}

prompt(out[1].toFixed(6));
prompt(out[0].toFixed(6));

Giriş, iki farklı iletişim kutusunda değil, boşlukla ayrılmış iki tamsayı olmalıdır. Lütfen düzeltin.
Gaurang Tandon

@GaurangTandon düzeltildi - işaret ettiğiniz için teşekkürler
James

1

Mathematica, 96 karakter

{{x,n}}=ImportString[InputString[],"Table"];Column@{Im@#,Re@#}&@Fold[1+I#x/#2&,1,2n-Range[2n-1]]

Giriş formatı nasıl görünüyor x,nbana göre?
Gaurang Tandon

@GaurangTandon Öyle x n.
alephalpha

Tamam, açıkladığın için teşekkürler.
Gaurang Tandon

1

Ruby - 160 152 140 Karakter

Özyineleme ve bu özyinelemeli uygulama için sin (x, 2n + 1) = 1 + cos (x, 2n - 1), günah (x, n) ve cos (x, n), çünkü cos için yukarıda tanımlanan dizi x ve günah x.

p=->x,n{n<1?1:x*p[x,n-1]}
f=->n{n<2?1:n*f[n-1]}
c=->x,n{n<1?1:p[x,n]/f[n]-c[x,n-2]}
x,n=gets.split.map &:to_f
n*=2
puts c[x,n-1]+1,c[x,n-2]

Düzenleme: Yorum yapanların katkıda bulunduğu (aşağıda okuyun).


1
Sen lambdas kullanarak karakterleri bir sürü kaydedebilirsiniz: p=->x,n{...}, f=->n{...}vb, sonra gibi onları aramak yerine parantez köşeli parantez kullanın p[x,n-1]. Ayrıca, collectsadece bir takma ad olduğunu düşünüyorum map, bu çok daha kısa ve sadece bir üye aramasını eşlediğiniz için bunu kısaltabilirsiniz gets.split.map &:to_f.
Martin Ender

@ MartinBüttner Teşekkürler! Bunu ekleyeceğim! (Umarım buradaki yorumunuz bu çözümün sadece benim değil, ortak çalışma olduğunu belirtti) Dürüst olmak gerekirse: Ayrıca
yakutta da yeniyim
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.