삼각법을 시작하자!


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

태스크:

x및 의 값이 주어지면 위의 수식 n값을 출력 sin(x)하고 cos(x)수정 하는 프로그램 (함수 등 없음)을 작성 하십시오 n. 그것이 x라디안 이라고 가정하십시오 .

입력:

x n

진수의 수 x(최대 개까지 3 소수 자릿수) 및 정수 n. 입력이 stdin 또는 프롬프트 대화 상자에 있어야합니다 (언어가 stdin을 지원하지 않는 경우)

산출:

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

양의 값 sin(x)cos(x)6 소수점 반올림되어야한다. 경우 sin(x)이다 0.5588558855(10 진수), 그것을 반올림한다 0.558856(6 십진수). 반올림은 이 Wiki 기사 의 표에서 다섯 번째 열인 "가장 가까운 반올림"에 설명 된대로 가장 가까운 반올림해야합니다 .

제약 사항 :

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 번째 10 진수 를 추정 할 수 있습니다 .
  3. 잘못된 입력을 처리 할 필요가 없습니다.
  4. 코드 압축을 허용하는 중국어 유니 코드 문자가 아닌 ASCII 문자 만 프로그램에서 사용할 수 있습니다.
  5. 입력 후 3 초 이내에 프로그램이 종료되고 출력이 표시되어야합니다.
  6. 코드에 대한 설명과 함께 코드가없는 코드와 함께 답이 있어야합니다 (코드가 익숙하지 않은 언어, 특히 GolfScript, J 등의 프로그래머에게 즉시 명확하지 않은 경우 필수).
  7. 프로그램을 테스트 할 수있는 온라인 컴파일러에 대한 링크를 포함하십시오.

채점 :

공백, 탭 등을 포함하여 문자 길이가 가장 낮은 답이 승리합니다! 우승자는 2014 년 5 월 21 일에 선언됩니다.

편집 : 21/05/14 수상자는 CJam 언어를 사용하는 aditsu입니다 . 준우승 은 J 언어로 jpjacobs를 따르고 , 준우승은 Perl 언어를 가진 프리모입니다 . 모두 축하합니다!


(MOD 노트 : 코멘트 핵 공격이 될 가능성이있는 손실 된 정보 나 핑주세요 외모를 사전에 내 경고 후, 모든하지만 질문에 그것의 방법을 만들어처럼..)
손잡이

첫 번째 단락에서, 그것은 "죄"가 아닌 "사인"이어야합니다
Charles가 아닙니다

"가장 가까운에 라운드" 아직은 요구 사항, 또는 우리는 어떤 내장 된 시설 라운딩 사용할 수 있습니까? 예를 들어 0으로 반올림합니까?
Digital Trauma

mod 2pi입력을 더 빨리 수렴시키기 위해 연산 과 동등한 기능을 요구하는 것은 다소 유용 할 것입니다. 실제 기능이 이러한 기능을 처리 할 때 사용하는 많은 개선 중 하나입니다. (실제로 mod pi 및 부호 인식).
Floris

1
@ 플로리스 나는 이것을 전혀 몰랐다. 글쎄, 우리는 지금 아무것도 할 수없고, 규칙은 이미 많이 바뀌었고, 나는 응답자들을 더 화나게하기 위해 규칙을 계속 바꾸고 싶지 않습니다. 그래도 제안 주셔서 감사합니다!
Gaurang Tandon

