Beräkna 500 siffror av pi

Skriv ett program för att beräkna de första 500 siffrorna i pi, enligt reglerna nedan:

  • Den måste ha mindre än 500 tecken.
  • Den kan inte innehålla ”pi”, ”math.pi” eller liknande pi-konstanter, och det kan inte heller anropa en biblioteksfunktion för att beräkna pi.
  • Det går inte att använda siffrorna ”3”, ”1” och ”4” i följd.
  • Den måste köras på en rimlig tid (under 1 minut) på en modern dator.

Det kortaste programmet vinner.

Kommentarer

  • För att kontrollera om dina siffror stämmer: eveandersson.com/pi/digits
  • Får vi skriva ut mer än 500 siffror med förlust av noggrannhet efter de första 500?
  • @Alexandru, I antar det, men jag föredrar att se det trunkerat.
  • Kan vi använda ett HTTP-bibliotek för att ladda ner en ” siffror i pi ” webbplats? 😉
  • Kom hit i hopp om att få något trevligt och koncist för att generera godtyckliga längduppskattningar av pi i python … tyvärr är @Soulman ’ s pythonlösning tydligen inställd på 500 siffror; att ersätta 500 med 1000 ger ett felaktigt svar. Jag undrar om det finns ett bra sätt att formulera en alternativ utmaning som skulle ge en fin kortfunktion som i allmänhet är användbar för att generera ett godtyckligt antal siffror?

Svar

Golfscript – 29 tecken

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

Jag kommer att publicera analys senare

Kommentarer

  • Kan du förklara hur detta fungerar?
  • ” Jag kommer att publicera analys senare ”. (väntar i tre år) ….
  • ” Jag kommer att publicera analys senare ” * väntar på mer än 6 år *
  • ” Jag kommer att publicera analys senare ” (väntar i åtta år)
  • Väntar fortfarande …

Svar

Mathematica (34 tecken): (utan ”fusk” med trig)

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

Så, för att förklara magin här:
Integrate[function, lower, upper] ger dig området under kurvan ”funktion” från ”nedre” till ”övre”. I det här fallet är den funktionen [1-x^2]^.5, vilket är en formel som beskriver den övre halvan av en cirkel med radie 1. Eftersom cirkeln har en radie på 1 finns den inte för värden x lägre än -1 eller högre än 1. Därför hittar vi ytan på hälften av en cirkel. När vi multiplicerar med 2 får vi området inuti en cirkel med radie 1, vilket är lika med pi.

Kommentarer

  • Kanske du borde infoga, i ditt svar, en förklaring till varför detta fungerar (för dem som inte är matematik).
  • underbar idé. Jag kommer att se till det för närvarande. Jag ’ Jag ger en grundläggande förklaring av den matematik som är inblandad.
  • Du kanske kan förkorta den: ändra sqrt[1-x^2] till (1-x^2)^.5)
  • och jag kan ta bort * efter 2. Mathematica är underbart.

Svar

Python (83 tecken)

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 

Svar

Husk , 28 25 24 byte

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

Prova det online!

Beräknar värdet på pi som ett rationellt tal med de första 5000 termerna i den oändliga serien 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) och extraherar sedan de första 500 siffrorna.

Koden för att beräkna värdet på pi från ett angivet antal termer är bara 13 byte (Σ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 

Tyvärr behöver vi då slösa bort 3 byte som anger antalet av termer som ska användas:

□70 # 70^2 = 4900 

Och sedan ytterligare 8 byte som omvandlar det rationella talet (uttryckt som en bråkdel) till dess siffror i decimalform:

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

Svar

PARI / GP, 14

\p500 acos(-1) 

Du kan undvika trig genom att ersätta andra raden med

gamma(.5)^2 

eller

(6*zeta(2))^.5 

eller

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

eller

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

eller

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

Svar

Python3 136

Använder Madhava ”s formel.

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

Använder detta formel.

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

Svar

Mathematica (17 byte)

N[ArcCos[-1],500] 

Giltighetsbevis .

Svar

Pyth , 21

u+/*GHhyHy^T500r^3T1Z 

Använder denna algoritm: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) finns i kommentarerna till Golfscript-svaret.

Kommentarer

  • Detta ’ t förtjänar en nedröstning …
  • Detta svar är felaktigt, det genererar 34247779. .. vilket, såvitt jag vet, inte är pi.
  • @orlp r operationen ändrades nyligen på ett sätt som bröt detta svar. Ändra 1 till 0, så fungerar det i nuvarande Pyth.

Svar

JavaScript, 60 byte

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

Prova online!

Kommentarer

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

Svar

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

scale=500 4*a(1) 

Kommentarer

  • Reglerna säger ” och det får inte heller kallas en biblioteksfunktion för att beräkna pi. ”
  • @Peter Problemet antar jag att ” biblioteksfunktion ” är inte alltid en väldefinierad term, och det blir bara värre när du säger ” för att beräkna Pi ”, eftersom du kan använda den för att beräkna mellanresultat, till exempel Sqrt () i Alexandru

    s svar.

  • Jag tror att detta är fusk eftersom atan beräknar 1/4 pi men det är ändå en intressant lösning.
  • @Thomas O : om detta är fusk, där ’ är gränsen?
  • trig-funktioner borde ha varit förbjudna på grund av svar som detta. tanken är att beräkna pi med en algoritm, inte en inbyggd funktion. sqrt är lite annorlunda eftersom det ’ inte är en trig-funktion.

Svar

Mathematica – 50

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

Svar

Java 10 , 208 207 206 193 byte

 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 byte tack vare @ceilingcat .

Prova online .

Eller som fullständigt program (245 byte):

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

Prova online.

Svar

Axiom, 80 byte

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

för referens https://tuts4you.com/download.php?view.452 ; det skulle vara en approssimation till 6 * arctg (1 / sqrt (3)) =% pi och det skulle använda serieutvidgning för 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 

Svar

05AB1E , 20 byte

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

Port för mitt Java-svar (med 503 ersatt med 1000 – allt \ $ \ geq503 \ $ är bra att mata ut den första 500 siffror exakt med den här metoden).

Testa det online eller verifiera det ” är lika med de första 500 siffrorna i PI med den inbyggda žs .

Förklaring:

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

Svar

Fortran, 154 byte

Blandade rosetta-kod -lösning. Sparade många byte med implicita heltal i j k l m n, print istället för write och blandade saker runt

Prova 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  

Svar

APL (NARS2000), 20 byte

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

Jag har inte kunnat testa detta, men här är en version i Dyalog APL. Den enda skillnaden mellan dem är suffixet ” x ”, som används för rationella nummer i NARS2000 men inte finns i Dyalog (eller andra varianter tillgängliga online, såvitt jag vet).

Den är baserad på pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) -formeln i kommentarerna under det accepterade Golfscript-svaret.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *