Skriv et program til at beregne de første 500 cifre i pi, og følg nedenstående regler:
- Det skal være mindre end 500 tegn langt.
- Det kan ikke omfatte “pi”, “math.pi” eller lignende pi-konstanter, og det kan heller ikke kalde en biblioteksfunktion for at beregne pi.
- Det bruger muligvis ikke cifrene “3”, “1” og “4” efter hinanden.
- Det skal udføres på en rimelig tid (under 1 minut) på en moderne computer.
Det korteste program vinder.
Kommentarer
- For at kontrollere, om dine cifre er korrekte: eveandersson.com/pi/digits
- Må vi udskrive mere end 500 cifre med tab af nøjagtighed efter de første 500?
- @Alexandru, I antag det, men jeg foretrækker at se det afkortet.
- Kan vi bruge et HTTP-bibliotek til at downloade en ” cifre i pi ” websted? 😉
- Kom her i håb om at få noget pænt og koncist til at generere vilkårlige længdeafgrænsninger af pi i python … desværre er @Soulman ‘ s pythonløsning tilsyneladende indstillet til 500 cifre; at erstatte 500 med 1000 giver et forkert svar. Jeg spekulerer på, om der er en god måde at formulere en alternativ udfordring på, der ville give en god kort funktion, der generelt er nyttig til at generere et vilkårligt antal cifre?
Svar
Golfscript – 29 tegn
6666,-2%{2+.2/@*\/9)499?2*+}*
Jeg vil sende en analyse senere
Kommentarer
- Kunne du forklare, hvordan dette fungerer?
- ” Jeg sender en analyse senere “. (venter i 3 år) ….
- ” Jeg sender analyse senere ” * venter på mere end 6 år *
- ” Jeg sender analyse senere ” (venter i 8 år)
- Venter stadig …
Svar
Mathematica (34 tegn): (uden “snyd” med trig)
N[2Integrate[[1-x^2]^.5,-1,1],500]
Så for at forklare magien her:
Integrate[function, lower, upper]
giver dig området under kurven “funktion” fra “nedre” til “øvre”. I dette tilfælde er denne funktion [1-x^2]^.5
, hvilket er en formel, der beskriver den øverste halvdel af en cirkel med radius 1. Fordi cirklen har en radius på 1, findes den ikke i værdier på x lavere end -1 eller højere end 1. Derfor finder vi arealet på halvdelen af en cirkel. Når vi multiplicerer med 2, får vi området inden i en cirkel med radius 1, som er lig med pi.
Kommentarer
- Måske du skal indsætte, i dit svar, en forklaring på, hvorfor dette fungerer (for dem, der ikke er matematiske).
- vidunderlig idé. Jeg vil sørge for det i øjeblikket. Jeg ‘ Jeg giver en grundlæggende forklaring på den involverede matematik.
- Måske kan du forkorte det: ændre
sqrt[1-x^2]
til(1-x^2)^.5)
- og jeg kan fjerne * efter 2. Mathematica er vidunderligt.
Svar
Python (83 tegn)
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 bytes
i*!500İ⁰ΣG*2mṠ/o!İ1→ḣ□70
Beregner værdien af pi som et rationelt tal ved hjælp af de første 5000 termer i den uendelige serie 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
, og ekstraherer derefter de første 500 cifre.
Koden til beregning af værdien af pi fra et specificeret antal udtryk er kun 13 bytes (Σ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
Desværre er vi så nødt til at spilde 3 byte ved at angive antallet af vilkår, der skal bruges:
□70 # 70^2 = 4900
Og derefter 8 ekstra byte, der konverterer det rationelle tal (udtrykt som en brøkdel) til dets cifre 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 undgå trig ved at erstatte anden linje 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
Bruger 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
Bruger dette 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
Bruger denne algoritme: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
fundet i kommentarerne til Golfscript-svaret.
Kommentarer
- Dette fortjener ikke ‘ t fortjener en nedstemning …
- Dette svar er forkert, det genererer 34247779. .. som efter min viden ikke er pi.
- @orlp
r
operationen blev for nylig ændret på en måde, der brød dette svar. Skift1
til en0
, og det fungerer i den aktuelle 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 bytes:
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 kommandolinje + 17 program)
scale=500 4*a(1)
Kommentarer
- Reglerne siger ” og må heller ikke kalde en biblioteksfunktion at beregne pi. ”
- @Peter Problemet antager jeg, at ” biblioteksfunktion ” er ikke altid et veldefineret udtryk, og det bliver kun værre, når du siger ” for at beregne Pi “, som du måske bruger den til at beregne mellemresultater, for eksempel Sqrt () i Alexandru
s svar.
- Jeg synes dette er snyd, fordi atan beregner 1/4 pi, men det er alligevel en interessant løsning.
- @Thomas O : hvis dette er snyd, hvor ‘ er grænsen?
- trig-funktioner skulle have været forbudt på grund af svar som dette. ideen er at beregne pi med en algoritme, ikke en indbygget funktion. sqrt er lidt anderledes, da det ‘ ikke er en trig-funktion.
Svar
Mathematica – 50
½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½]
Svar
Java 10 , 208 207 206 193 bytes
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 bytes takket være @ceilingcat .
Eller som fuldt program (245 bytes):
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])
til reference https://tuts4you.com/download.php?view.452 ; det ville være en approssimation til 6 * arctg (1 / sqrt (3)) =% pi, og det ville bruge serieudvidelse til 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 til mit Java-svar (med 503
erstattet med 1000
– alt \ $ \ geq503 \ $ er fint at udføre den første 500 cifre nøjagtigt med denne tilgang).
Prøv det online eller bekræft det ” s svarer til de første 500 cifre i PI ved hjælp af det indbyggede žs
.
Forklaring:
₄° # 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
Blandede rosetta code løsning. Gemte mange byte ved hjælp af implicitte heltal i j k l m n
, print
i stedet for write
og blandet ting omkring
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
Jeg har ikke været i stand til at teste dette, men her “er en version i Dyalog APL. Den eneste forskel mellem dem er suffikset ” x “, som bruges til rationelle tal i NARS2000 men ikke er tilgængelig i Dyalog (eller andre varianter tilgængelige online, så vidt jeg ved).
Det er baseret på pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
formlen i kommentarerne under det accepterede Golfscript-svar.