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
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
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. Ändra1
till0
, 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}
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 .
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));}}
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
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.