Calculați 500 de cifre de pi

Scrieți un program pentru a calcula primele 500 de cifre de pi, respectând regulile de mai jos:

  • Trebuie să aibă mai puțin de 500 de caractere în lungime.
  • Nu poate include „pi”, „math.pi” sau constante pi similare și nici nu poate apela o funcție de bibliotecă pentru a calcula pi.
  • Nu poate utiliza cifrele „3”, „1” și „4” consecutiv.
  • Trebuie să se execute într-un timp rezonabil (sub 1 minut) pe un computer modern.

Cel mai scurt program câștigă.

Comentarii

  • Pentru a verifica dacă cifrele sunt corecte: eveandersson.com/pi/digits
  • Ne este permis să imprimăm mai mult de 500 de cifre cu pierderea de precizie după primele 500?
  • @Alexandru, I să presupunem că da, dar aș prefera să o văd trunchiată.
  • Putem folosi o bibliotecă HTTP pentru a descărca un ” cifre de pi ” site-ul web? 😉
  • Am venit aici în speranța de a obține ceva frumos și concis pentru generarea unor aproximări de lungime arbitrare ale pi în python … din păcate soluția python @Soulman ‘ este aparent reglat pentru 500 de cifre; înlocuirea 500 cu 1000 oferă un răspuns incorect. Mă întreb dacă există o modalitate bună de formulare a unei provocări alternative care ar produce o funcție scurtă frumoasă, care este, în general, utilă pentru generarea unui număr arbitrar de cifre?

Răspuns

Golfscript – 29 caractere

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

Voi posta analiza mai târziu

Comentarii

  • Ați putea explica cum funcționează acest lucru?
  • ” Voi posta analiza mai târziu „. (așteaptă 3 ani) ….
  • ” Voi posta analiza ulterior ” * așteaptă mai multe peste 6 ani *
  • ” Voi posta analiza ulterior ” (așteaptă 8 ani)
  • Încă așteaptă …

Răspuns

Mathematica (34 caractere): (fără „trișare” cu trig)

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

Deci, pentru a explica magia aici:
Integrate[function, lower, upper] vă oferă zona de sub curba „funcție” de la „inferior” la „superior”. În acest caz, acea funcție este [1-x^2]^.5, care este o formulă care descrie jumătatea superioară a unui cerc cu raza 1. Deoarece cercul are o rază de 1, acesta nu există pentru valori de x mai mici de -1 sau mai mari de 1. Prin urmare, găsim aria jumătății unui cerc. Când înmulțim cu 2, atunci obținem aria din interiorul unui cerc de rază 1, care este egal cu pi.

Comentarii

  • Poate că tu ar trebui să insereze, în răspunsul dvs., o explicație a motivului pentru care funcționează (pentru acei oameni care nu sunt matematici).
  • idee minunată. Mă voi ocupa în acest moment. ‘ voi oferi o explicație de bază a matematicii implicate.
  • Poate ați putea să o scurtați: schimbați sqrt[1-x^2] (1-x^2)^.5)
  • și pot elimina * după 2. Mathematica este minunat.

Răspuns

Python (83 caractere)

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 

Răspuns

Husk , 28 25 24 octeți

i*!500İ⁰ΣG*2mṠ/o!İ1→ḣ□70 

Încercați online!

Calculează valoarea pi ca număr rațional folosind primii 5000 de termeni din seria infinită 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))), apoi extrage primele 500 de cifre.

