三角法を始めましょう!


20

前書き:

正弦x式によって与えられます。

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

余弦x式によって与えられます。

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

仕事:

との値を考えるxn、プログラム出力する(NO関数、等)の値を書き込むsin(x)cos(x)、正しい点で最大n上記式の条件を。xラジアン単位であると仮定します。

入力:

x n

10進数 x( 3桁まで)および整数n。入力は標準入力またはプロンプトダイアログボックスで行う必要があります(言語が標準入力をサポートしていない場合)

出力:

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

両方の値sin(x)とは、cos(x)小数点以下6桁に丸めなければなりません。場合sin(x)である0.5588558855(10桁)、それはに四捨五入する必要があります0.558856 6桁)にます。丸めは、このWiki記事の表の5番目の列「最も近い値に丸める」で説明されているように、最も近い値に行う必要があります。

制約:

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

サンプル:

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

ノート:

  1. 標準的な抜け穴は禁止されています。
  2. 組み込みの数学関数および三角法(sin、cos、tanなど)、階乗、および累乗の演算子は使用できません。あなたが自由に使用できます内蔵の計算の結果を推定する機能を丸めsin(x)し、cos(x) 6番目の小数点以下の桁に。
  3. 間違った入力を処理する必要はありません。
  4. プログラムで使用できるのはASCII文字のみで、コード圧縮を許可する中国語のUnicode文字は使用できません。
  5. プログラムは、入力から3秒以内に終了し、出力を表示する必要があります。
  6. あなたの答えは、コードの説明とともに、コードなしのコード(コードがあなたの言語、特にGolfScript、Jなどになじみのないプログラマーにすぐにわからない場合は必須)に付随する必要があります。
  7. プログラムをテストできるオンラインコンパイラへのリンクを含めてください。

得点:

空白、タブなどを含む文字のコード長が最も短い答えが勝ちです!受賞者は2014年5月21日に宣言されます。

編集:21/05/14 勝者はCJam言語を使用したaditsuです。準優勝はJ言語jpjacobsに続き、2位はPerl言語でprimoです。おめでとうございます!