답변:


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 (첫 번째 항)
_1 중복
r다음 토큰 (N 개의) 판독하여
i정수로 변환을
2*,1>{...}/루프의 종류 내지 1 * N 2 - 1
- 2*곱 (2)에 의한
- ,-1 (전회 값)이 0에서 배열한다
- 1>배열의 첫 번째 항목을 제거 (0)
- {...}/배열의 각 항목에 대한 블록 실행
_은 "루프 중복 변수 "(k라고합시다)
2%2*(는 짝수 / 홀수에서 -1/1로 변환합니다 :
- 2%모듈로 2 (-> 0/1)
-2를 2*곱하여 (-> 0/2)
-(감소 (-> -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"행렬 행"이
{...}/다시 각 배열 항목 (행렬 행)에 대한 블록을 실행 하므로 행렬을 전치하여 cos (x)에 대한 항을 갖는 배열과 sin (x)에 대한 항을 가진 배열을 만듭니다
.- :+요소를 추가합니다. 행렬 행의 함께
- 6mO소수점 6 자리로 반올림
이 시점에서 스택에 원하는 cos (x) 및 sin (x)가 스택
p의 마지막 항목 표시 (sin (x))와 줄 바꿈
At를 표시합니다. 프로그램이 끝나면 스택의 나머지 내용 (cos (x))이 자동으로 인쇄됩니다.


1
내가 들어 본 적이없고 사용하지 않을 언어를 소개해 준 +1
Alex A.

@ 알렉스 덕분에, CJam 다소 GolfScript 같은 스테로이드에
aditsu

질문을 게시 한 후 규칙을 변경하는 것을 좋아하지 않지만 유니 코드 문자가 코드를 압축하는 데 사용될 수 있다는 것을 알지 못했기 때문에 코드 압축 허용 유니 코드 문자를 허용하지 않았습니다. ASCII 문자 만 사용할 수 있습니다. 게시물을 수정하십시오. 불편을 드려 죄송합니다.
Gaurang Tandon

@GaurangTandon 나도 그다지 좋아하지 않습니다. 이 문제에서 한자를 사용할 수 있다고 생각한 것은 무엇입니까? 어쨌든 편집했습니다.
aditsu

18

펄-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)에 대한 Taylor 시리즈 검사 :

각 항은 모든 연속적인 항을 균등하게 나눈다는 것을 알 수 있습니다. 이 때문에, 그것은 쉽게 쉽게 중첩 된 표현으로 변형 될 수 있습니다 :

cos (x) 는 선행 x 및 분모가 1 더 작지 않은 방식으로 유사하게 변환 됩니다.

또한이 중첩 된 표현식은 역방향 재귀 표현식으로 재구성 될 수 있습니다.

S = 0죄 (X) = X · s의 하나를 사용되는지 궁극적이다.


언 골프

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

@Tal 자유롭게 느끼십시오.
primo

2
나는 펄 (특히 당신의 코드)이 "언어에 익숙하지 않은 프로그래머에게는 명백하지 않다"고 생각한다
aditsu

1
@aditsu 동의합니다. 더 깨끗한 코드와 알고리즘에 대한 설명을 추가하겠습니다.
primo

2
이 답변은 정말 교육적이었습니다!
Tal

10

파이썬 3 (102) / 파이썬 2 (104)

파이썬 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))

파이썬 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)

기본적으로 동일한 코드입니다. 우리는 parens를 필요로하지 않기 때문에 2 개의 문자를 저장 print하지만 4를 필요로 하지 않습니다 raw_input.

샘플 런

여기서 실행할 수 있습니다 .

>>>
20 20
-5364.411846
-10898.499385

코드 설명

주요 아이디어는 계산하는 것이다 2*n측면을 e^(ix)하고 얻을 수있는 가상 및 실제 참여 sin하고 cos근사 값 n조건을. 우리는 Taylor 시리즈의 잘림을 사용합니다.

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

이것은 i * x에서 다항식이지만 각 항을 합산하여 값을 계산하는 대신 수정 된 Horner 's Method 를 사용하여 시퀀스를 계산합니다 (반복적으로 반대로 정의 됨)

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

제공되는 t_1원하는 값을 같게.

파이썬 문자열 형식화 연산은 값을 6 자리로 반올림하여 표시하는 데 사용됩니다.

편집 : 새 규칙에 따라 6 자리로 반올림되었습니다. 다른 변경은 필요하지 않았습니다.


시도 ideone을 : 온라인 py3의 통역사
해리 교구에게

@BritishColour 감사합니다! 게시물에 추가했습니다.
xnor

답변을 업데이트하십시오. 해당 세부 사항을 참조하십시오. 감사.
Gaurang Tandon

8

J 98 70 69 58

이것은 아마도 더 멋진 기능을 사용하여 상당히 단축 될 수 있지만 의견은 환영합니다.

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

