Számolja ki a pi 500 számjegyét

Írjon egy programot a pi első 500 számjegyének kiszámításához az alábbi szabályoknak megfelelően:

  • 500 karakternél rövidebbnek kell lennie.
  • Nem tartalmazhat “pi”, “math.pi” vagy hasonló pi konstansokat, és nem hívhat könyvtárfüggvényt a pi kiszámításához.
  • Nem használhatja egymás után a “3”, “1” és “4” számjegyeket.
  • Ésszerű idő alatt (1 perc alatt) kell végrehajtania egy modern számítógépen.

A legrövidebb program nyer.

Megjegyzések

  • A számjegyek helyes ellenőrzéséhez: eveandersson.com/pi/digits
  • Engedélyezhetünk-e 500-nál több számjegy pontosságvesztéssel történő nyomtatását az első 500 után?
  • @Alexandru, I tegyük fel, de én inkább csonkának látnám.
  • Használhatunk-e HTTP könyvtárat a pi ” számjegyek letöltéséhez a pi ” webhely? 😉
  • Jött ide, abban a reményben, hogy valami szépet és tömör információt szerezhet a pi önkényes hosszúságú közelítésének előállításához a pythonban … sajnos @Soulman ‘ s a látszólag 500 számjegyre van hangolva; 500 helyett 1000 helyett helytelen választ ad. Kíváncsi lennék, van-e jó módszer egy olyan alternatív kihívás megfogalmazására, amely szép rövid függvényt eredményezne, amely általában tetszőleges számú számjegy előállításához hasznos?

Válasz

Golfscript – 29 karakter

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

Később elemzést teszek közzé

Hozzászólások

  • Meg tudnád magyarázni ennek működését?
  • ” Később elemzést teszek közzé “. (3 évig vár) ….
  • ” később elemzést teszek közzé ” * még többet vár mint 6 év *
  • ” később elemzést teszek közzé ” (8 évig vár)
  • Még mindig vár …

Válasz

Mathematica (34 karakter): (“csalás” nélkül triggel)

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

Tehát, hogy elmagyarázzuk a varázslatot itt:
Integrate[function, lower, upper] megadja a görbe “függvénye” alatti területet “alsó” -tól “felső” -ig. Ebben az esetben ez a függvény [1-x^2]^.5, amely egy képlet, amely leírja az 1. sugárú kör felső felét. Mivel a kör sugara 1, ezért nem létezik x értéke -1-nél alacsonyabb vagy 1-nél nagyobb. Ezért megkeressük a kör felének területét. Ha szorozzuk 2-vel, akkor megkapjuk az 1 sugarú kör belsejében lévő területet, amely megegyezik pi-vel.

Megjegyzések

  • Talán Ön válaszába kell magyarázatot adnia arra, hogy ez miért működik (számukra nem matematikai emberek számára).
  • csodálatos ötlet Jelenleg gondoskodom róla. ‘ megadom az érintett matematika alapvető magyarázatát.
  • Esetleg lerövidítheti: módosítsa a sqrt[1-x^2] értéket (1-x^2)^.5)
  • és a * Mathematica csodálatos utáni * -ot el tudom távolítani.

Válasz

Python (83 karakter)

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 

Válasz

Husk , 28 25 24 bájt

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

Próbálja ki online!

A pi értékét racionális számként számítja ki a végtelen sorozat első 5000 kifejezése 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))), majd kivonja az első 500 számjegyet.

A pi értékének kiszámításához megadott számú kifejezésből álló kód csak 13 bájt (Σ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 

Sajnos akkor 3 bájtot kell pazarolnunk a szám megadásával használható kifejezések:

□70 # 70^2 = 4900 

Ezután további 8 bájt, amely a racionális számot (töredékben kifejezve) számjegyekké alakítja tizedes formában:

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

Válasz

PARI / GP, 14

\p500 acos(-1) 

A kiváltást elkerülheti helyettesítéssel a második sor a következővel:

gamma(.5)^2 

vagy

(6*zeta(2))^.5 

vagy

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

vagy

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

vagy

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

Válasz

Python3 136

Madhava “s képlet.

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

ezt használja képlet.

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

Válasz

Mathematica (17 bájt)

N[ArcCos[-1],500] 

Az érvényesség igazolása .

Válasz

Pyth , 21

u+/*GHhyHy^T500r^3T1Z 

Ezt az algoritmust használja: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))), amely megtalálható a Golfscript válasz megjegyzésében.

Megjegyzések

  • Ez nem ‘ nem érdemel visszavonást …
  • Ez a válasz helytelen, 34247779-et generál. .. ami tudomásom szerint nem pi.
  • @orlp A r műveletet nemrégiben megváltoztatták úgy, hogy megtört ez a válasz. Módosítsa a 1 értéket 0 -re, és az aktuális Pyth-ben fog működni.

Válasz

JavaScript, 60 bájt

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

Próbálja ki online!

Megjegyzések

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

Válasz

bc -l (22 = 5 parancssor + 17 program)

scale=500 4*a(1) 

Megjegyzések

  • A szabályok azt mondják, hogy “, és nem hívhat könyvtár funkciót a pi kiszámításához. ”
  • @Peter Azt hiszem, a probléma az, hogy ” könyvtárfunkció ” nem mindig pontosan definiált kifejezés, és csak akkor romlik, ha azt mondja, hogy ” a Pi “, mivel felhasználhatja közbenső eredmények kiszámítására, például Sqrt () Alexandru

    válasz.

  • Szerintem ez csalás, mert az atan kiszámolja az 1/4-es pi-t, de ennek ellenére érdekes megoldás.
  • @Thomas O : ha ez csalás, akkor hol ‘ van a határ?
  • a trig funkciókat meg kellett volna tiltani az ilyen válaszok miatt. az ötlet az, hogy kiszámoljuk a algoritmust, nem pedig beépített függvényt. Az sqrt egy kicsit más, mivel ‘ nem triggeri függvény.

Válasz

Mathematica – 50

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

Válasz

Java 10 , 208 207 206 193 bájt

 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 bájt a @ceilingcat nek köszönhetően.

Próbálja ki online .

Vagy teljes programként (245 bájt):

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

Próbálja ki online.

Válasz

Axióma, 80 bájt

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

referenciaként https://tuts4you.com/download.php?view.452 ; 6 * arctg (1 / sqrt (3)) =% pi közelítése lenne, és az 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 

Válasz

05AB1E , 20 bájt

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

Java válaszom portja (a 503 helyébe 1000 lépett – bármi \ $ \ geq503 \ $ megfelel az első 500 számjegy pontosan ezzel a megközelítéssel).

Próbálja ki online vagy igazolja ” s megegyezik a PI első 500 számjegyével a beépített žs használatával.

Magyarázat:

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

Válasz

Fortran, 154 bájt

Összetévesztette a rosetta kód megoldás. Sok bájt mentve implicit egész számokkal i j k l m n, print a write helyett és a dolgok keverésével körül

Próbálja ki 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  

Válasz

APL (NARS2000), 20 bájt

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

Ezt még nem tudtam tesztelni, de itt “van egy verzió a Dyalog APL-ben. Az egyetlen különbség köztük a ” x ” utótag, amelyet a NARS2000 racionális számaihoz használnak, de a Dyalog nem érhető el (vagy egyéb, online elérhető változatok, ha jól tudom).

Ez a pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) képleten alapszik a megjegyzésekben az elfogadott Golfscript válasz alatt. >

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük