Í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
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
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 a1
értéket0
-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}
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.
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));}}
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
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. >