참고 2 : EOF를 수신하면 입력이 종료됩니다 (Linux의 경우 Ctrl-D). 편집 : 지수 및 계승을 더 좋고 더 J-ish 전체로 결합하십시오 ($ %&(*/) >:@i.@[ ). 이것은 y의 x 복제 배열과 1에서 y까지의 숫자 배열을 가져옵니다. 각각을 곱하고 결과를 나눕니다. 이것은 중복을 제거합니다 */.

또 다른 7 명의 캐릭터 인 algortihmshark 덕분에.

후행 줄 바꿈을 제거하기위한 컷을 제거했습니다.

포크에 대해 아는 것이 더 긴 버전입니다.

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;'A와 B가 명령 줄에 전달되었을 수있는 곳.


5
나는 그것이 시작되는 것을 좋아합니다exit
Digital Trauma

답변을 업데이트하십시오. 해당 세부 사항을 참조하십시오. 감사.
Gaurang Tandon

소수점 이하 6 자리로 업데이트되었습니다. 다른 것이 있으면 지정하십시오. 감사합니다
jpjacobs

&from 0j6&":을 제거하여 문자를 저장할 수 있습니다 . 또한 다른 6 (i.@(,&_2)@{:($%&(*/)>:@i.@[)"0{.)(($%&(*/)1+i.@[)"0~i.@,&_2)/
algorithmshark

이 작업은 비명을 지르지 만 T.(n-term Taylor 시리즈의 대략적인 기능), 표준 허점이라고 생각합니다.
FUZxxl

6

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에서 시작하여 0으로 나누는 것을 막았습니다.

업데이트 한 후 $t상기의 삼중 연산자 리턴하거나 $sine또는 $cosine인덱스가 홀수 또는 짝수이며, 추가의 여부에 따라 $t그것의 값. 매직 공식은 $_&2?-$t:$t이 값을 더하거나 뺄 지의 여부를 계산합니다 (기본적으로 인덱스를 사용하여 비트 단위를 사용하고 "add, 더하기, 빼기, 빼기"의 반복 시퀀스를 생성하기 위해 2).

compileonline.com 에서이 코드를 테스트 실행할 수 있습니다 .


에 대한 출력을 수정하십시오 20 20.
Gaurang Tandon

1
귀하의 for 루프가에서 1..$n*2-1대신 가야한다고 생각합니다 1..$n. 내가 여기있는 동안 ... 숫자 문맥에서 평가할 때 $s초기화되지 않은 상태로 완벽하게 유지 됩니다. 3 차 과제는 괄호가 필요하지 않습니다 : . 후행 줄 바꿈을 추가하면을 단축 할 수 있습니다 . undef0$_&1?$s:$c+=$t"%.8f\n%.8f""%.8f\n"x2
primo

@ 프리모 감사합니다, 나는 그 중 일부에 대해 몰랐습니다. 그리고 이제는 올바른 결과도 생성합니다.
Tal

@Tal 나의 기쁨. 또한 약간 더 좋은 마술 : $t*(1-($_&2))=> $_&2?-$t:$t.
primo

답변을 업데이트하십시오. 해당 세부 사항을 참조하십시오. 감사.
Gaurang Tandon

5

포트란 : 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를 지정해야했습니다 i. Gfortran은 자연스럽게 소수점 이하 8 자리의 출력을 차단하므로 해당 사양에 적합합니다. 불행히도, 원래의 출력 방법은 print*,t사양을 충족하지 않았으므로 가상의 실제 구성 요소를 출력하고 필요한 소수점 이하 8 자리를 16 문자로 추가해야했습니다.

Ventero 덕분에 출력과 루프 사이에 23 바이트를 절약 할 수있었습니다. 그리고 또 다른 캐릭터는 정답과 형식화 된 결과를 얻습니다. 그리고 read성명서 에 3 더 .

언 롤링,

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

답변을 업데이트하십시오. 해당 세부 사항을 참조하십시오. 감사!
Gaurang Tandon

1
@GaurangTandon : 문제의 세부 사항 변경을 중단해야 할 것입니다.
Kyle Kanos

알고 있고 싶지는 않지만 도울 수는 없습니다. 실제로 5 가지 답변을 테스트 한 결과 거의 모든 결과가 다른 결과를 낳는 것으로 나타났습니다 (실제로 완전히 의심되지 않았습니다). 다른 접근법을 따를 수 있었지만 현재 답변의 알고리즘을 완전히 변경해야했습니다. 이것은 내가 알아낼 수있는 최선입니다.
Gaurang Tandon

2
글쎄, 나는 내 것이 완벽하게 작동한다는 것을 알고 있으므로 완전히 확인 해야합니다 : 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);}

바이트를 저장하기 위해 사인 값을 업데이트하는 for()명령문 은 명령문 내에 배치 되지만 실제로 코사인 값을 업데이트하는 닫는 괄호 뒤에 나오는 명령문 다음에 실행됩니다. (프로그램 출력에서 ​​마지막 줄 바꿈 문자를 제거하여 몇 바이트를 더 절약 할 수 있다고 생각합니다.)

글로벌 변수는 s, c, r그리고 x암시 적으로 0으로 초기화하고, 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

파이썬> = 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루프 로 교체


안녕하세요, 최근에 내장 연산자가 지수화를 허용하지 않는 규칙을 편집했습니다 (즉 **, 내가 생각하는 것입니다). 따라서 답변을 수정해야한다고 생각합니다. 불편을 드려 죄송합니다. 내가 틀렸다면 정정 해주세요.
Gaurang Tandon

1
xnor의 답변으로 는 추가 수정이 쓸모 없다고 생각합니다. :)
avall

