Oblicz 500 cyfr pi

25

Napisz program do obliczenia pierwszych 500 cyfr pi, spełniając poniższe zasady:

  • Musi mieć mniej niż 500 znaków.
  • Nie może zawierać „pi”, „math.pi” ani podobnych stałych pi, ani też nie może wywoływać funkcji bibliotecznej do obliczania pi.
  • Nie może używać kolejno cyfr „3”, „1” i „4”.
  • Musi zostać wykonany w rozsądnym czasie (poniżej 1 minuty) na nowoczesnym komputerze.

Najkrótszy program wygrywa.

Thomas O
źródło
Aby sprawdzić, czy twoje cyfry są poprawne: eveandersson.com/pi/digits
Nellius
Czy możemy drukować więcej niż 500 cyfr z utratą dokładności po pierwszych 500?
Alexandru
@Alexandru, tak przypuszczam, ale wolałbym, żeby został obcięty.
Thomas O
@Joey brak funkcji bibliotecznych DO OBLICZENIA PI - Zakładam, że możesz używać wszystkiego z bibliotek oprócz stałej / funkcji PI.
Aurel Bílý
1
Czy możemy użyć biblioteki HTTP do pobrania strony internetowej „cyfry pi”? ;-)
dan04

Odpowiedzi:

11

Golfscript - 29 znaków

6666,-2%{2+.2/@*\/9)499?2*+}*

Prześlę analizę później

gnibbler
źródło
5
Czy możesz wyjaśnić, jak to działa?
Thomas O
65
„Prześlę analizę później”. (czeka 3 lata) ....
Justin
14
Prześlę
1
@EriktheOutgolfer zamierzałem to opublikować. : P
Christopher
1
„Prześlę analizę później” (czeka 8 lat)
Jono 2906
8

Mathematica (34 znaki): (bez „oszustwa” z trigiem)

N[2Integrate[[1-x^2]^.5,-1,1],500]

Tak więc, aby wyjaśnić magię tutaj:
Integrate[function, lower, upper]daje obszar pod krzywą „funkcji” od „dolnej” do „górnej”. W tym przypadku jest to funkcja [1-x^2]^.5, która jest formułą opisującą górną połowę okręgu o promieniu 1. Ponieważ okrąg ma promień 1, nie istnieje dla wartości x mniejszych niż -1 lub większych niż 1. Dlatego znajdujemy obszar połowy koła. Kiedy pomnożymy przez 2, otrzymamy obszar wewnątrz koła o promieniu 1, który jest równy pi.

Stack Tracer
źródło
Być może powinieneś wstawić w swojej odpowiedzi wyjaśnienie, dlaczego to działa (dla nich nie-matematycznych).
Justin
wspaniały pomysł. Zajmę się tym teraz. Dam podstawowe wyjaśnienie matematyki.
Stack Tracer
Może mógłbyś to skrócić: zmień sqrt[1-x^2]na(1-x^2)^.5)
Justin
i mogę usunąć * po 2. Mathematica jest cudowna.
Stack Tracer
4

Python (83 znaki)

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
Soulman
źródło
3

PARI / GP, 14

\p500
acos(-1)

Możesz uniknąć wyzwalania, zastępując drugą linię

gamma(.5)^2

lub

(6*zeta(2))^.5

lub

psi(3/4)-psi(1/4)

lub

4*intnum(x=0,1,(1-x^2)^.5)

lub

sumalt(k=2,(-1)^k/(2*k-3))*4
Charles
źródło
2

bc -l (22 = 5 wiersza poleceń + 17 programów)

scale=500
4*a(1)
Alexandru
źródło
5
Reguły mówią „ani nie może wywoływać funkcji bibliotecznej do obliczania liczby pi”.
Peter Taylor
@Peter Problemem jest, że „funkcja biblioteczna” nie zawsze jest dobrze zdefiniowanym terminem, a staje się gorzej, gdy mówisz „obliczyć Pi”, ponieważ możesz go użyć do obliczenia wyników pośrednich, na przykład Sqrt () w odpowiedzi Alexandru.
Dr Belisarius
Myślę, że to oszustwo, ponieważ atan oblicza 1/4 pi, ale mimo to jest to interesujące rozwiązanie.
Thomas O
1
@Thomas O: jeśli to oszustwo, gdzie jest limit?
JB
2

Mathematica (17 bajtów)

N[ArcCos[-1],500]

Dowód ważności .

Donkiszotowski
źródło
1

Python3 136

Wykorzystuje formułę Madhavy .

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

Używa tej formuły.

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])
Alexandru
źródło
1

Mathematica - 50

½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½]
śmigać
źródło
1

Pyth , 21 lat

u+/*GHhyHy^T500r^3T1Z

Wykorzystuje ten algorytm: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))znaleziony w komentarzach odpowiedzi Golfscript.

isaacg
źródło
To nie zasługuje na negatywną opinię ...
Rozpad Beta
Ta odpowiedź jest niepoprawna, generuje 34247779 ... co, według mojej wiedzy, nie jest pi.
orlp
@orlp rOperacja została niedawno zmieniona w sposób, który złamał tę odpowiedź. Zmień na 1a 0, a będzie działać w bieżącym języku Pyth.
isaacg
0

Aksjomat, 80 bajtów

digits(503);v:=1./sqrt(3);6*reduce(+,[(-1)^k*v^(2*k+1)/(2*k+1)for k in 0..2000])

w celach informacyjnych https://tuts4you.com/download.php?view.452 ; byłoby to approsimacja do 6 * arctg (1 / sqrt (3)) =% pi i użyłby rozszerzenia serii dla 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
RosLuP
źródło
0

JavaScript, 68 bajtów

i=1n;x=3n*(10n**520n);p=x;while(x>0){x=x*i/((i+1n)*4n);i+=2n;p+=x/i}

Wypróbuj online!

Yehuda Schwartz
źródło