(変更メモ:コメントは削除されます。必要な情報が失われた場合は、pingを送信してください。事前に警告した後、すべてが質問に
反映され

最初の段落では、「罪」ではなく「正弦」である必要があります
チャールズは、

である「最寄りのラウンドは」まだ要件、あるいは我々は、任意の組み込みの機能を丸め使用することができますか?たとえば、ゼロに向かって丸めますか?
デジタル外傷

mod 2pi入力をより速く収束させるための操作と同等のものを必要とするのはかなり便利です。これは、これらの関数を扱うときに現実の世界で使用される多くの改善の1つです。(実際にはpiを修正し、認識に署名します)。
フローリス

1
@Floris私はこれを知らなかった。さて、私たちは今何もできません。ルールはすでに大きく変更されています。そして、回答者をさらに困らせるためにルールを変更し続けたくありません。提案をありがとう!
ゴーランタンドン

回答:


6

CJam-42

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

http://cjam.aditsu.netでオンラインで試す

説明:

r入力からトークンを読み取り、変数
dにダブルに変換し
:X、変数X
;に値をポップし、スタックから値をポップし
1ます(最初の項)
_、1を
rコピーし、次のトークン(n)を読み取り、行列を転置します。 cos(x)の項とsin(x)の項を含む配列(「行列行」として)
i整数に変換するの
2*,1>{...}/は一種のループです1 N * 2:1 -
- 2*2によって乗算
- ,0から(前回値)に配列を行う-1
- 1>アレイ(0)の最初の項目を削除
- {...}/アレイ内の各項目のブロックを実行する
_「ループを複製変数は、」(レッツ・コール、それはK)
2%2*(-1/1に偶数/奇数の変換を:
- 2%(- > 0/1)モジュロ2
- 2*2を乗算( - > 0/2)
-(デクリメント(-> -1/1)が
*乗算されるため、1秒ごとに符号を変更する
/と、スタック上の用語がkまたは-kで除算されます。これは「/ k!」です 計算の一部と符号の変更
X*がXで乗算されます。これは計算の「X ^ k」部分です。シリーズの次の用語を取得
_し、次の反復
;(ループ後)で次の用語の計算に使用する用語を複製します。最後に複製した用語
]をポップし、配列のスタック上の用語を収集します
。 1 X -X ^ 2/2!-X ^ 3/3!X ^ 4/4!X ^ 5/5!...] cos(x)およびsin(x)に必要なすべての用語を正確に含み、インターリーブにより
2/この配列をペアに分割します
z
{...}/再び各配列項目(行列の行)のためのブロックが実行:
- :+要素を追加一緒にマトリクス行の
- 6mO6つの小数のラウンド
この時点で、我々は、スタック上の所望のcos(x)とSIN(X)を有する
pスタック(SIN(X))の最後の項目の表示を印刷する改行に続く
時プログラムの終了時に、スタックの残りの内容(cos(x))が自動的に印刷されます。


1
+1聞いたことがない言語を紹介してくれたため、おそらくおそらく使用しないでしょう。
アレックスA.

@Alexおかげで、CJamはステロイドに多少GolfScriptのようなものです
aditsu

質問を投稿した後にルールを変更するのは好きではありませんが、Unicode文字を使用してコードを圧縮できることを知らなかったため、code-compression-allowing-Uni​​code文字を禁止しました。現在はASCII文字のみを使用できます。投稿を編集してください。ご不便をおかけして申し訳ありません。
ゴーランタンドン

@GaurangTandon私もそれがあまり好きではありません。この問題で中国語の文字が他に使用される可能性があると思いましたか?とにかく、編集しました。
aditsu

18

Perl-72バイト

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

または、コマンドラインオプションをそれぞれ1バイトとして、70バイトでカウントします

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

または、Perl 5.8を63バイトで許可する場合:

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

しかし、なぜあなたは。

編集:新しいルールへの準拠。%fデフォルトでは6桁に丸められます。


アルゴリズム

sin(x)のテイラー級数を調べる:

各用語が連続するすべての用語を均等に分割していることがわかります。このため、かなり簡単にネストされた式に変換できます。

cos(x)は同様に変換しますが、先頭のxがなく、分母の項は1つ小さくなります。

さらに、このネストされた式は、逆再帰式として再定式化できます。

S = 0SIN(X)= X・S 1、使用されるどのような最終的です。


非ゴルフ

<> =~ 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);

サンプルの使用法

$ 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

これをオンラインでテストしたい場合は、compileonline.comを使用することをお勧めします。コードをにコピーして貼り付け、ボックスにmain.pl入力してからを貼り付けSTDINますExecute Script


2
入力を解析するためのどのような不正な方法...ソリューションでそれを使用できますか?:)
タル

@Talお気軽に。
プリモ

2
perl(および特にあなたのコード)は、「あなたの言語に馴染みのないプログラマにはすぐにはわかりません」と
見なされると思い

1
@aditsu Agreeed。よりクリーンなコードとアルゴリズムの説明を追加します。
プリモ

2
この答えは本当に教育的なものでした!
タル

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)

基本的に同じコード。私たちは2つのキャラクターを括弧を必要としないために保存しますprintが、4つを必要とすることから失いraw_inputます。

サンプル実行

ここで実行できます

>>>
20 20
-5364.411846
-10898.499385

コードの説明

主なアイデアは、の2*n項を計算しe^(ix)、虚数部と実数部を取り、項に近似するsinとのcos値を取得するnことです。テイラー級数の切り捨てを使用します。

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

これはi * xの多項式ですが、各項を合計して値を計算するのではなく、修正されたHornerの方法を使用してシーケンスを計算します(再帰的に逆に定義されます)

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

与える t_1、目的の値に等しくなります。

Python文字列フォーマット操作は、6桁の小数点以下を切り上げて表示する値を取得するために使用されます。

編集:新しい規則に従って6桁に丸めるように変更されました。他の変更は必要ありませんでした。


オンラインpy3インタープリターのideoneを試してください:)
ハリービードル

