Napisz program do obliczania pierwszych 500 cyfr liczby pi, spełniający poniższe zasady:
- Musi mieć mniej niż 500 znaków.
- Nie może zawierać „pi”, „math.pi” ani podobnych stałych pi ani nie może wywoływać funkcji bibliotecznej w celu obliczenia 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.
Komentarze
- Aby sprawdzić poprawność cyfr: eveandersson.com/pi/digits
- Czy możemy wydrukować więcej niż 500 cyfr z utratą dokładności po pierwszych 500?
- @Alexandru, ja przypuszczam, że tak, ale wolałbym, aby został obcięty.
- Czy możemy użyć biblioteki HTTP do pobrania ” cyfr pi ” witryna internetowa? 😉
- Przyszedłem tutaj z nadzieją, że dostanę coś ładnego i zwięzłego do generowania dowolnych przybliżeń długości pi w Pythonie … niestety @Soulman ' s pythonowym rozwiązaniem jest najwyraźniej dostrojony do 500 cyfr; zamiana 500 na 1000 daje błędną odpowiedź. Zastanawiam się, czy istnieje dobry sposób sformułowania alternatywnego wyzwania, które dałoby ładną krótką funkcję, która jest ogólnie użyteczna do generowania dowolnej liczby cyfr?
Odpowiedź
Golfscript – 29 znaków
6666,-2%{2+.2/@*\/9)499?2*+}*
Analizę prześlę później
Komentarze
- Czy mógłbyś wyjaśnić, jak to działa?
- ” Później opublikuję analizę „. (czeka 3 lata) ….
- ” Prześlę analizę później ” * czeka na więcej niż 6 lat *
- ” Prześlę analizę później ” (czeka 8 lat)
- Wciąż czekam …
Odpowiedź
Mathematica (34 znaki): (bez „oszukiwania”) with trig)
N[2Integrate[[1-x^2]^.5,-1,1],500]
Aby wyjaśnić magię tutaj:
Integrate[function, lower, upper]
podaje obszar pod „funkcją” krzywej od „dolnej” do „górnej”. W tym przypadku ta funkcja to [1-x^2]^.5
, co 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 mniejsze niż -1 lub większe niż 1. W związku z tym znajdujemy pole połowy koła. Kiedy pomnożymy przez 2, otrzymamy obszar wewnątrz okręgu o promieniu 1, który jest równy pi.
Komentarze
- Być może powinien wstawić do swojej odpowiedzi wyjaśnienie, dlaczego to działa (dla tych, którzy nie znają matematyki).
- wspaniały pomysł. Niedługo się tym zajmę. ' podam podstawowe wyjaśnienie wymaganej matematyki.
- Może mógłbyś je skrócić: zmień
sqrt[1-x^2]
na(1-x^2)^.5)
- i mogę usunąć * po 2. Mathematica jest cudowna.
Odpowiedź
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
Odpowiedź
Husk , 28 25 24 bajty
i*!500İ⁰ΣG*2mṠ/o!İ1→ḣ□70
Oblicza wartość pi jako liczbę wymierną, używając pierwszych 5000 terminów z nieskończonej serii 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
, a następnie wyodrębnia pierwsze 500 cyfr.
Kod do obliczenia wartości pi z określonej liczby terminów ma tylko 13 bajtów (Σ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
Niestety, musimy wtedy zmarnować 3 bajty określając liczbę używanych terminów:
□70 # 70^2 = 4900
I jeszcze 8 bajtów konwertując liczbę wymierną (wyrażoną jako ułamek) na cyfry w postaci dziesiętnej:
i*!500İ⁰ i # integer value of * # multiplying by !500 # 500th element of İ⁰ # series of powers of 10
Odpowiedź
PARI / GP, 14
\p500 acos(-1)
Możesz uniknąć wyzwalania, zastępując druga linia z
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
Odpowiedź
Python3 136
Używa Madhava „s formuła.
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 tego wzór.
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])
Odpowiedź
Odpowiedź
Pyth , 21
u+/*GHhyHy^T500r^3T1Z
Korzysta z tego algorytmu: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
znaleziono w komentarzach do odpowiedzi Golfscript.
Komentarze
- To nie ' nie zasługuje na negatywną opinię …
- Ta odpowiedź jest niepoprawna, generuje 34247779. .. który, o ile mi wiadomo, nie jest pi.
- @orlp Operacja
r
została ostatnio zmieniona w sposób, który zepsuł tę odpowiedź. Zmień1
na0
i będzie działać w aktualnym Pythie.
Odpowiedź
JavaScript, 60 bajtów
i=1n;p=x=3n*(10n**520n);while(x=x*i/(i*4n+4n)){i+=2n;p+=x/i}
Komentarze
- 62 bajty:
for(i=1n,p=x=3n*(10n**520n);x>0;x=x*i/(i*4n+4n),p+=x/(i+=2n));
Odpowiedź
bc -l (22 = 5 linii poleceń + 17 programów)
scale=500 4*a(1)
Komentarze
- Reguły mówią ” ani nie mogą wywoływać funkcji biblioteki obliczyć pi. ”
- @Peter Wydaje mi się, że problem polega na tym, że ” funkcja biblioteki nie zawsze jest dobrze zdefiniowanym terminem, a sytuacja pogarsza się tylko wtedy, gdy powiesz ” do obliczenia Pi „, ponieważ możesz go użyć do obliczenia wyników pośrednich, na przykład Sqrt () w Alexandru
odpowiedź.
- Myślę, że to oszustwo, ponieważ atan oblicza 1/4 pi, ale mimo wszystko jest to interesujące rozwiązanie.
- @Thomas O : jeśli to oszustwo, gdzie ' jest limit?
- funkcje trygonometryczne powinny być zabronione z powodu takich odpowiedzi. chodzi o to, aby obliczyć liczbę pi za pomocą algorytmu, a nie funkcji wbudowanej. sqrt jest nieco inny, ponieważ ' nie jest funkcją trig.
Answer
Mathematica – 50
½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½]
Odpowiedź
Java 10 , 208 207 206 193 bajtów
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);}
-14 bajtów dzięki @ceilingcat .
Lub jako pełny program (245 bajtów):
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));}}
Odpowiedź
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 przybliżeniem do 6 * arctg (1 / sqrt (3)) =% pi i użyłoby rozwinięcia 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
Odpowiedź
05AB1E , 20 bajtów
₄°·D.ΓN>*N·3+÷}O+₄;£
Port mojej odpowiedzi Java (z 503
zastąpiono 1000
– wszystko \ $ \ geq503 \ $ jest w porządku, aby wyświetlić pierwszy 500 cyfr dokładnie w tym podejściu).
Wypróbuj online lub sprawdź to ” s równe pierwszym 500 cyfrom PI przy użyciu wbudowanego žs
.
Objaśnienie:
₄° # 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)
Odpowiedź
Fortran, 154 bajty
Zmieniono kod Rosetta . Zapisano wiele bajtów przy użyciu niejawnych liczb całkowitych i j k l m n
, print
zamiast write
i tasowanie rzeczy wokół
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
Odpowiedź
APL (NARS2000), 20 bajtów
{2+⍵×⍺÷1+⍨2×⍺}/⍳7e3x
Nie byłem w stanie tego przetestować, ale tutaj jest wersja w Dyalog APL. Jedyną różnicą między nimi jest przyrostek ” x „, który jest używany do liczb wymiernych w NARS2000, ale nie jest dostępny w Dyalog (lub inne warianty dostępne online, o ile wiem).
Jest to oparte na formule pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
w komentarzach pod zaakceptowaną odpowiedzią Golfscript.