Codul pentru a calcula valoarea pi dintr-un număr specificat de termeni are doar 13 octeți (Σ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 

Din păcate, trebuie să pierdem 3 octeți specificând numărul de termeni de utilizat:

□70 # 70^2 = 4900 

Și apoi încă 8 octeți care convertesc numărul rațional (exprimat ca o fracție) în cifre în formă zecimală:

i*!500İ⁰ i # integer value of * # multiplying by !500 # 500th element of İ⁰ # series of powers of 10 

Răspuns

PARI / GP, 14

\p500 acos(-1) 

Puteți evita declanșarea prin înlocuirea a doua linie cu

gamma(.5)^2 

sau

(6*zeta(2))^.5 

sau

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

sau

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

sau

sumalt(k=2,(-1)^k/(2*k-3))*4 

Răspuns

Python3 136

Utilizează Madhava „s formulă.

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

Folosește aceasta formula.

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

Răspuns

Mathematica (17 octeți)

N[ArcCos[-1],500] 

Dovadă de validitate .

Răspuns

Pyth , 21

u+/*GHhyHy^T500r^3T1Z 

Folosește acest algoritm: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) găsit în comentariile răspunsului Golfscript.

Comentarii

  • Acest lucru nu merită ‘ nu merită vot negativ …
  • Acest răspuns este incorect, generează 34247779. .. ceea ce, din câte știu, nu este pi.
  • @orlp Operațiunea r a fost recent modificată într-un mod care a spart acest răspuns. Schimbați 1 cu un 0 și va funcționa în Pyth curent.

Răspuns

JavaScript, 60 octeți

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

Încercați-l online!

Comentarii

  • 62 octeți: for(i=1n,p=x=3n*(10n**520n);x>0;x=x*i/(i*4n+4n),p+=x/(i+=2n));

Răspuns

bc -l (22 = 5 linie de comandă + 17 program)

scale=500 4*a(1) 

Comentarii

  • Regulile spun ” și nici nu poate apela o funcție de bibliotecă pentru a calcula pi. ”
  • @Peter Problema cred că este că ” funcția de bibliotecă ” nu este întotdeauna un termen bine definit și se înrăutățește doar atunci când spui ” pentru a calcula Pi „, așa cum îl puteți folosi pentru a calcula rezultatele intermediare, de exemplu Sqrt () în Alexandru

    .

  • Cred că acest lucru este înșelător, deoarece atan calculează 1/4 pi, dar este totuși o soluție interesantă.
  • @Thomas O : dacă acest lucru este înșelător, unde ‘ este limita?
  • funcțiile trig ar fi trebuit interzise din cauza unor răspunsuri de acest gen. ideea este de a calcula pi cu un algoritm, nu cu o funcție încorporată. sqrt este puțin diferit, deoarece ‘ nu este o funcție trig.

Răspunde

Mathematica – 50

½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½] 

Răspuns

Java 10 , 208 207 206 193 octeți

 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 octeți datorită @ceilingcat .

Încercați online .

Sau ca program complet (245 octeți):

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

Încercați online.

Răspuns

Axiom, 80 octeți

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

pentru referință https://tuts4you.com/download.php?view.452 ; ar fi o aproximare la 6 * arctg (1 / sqrt (3)) =% pi și ar folosi expansiunea serie pentru 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 

Răspuns

05AB1E , 20 octeți

₄°·D.ΓN>*N·3+÷}O+₄;£ 

Portul răspunsul meu Java (cu 503 înlocuit cu 1000 – orice \ $ \ geq503 \ $ este în regulă pentru a scoate primul 500 de cifre cu această abordare).

Încercați online sau verificați-l ” s este egal cu primele 500 de cifre ale PI folosind elementul încorporat žs .

Explicație:

 ₄° # 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)  

Răspuns

Fortran, 154 octeți

A gestionat soluție cod rosetta . S-au salvat o mulțime de octeți folosind numere întregi implicite i j k l m n, print în loc de write și amestecând lucruri în jur

Încercați online …

 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  

Răspuns

APL (NARS2000), 20 octeți

{2+⍵×⍺÷1+⍨2×⍺}/⍳7e3x 

Nu am reușit să testez acest lucru, dar aici are o versiune în Dyalog APL. Singura diferență dintre ele este sufixul ” x „, care este utilizat pentru numere raționale în NARS2000, dar nu este disponibil în Dyalog (sau alte variante disponibile online, din câte știu).

Se bazează pe formula pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) din comentariile din răspunsul acceptat Golfscript.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *