아래 규칙에 따라 파이의 처음 500 자리를 계산하는 프로그램을 작성하세요.
- 길이는 500 자 미만이어야합니다.
- “pi”, “math.pi”또는 유사한 pi 상수를 포함 할 수 없으며 pi를 계산하기 위해 라이브러리 함수를 호출 할 수 없습니다.
- 숫자 “3”, “1”, “4”를 연속해서 사용할 수 없습니다.
- 최신 컴퓨터에서 적절한 시간 (1 분 미만) 내에 실행되어야합니다.
최단 프로그램이 이깁니다.
댓글
- 숫자가 올바른지 확인하려면 : eveandersson.com/pi/digits
- 처음 500 자리 이후에는 정확도가 떨어지면서 500 자리 이상을 인쇄 할 수 있나요?
- @Alexandru, I 그렇게 가정하지만 잘린 상태로보고 싶습니다.
- HTTP 라이브러리를 사용하여 ” pi 숫자 ” 웹 사이트? 😉
- 파이썬에서 파이의 임의의 길이 근사값을 생성하기 위해 멋지고 간결한 무언가를 얻기를 바라면서 여기에 왔습니다 … 안타깝게도 @Soulman ‘의 파이썬 솔루션은 분명히 500 자리로 조정되었습니다. 500을 1000으로 바꾸면 오답이됩니다. 임의의 수의 자릿수를 생성하는 데 일반적으로 유용한 멋진 짧은 함수를 생성하는 대체 과제를 표현하는 좋은 방법이 있는지 궁금합니다.
Answer
골프 스크립트-29 자
6666,-2%{2+.2/@*\/9)499?2*+}*
나중에 분석 게시
댓글
- 이게 어떻게 작동하는지 설명해 주 시겠어요?
- ” 나중에 분석을 게시하겠습니다. “. (3 년 동안 대기) ….
- ” 나중에 분석 게시 ” * 더 많은 것을 기다립니다. 6 년 이상 *
- ” 나중에 분석 게시 ” (8 년 대기)
- 아직 대기 중 …
답변
Mathematica (34 자) : ( 속임수제외) 삼각 함수 포함)
N[2Integrate[[1-x^2]^.5,-1,1],500]
여기에서 마법을 설명해보세요.
Integrate[function, lower, upper]
는 “하단”에서 “상단”까지 “기능”곡선 아래 영역을 제공합니다. 이 경우 해당 함수는 [1-x^2]^.5
입니다. 이는 반지름이 1 인 원의 상단 절반을 설명하는 공식입니다. 원의 반지름이 1이기 때문에 x의 값은 -1보다 낮거나 1보다 높습니다. 따라서 우리는 원의 절반 면적을 찾습니다. 2를 곱하면 반지름이 1 인 원의 내부 면적이 파이와 같습니다.
댓글
- 아마 여러분 답변에 왜 이것이 작동하는지에 대한 설명을 삽입해야합니다 (수학이 아닌 사람들을 위해).
- 멋진 아이디어. 나는 지금 그것을 볼 것이다. ‘ 관련된 수학에 대한 기본 설명을 제공합니다.
- 줄일 수 있습니다.
sqrt[1-x^2]
를(1-x^2)^.5)
- 2 뒤에 *를 제거 할 수 있습니다. Mathematica는 훌륭합니다.
Answer
Python (83 자)
P=0 B=10**500 i=1666 while i:d=2*i+1;P=(P*i%B+(P*i/B+3*i)%d*B)/d;i-=1 print"3.%d"%P
답변
Husk , 28 25 24 바이트
i*!500İ⁰ΣG*2mṠ/o!İ1→ḣ□70
다음을 사용하여 pi 값을 유리수로 계산합니다. 무한 급수 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
의 처음 5000 개 항을 추출한 다음 처음 500 자리를 추출합니다.
지정된 항 수에서 pi 값을 계산하는 코드 13 바이트에 불과합니다 (ΣG*2mṠ/o!İ1→ḣ
) :
ΣG*2mṠ/o!İ1→ḣ Σ # the sum of G*2 # the cumulative product, starting at 2, of m # mapping the following function to all terms of ḣ # series from 1 to ... (whatever number is specified) Ṡ/ # divide by x o! → # element at index -1 İ1 # of series of odd numbers
안타깝게도 숫자를 지정하려면 3 바이트를 낭비해야합니다. 사용할 용어 :
□70 # 70^2 = 4900
그리고 유리수 (분수로 표시)를 10 진수 형식의 숫자로 변환하는 8 바이트 더 :
i*!500İ⁰ i # integer value of * # multiplying by !500 # 500th element of İ⁰ # series of powers of 10
답변
PARI / GP, 14
\p500 acos(-1)
두 번째 줄은
gamma(.5)^2
또는
(6*zeta(2))^.5
또는
psi(3/4)-psi(1/4)
또는
4*intnum(x=0,1,(1-x^2)^.5)
또는
sumalt(k=2,(-1)^k/(2*k-3))*4
답변
Python3 136
Madhava 사용 수식.
from decimal import * D=Decimal getcontext().prec=600 p=D(3).sqrt()*sum(D(2-k%2*4)/3**k/(2*k+1)for k in range(1100)) print(str(p)[:502])
Python3 164
사용 this 수식입니다.
from decimal import * D=Decimal getcontext().prec=600 p=sum(D(1)/16**k*(D(4)/(8*k+1)-D(2)/(8*k+4)-D(1)/(8*k+5)-D(1)/(8*k+6))for k in range(411)) print(str(p)[:502])
답변
답변
Pyth , 21
u+/*GHhyHy^T500r^3T1Z
이 알고리즘을 사용합니다. pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
는 Golfscript 답변의 댓글에 있습니다.
댓글 h3>
- 이것은 ‘ 반표를받을 자격이 없습니다 …
- 이 답변은 정확하지 않으며 34247779를 생성합니다. .. 내가 아는 한 파이가 아닙니다.
- @orlp 최근에
r
작업이 변경되어이 답변을 깨뜨 렸습니다. 1
를 0
로 변경하면 현재 Pyth에서 작동합니다.
r
작업이 변경되어이 답변을 깨뜨 렸습니다. 1
를 0
로 변경하면 현재 Pyth에서 작동합니다. 답변
자바 스크립트, 60 바이트
i=1n;p=x=3n*(10n**520n);while(x=x*i/(i*4n+4n)){i+=2n;p+=x/i}
댓글
- 62 바이트 :
for(i=1n,p=x=3n*(10n**520n);x>0;x=x*i/(i*4n+4n),p+=x/(i+=2n));
답변
bc -l (22 = 5 명령 줄 + 17 프로그램)
scale=500 4*a(1)
댓글
- 규칙에 따르면 ” 또는 라이브러리 함수를 호출 할 수 없습니다. pi를 계산합니다. ”
- @Peter 제가 생각하는 문제는 ” 라이브러리 함수 “는 항상 잘 정의 된 용어는 아니며 Pi를 계산하기 위해 “라고 말할 때만 악화됩니다 “, 중간 결과를 계산하는 데 사용할 수 있습니다. 예를 들어 Alexandru
의 대답입니다.
- atan이 1/4 파이를 계산하기 때문에 속임수라고 생각하지만 그럼에도 불구하고 흥미로운 솔루션입니다.
- @Thomas O : 이것이 속임수라면, ‘ 제한은 어디입니까?
- 이러한 답변 때문에 트리거 기능을 금지해야합니다. 아이디어는 내장 함수가 아닌 알고리즘으로 파이를 계산 하는 것입니다. sqrt는 삼각 함수가 아니므로 ‘ 약간 다릅니다.
Answer
Mathematica-50
½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½]
답변
Java 10 , 208 207 206 193 바이트
n->{var t=java.math.BigInteger.TEN.pow(503).shiftLeft(1);var p=t;for(int i=1;t.compareTo(t.ZERO)>0;p=p.add(t=t.multiply(t.valueOf(i)).divide(t.valueOf(i-~i++))));return(p+"").substring(0,500);}
@ceilingcat 덕분에 14 바이트.
또는 전체 프로그램 (245 바이트) :
interface M{static void main(String[]a){var t=java.math.BigInteger.TEN;var p=t=t.pow(503).shiftLeft(1);for(int i=1;t.compareTo(t.ZERO)>0;p=p.add(t))t=t.multiply(t.valueOf(i)).divide(t.valueOf(i-~i++));System.out.print((p+"").substring(0,500));}}
답변
Axiom, 80 바이트
digits(503);v:=1./sqrt(3);6*reduce(+,[(-1)^k*v^(2*k+1)/(2*k+1)for k in 0..2000])
참조 용 https://tuts4you.com/download.php?view.452 ; 6 * arctg (1 / sqrt (3)) = % pi에 대한 평가가되고 arctg에 대해 세리 확장을 사용합니다.
3.1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 592307816 4 0628620899 8628034825 3421170679 8214808651 3282306647 0938446095 505822317 2 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196 442881097 5 6659334461 2847564823 3786783165 2712019091 4564856692 3460348610 454326648 2 1339360726 0249141273 7245870066 0631558817 4881520920 9628292540 917153643 6 7892590360 0113305305 4882046652 1384146951 9415116094 3305727036 575959195 3 0921861173 8193261179 3105118548 0744623799 6274956735 1885752724 891227938 1 8301194913 01
Answer
05AB1E , 20 바이트
₄°·D.ΓN>*N·3+÷}O+₄;£
내 Java 답변 포트 (503
가 1000
로 대체되었습니다. \ $ \ geq503 \ $ 은 무엇이든 첫 번째를 출력하는 것이 좋습니다. 이 접근 방식으로 정확히 500 자리 수).
온라인으로 시도 또는 확인 ” s는 내장 žs
를 사용하는 PI의 처음 500 자리와 같습니다.
설명 :
₄° # Push 10**1000 · # Double it to 2e1000 D # Duplicate it .Γ # Loop until the result no longer changes, # collecting all intermediate results # (excluding the initial value unfortunately) N> # Push the 0-based loop-index, and increase it by 1 to make it 1-based * # Multiply this 1-based index to the current value N· # Push the 0-based index again, and double it 3+ # Add 3 to it ÷ # Integer-divide the (index+1)*value by this (2*index+3) }O # After the cumulative fixed-point loop: sum all values in the list + # Add the 2e1000 we"ve duplicated, which wasn"t included in the list ₄; # Push 1000, and halve it to 500 £ # Leave the first 500 digits of what we"ve calculated # (after which it is output implicitly as result)
Answer
Fortran, 154 바이트
로제타 코드 솔루션. write
대신 암시 적 정수 i j k l m n
, print
및 셔플 링을 사용하여 많은 바이트를 절약했습니다. 주변
integer,dimension(3350)::v=2;x=1E5;j=0 do n=1,101;do l=3350,1,-1 m=x*v(l)+i*l;i=m/(2*l-1);v(l)=m-i*(2*l-1);enddo k=i/x;print"(I5.5)",j+k;j=i-k*x;enddo end
Answer
APL (NARS2000), 20 바이트
{2+⍵×⍺÷1+⍨2×⍺}/⍳7e3x
이를 테스트 할 수는 없지만 Dyalog APL 버전은 여기 입니다. 둘 사이의 유일한 차이점은 접미사 ” x “입니다. 이는 NARS2000에서 유리수에 사용되지만 Dyalog에서는 사용할 수 없습니다. 내가 아는 한 온라인에서 사용할 수있는 다른 변형).
허용 된 Golfscript 답변 아래의 주석에있는 pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
공식을 기반으로합니다.