@avail On 20 20, 나는 출력을 얻는다 -5364.4118142500001. 소수점 이하 8 자리로 수정하고 싶을 수도 있습니다.
Gaurang Tandon

repl.it Python 버전 때문입니다 2.7.1. ideone.com (Python 2.7.3)에서 실행하면 제대로 작동합니다. ideone.com/JsYNNK
avall

지금은 잘 작동합니다! +1
Gaurang Tandon

3

자바 스크립트-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))     

사소한 오타 : ungolfed 코드에 있을 수도 s += (l *= x / ++d)있고 그렇지 않을 s += (l* = x / ++d)수도 있습니다.
Gaurang Tandon

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

답변을 업데이트하십시오. 해당 세부 사항을 참조하십시오. 감사.
Gaurang Tandon

2

C, 114

언급 할 평판이 충분하지 않지만 Squeamish Offisrage 's C answer , double을 제거하고 공백을 제거하기 위해 float를 사용하여 7 바이트 감소 및 'r'의 선언과 초기화를 결합하여 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의 사소한 개선이라는 점을 인정했습니다. (여전히 편집에서 철자를 잘못 입력했습니다.) 편집이있을 때마다 순서가 변경되므로 "위의"답을 언급하지 않는 것이 가장 좋습니다. BTW, r선언에서 초기화가 나타났습니다 . float필요한 정밀도를 제공 하는지 테스트하지 않았습니다 .
Level River St

@steveverrill 나도 float필요한 정밀도를 줄 것이라고 생각하지는 않았지만 작동합니다. :) PPCG에 오신 것을 환영합니다. user2702245!
Gaurang Tandon

그렇다면 float변수에 대한 잘못된 대답을 얻는 것이 저 입니까? 들어 x=5n=3, 내가 얻을 sin(x)=10.20833206cos(x)=14.54166412:-( (인텔 코어 듀오는 경우에 당신이 궁금해)
점잔 빼는 ossifrage

이 답변에 대한 의견으로 이것을 변환하겠습니까?
Doorknob

@Doorknob 5
51 초

2

bash로 구동되는 GNU bc, 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 개의 유니 코드 문자

OP의 요청에 따라 유니 코드 해킹 응답이 제거되었습니다. 관심이 있다면 편집 기록을보십시오.


질문을 게시 한 후 규칙을 변경하는 것을 좋아하지 않지만 유니 코드 문자가 코드를 압축하는 데 사용될 수 있다는 것을 알지 못했기 때문에 코드 압축 허용 유니 코드 문자를 허용하지 않았습니다. ASCII 문자 만 사용할 수 있습니다. 게시물을 수정하십시오. 불편을 끼쳐 드려 죄송합니다
Gaurang Tandon

@GaurangTandon 실제로 압축되지는 않습니다. 유니 코드 버전은 실제로 더 많은 바이트를 사용하지만 더 적은 문자를 사용합니다. 그러나 나는 당신의 감정에 동의합니다-나는 실제로 바이트 수를 사용하여 점수를 매기는 것을 선호하지만 OP의 한자에 대해서는 조금 견딜 수 없었습니다.
Digital Trauma

불법 지수 연산자를 사용하십시오
avall

@avall 죄송합니다. 그 비용은 4 바이트였습니다.
Digital Trauma

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

자바 스크립트 (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모두를 수행 sin하고 cos. jsbin.com에서 실행하십시오. 수정없이 공식을 정확하게 사용합니다.

편집 : 8소수점 이하 자릿수로 변경했습니다 6. 15/5/14

Ungolfed Code :

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

자바 스크립트-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));

입력은 두 개의 다른 대화 상자가 아닌 두 개의 공백으로 구분 된 정수 여야합니다. 고쳐주세요.
Gaurang Tandon

@GaurangTandon 고정-지적 해 주셔서 감사합니다
James


1

루비- 160 152 140 자

재귀와이 재귀 구현의 경우 sin (x, 2n + 1) = 1 + cos (x, 2n-1), sin (x, n) 및 cos (x, n)이므로 cos에 대해 위에서 정의한 시리즈 x와 죄 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
lambdas : p=->x,n{...}등 을 사용하여 많은 문자를 저장 한 f=->n{...}다음 괄호 대신 대괄호를 사용하여 다음과 같이 호출 할 수 p[x,n-1]있습니다. 또한 collect의 별칭 map일 뿐이며 훨씬 짧으며 멤버 호출 만 매핑하기 때문에로 단축 할 수 있습니다 gets.split.map &:to_f.
Martin Ender 2019

@ MartinBüttner 감사합니다! 이것을 추가합니다! (솔직히 말해서 : 나는 또한 루비에 익숙하지 않다 (2 개월 만) :))
Boriel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.