@BritishColourありがとう!投稿に追加しました。
xnor

回答を更新してください。問題の詳細を参照してください。ありがとう。
ゴーランタンドン

8

J 98 70 69 58

これはおそらくもっと派手な関数を使用してかなり短くすることができますが...コメントを歓迎します:

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

注2:EOF(Linuxではctrl-D)を受信すると、入力は終了します。編集:べき乗と階乗をより良い、よりJっぽい全体に結合します($ %&(*/) >:@i.@[ )。これは、yのx複製の配列と1からyまでの数字の配列を取得するために要約されます。それぞれを乗算し、結果を除算します。これは重複を取り除き*/ます。

algortihmsharkのおかげで、もう7文字オフです。

末尾の改行を削除するためのカットを削除しました。

フォークについて知ることが必須の長いバージョン。

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

オンラインのJインタプリタはありませんが、数年前からオープンソースです。次の手順でインストールは簡単です。

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

irc.freenode.orgの#jsoftwareには、Jボットもあります。

stdinは、ファイル、コマンドラインから実行された場合にのみ機能します。それ以外の場合は、aおよびbがコマンドラインで渡された数字に置き換えstdin ''られ'a b;'ます。


5
始まることが大好きですexit
デジタル外傷

回答を更新してください。問題の詳細を参照してください。ありがとう。
ゴーランタンドン

小数点以下6桁に更新されました。他に何かあれば、指定してください。ありがとう
jpjacobs

&from 0j6&":を削除して文字を保存できます。また、(i.@(,&_2)@{:($%&(*/)>:@i.@[)"0{.)書き換えることができ(($%&(*/)1+i.@[)"0~i.@,&_2)/、他の6のために
algorithmshark

このタスクはT.(n項テーラー級数による近似関数)を叫びますが、私はそれが標準的な抜け穴として冗長であると思います。
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

ゴルフをしていない:

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

最初の行は入力を読み取り、正規表現を使用してスペースを見つけます。これにより、$ `のスペースの前の値と$ 'のスペースの後の値が自動的に配置されます。

1からにループし2*n-1ます。$tループxはループのインデックスで繰り返し乗算および除算を繰り返します($_)でます。余弦が1に初期化されるため、ループは0ではなく1から始まります。これにより、ゼロによる除算を処理する必要がなくなりました。

更新後$t、三項演算子は、インデックスが奇数か偶数かに応じて$sineまたはのいずれかを返し$cosine、それに$t値を追加します。魔法の式$_&2?-$t:$tこの値を加算または減算するかどうかを判断します(基本的には、ビット単位のandインデックスと2を使用して、「加算、加算、減算、減算」の繰り返しシーケンスを生成します)。

compileonline.comでこのコードをテスト実行できます。


の出力を修正してください20 20
ゴーランタンドン

1
あなたのforループはから1..$n*2-1ではなく、から行く必要があると思います1..$n。私がここにいる間は、数値のコンテキストで評価されるように、$s初期化さundefれず0に完全に残っています。三項割り当てには括弧は必要ありません:$_&1?$s:$c+=$t。末尾の改行を追加した結果、"%.8f\n%.8f"に短縮でき"%.8f\n"x2ます。
プリモ

@Primoありがとう、私はそれらのいくつかについて知りませんでした。そして今では、正しい結果も生成します。
タル

@Tal私の喜び。また、わずかに優れたマジック:$t*(1-($_&2))=> $_&2?-$t:$t
primo

回答を更新してください。問題の詳細を参照してください。ありがとう。
ゴーランタンドン

5

FORTRAN:89 109 125 102 101 98バイト

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

私は暗黙的な型指定を乱用していますが、残念ながらそのような暗黙的な複合型は存在しないため、&&complexを指定する必要がありましたiGfortranは出力を小数点以下8桁で自然にカットするため、その仕様に満足しています。残念ながら、出力の元の方法がprint*,t仕様を満たしていなかったため、16文字を追加して虚数部と実数部を出力し、必要な小数点以下8桁を入力する必要がありました。

Venteroのおかげで、出力とループの間で23バイトを節約できました。そして、正しい答えとフォーマットされた出力を得るための別のキャラクター。そして、さらに3つの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

回答を更新してください。問題の詳細を参照してください。ありがとう!
ゴーランタンドン

1
@GaurangTandon:おそらく問題の詳細を変更するのをやめるべきです。
カイルKanos

私は知っています、そして、私はしたくありません、しかし、私はそれを助けることができません。実際、5つの回答をテストした後、ほとんどすべての回答で異なる結果が得られたことが判明しました(これはまったく疑いのないことです)。他のアプローチを採用することもできますが、その場合は現在の回答のアルゴリズムを完全に変更する必要があります。これは私が理解できる最高のものです。
ゴーランタンドン

2
まあ私は私のものが完全に動作することを知っているので、私は完全にチェックを取得する必要があります:D;)
カイルカノス

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

バイトを保存するために、サイン値を更新するステートメントが for()ステートメントステートメント、実際にはコサイン値を更新する閉じ括弧に続くステートメントの後に実行されます。(プログラムの出力から最後の改行文字を削除することで、さらに数バイト節約できると思います。)

グローバル変数はscrおよびx暗黙的にゼロに初期化され、iコマンドライン上に提供引数が指定されていない限り、1の値を持つことになります。残念ながら、printf()デフォルトでは小数点以下6桁です。そのため、出力形式は少し冗長です。

ゴルフをしていない:

処理の順序を少し明確にするために、少し並べ替えたコードを次に示します。

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

サンプル出力:

$ echo 1.23 4 | ./sincos
0.94247129
0.33410995

オンラインで試してください:

http://ideone.com/URZWwo


3

Python> = 2.7.3、 186 184 211 200 182 170文字

地獄のような単純な。サインとコサインに対してパラメーター化された質問の式を使用します。

オンライン通訳が見つかります ここに ここに

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

編集:すべての制限付きの有効なバージョン

Edit2:round Python 2.7.1の無効な関数出力のため、オンラインインタープリターをideone.comに変更しました

Edit3:不必要なインラインラムダを使用し、丸めを文字列形式に変更したことが判明しました(xnorから盗まれました:))

Edit4:join機能しないメインforループに置き換えられました


こんにちは、私は最近、指数の組み込み演算子を許可しないルールを編集しました(それが**私がしていることです)。だから、答えを編集する必要があると思います。ご不便をおかけして申し訳ありません。私が間違っている場合は修正してください。
ゴーランタンドン

1
xnorの答えでは、さらなる変更は役に立たないと思います:)
avall

@availオン20 20、私は出力を取得します-5364.4118142500001。小数点以下8桁に修正したい場合があります。
ゴーランタンドン

repl.it Pythonバージョンが原因です2.7.1。ideone.com(Python 2.7.3)で実行すると、正常に機能します。ideone.com/JsYNNK
avall

今ではうまくいきます!+1
ゴーランタンドン

3

JavaScript-114文字

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

ジェームズの素晴らしい答えに基づいています。同じアルゴリズム、c = 1およびs = xの初期化で回避される最初のステップ。出力に配列ではなく2つの変数を使用すると、ループが簡単になります。

非ゴルフ

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

ちょっとした誤植: s += (l *= x / ++d)s += (l* = x / ++d)修正されていないコードではありません。
ゴーランタンドン

1
@GaurangTandon修正
edc65

2

JavaScript(ECMAScript 6ドラフト)-97 96文字

再帰的な解決策:

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

出力:

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

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

ただし、これは丸めに関する仕様を満たしていません。
マーティンエンダー

@ m.buettnerは固定
MT0

1
入力形式とno functions要件を満たしていません。
avall

回答を更新してください。問題の詳細を参照してください。ありがとう。
ゴーランタンドン

2

C、114

コメントするには評判が不十分ですが、Squeamish OffisrageのCの回答はさらに不十分です、doubleにfloatを使用してスペースを削除し、 'r'の宣言とinitを組み合わせると7バイト削減されます

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

ここで試してください


プログラミングパズルとコードゴルフへようこそ。あなたの答えは@squeamishossifrageのマイナーな改善であることを認めてくれました(私は編集でスペルを間違えていました。)答えは "above"を参照しないことをお勧めします。ところで、私rは宣言の初期化に気づきました。float必要な精度が得られるかどうかをテストしていません。
レベルリバーセント

@steveverrillどちらもfloat必要な精度を与えるとは思いませんでしたが、動作します:)そして、PPCG、user2702245へようこそ!
ゴーランタンドン

float変数で間違った答えを得ているのは私だけですか?以下のためにx=5n=3、私が手にsin(x)=10.20833206してcos(x)=14.54166412(あなたが思っていた場合、インテルCore Duoプロセッサ、):-(
うるさいossifrage

これを上記の回答のコメントに変換しますか?
ドアノブ

@Doorknob同様に今すぐお任せください:-)
squeamish ossifrage

2

GNU bc、bashにより駆動、128バイト

あまりにも多くのバイトが小数点以下の桁数を設定し、最も近い丸めを行いました。まあ、とにかくここにあります:

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"

出力:

$ ./trig.sh 5 3
10.208333
14.541667
$ ./trig.sh 8.555 13
.765431
-.641092
$ ./trig.sh 9.26 10
-3.154677
-8.404354
$ ./trig.sh 6.54 12
.253986
.967147
$ ./trig.sh 5 1
5.000000
1.000000
$ ./trig.sh 20 20
-5364.411846
-10898.499385
$ 

Linuxコマンドラインツール、97個のUnicode文字

ユニコードハックの回答はOPのリクエストで削除されました。興味があれば、編集履歴を見てください。


質問を投稿した後にルールを変更するのは好きではありませんが、Unicode文字を使用してコードを圧縮できることを知らなかったため、code-compression-allowing-Uni​​code文字を禁止しました。現在はASCII文字のみを使用できます。投稿を編集してください。ご不便をおかけして申し訳ありません
ガランタンドン

@GaurangTandon実際には圧縮ではありません-Unicodeバージョンは実際にはより多くのバイトを使用します(ただし、文字数は少なくなります)。しかし、私はあなたの感情に同意します-私は実際にバイトカウントを使用して厳密に行われることをスコアリングすることを好みますが、OPの中国語文字に関するビットに抵抗することはできませんでした。
デジタル外傷

あなたは違法指数演算子を使用
avall

@avallおっと。それには4バイトかかりました。
デジタル外傷

1

ルビー、336

おそらくここで最も長いものですが、もっと短くすることができると確信しています:(

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

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

関数を使用してq、階乗のためのi累乗のため、とpの両方を行うためにsincos。jsbin.comで実行します。変更せずに数式を正確に使用します。

編集8小数点以下の桁を6小数点以下の桁に変更しました。5月15日/ 14

未ゴルフコード

/*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文字

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

非ゴルフ

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

入力は、2つの異なるダイアログボックスではなく、スペースで区切られた2つの整数である必要があります。それを修正してください。
ゴーランタンドン

@GaurangTandon修正-指摘してくれてありがとう
ジェームズ


1

ルビー- 160 152 140文字

再帰を使用し、この再帰的実装ではsin(x、2n + 1)= 1 + cos(x、2n-1)であり、sin(x、n)およびcos(x、n)がcosについて上記で定義されたシリーズであることxおよびsin 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]

編集:コメント投稿者による寄稿(下記を参照)。


1
ラムダを使用することで多くの文字を保存できます:p=->x,n{...}f=->n{...}など、それらを呼び出すために括弧の代わりに角括弧を使用しますp[x,n-1]。また、のcollect単なるエイリアスでありmap、これははるかに短いと思います。メンバー呼び出しのみをマッピングしているため、これをに短縮できますgets.split.map &:to_f
マーティンエンダー

@MartinBüttnerありがとう!これを追加します!(ここであなたのコメントがこのソリューションが私のものであるだけでなくコラボであると述べたことを願っています)正直に言うと:私もrubyが初めてです(2か月のみ):)))
ボリエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.