Laske 500 pi-numeroa

Kirjoita ohjelma laskemaan pi: n ensimmäiset 500 numeroa alla olevien sääntöjen mukaisesti:

  • Sen on oltava alle 500 merkkiä pitkä.
  • Se ei voi sisältää ”pi”, ”math.pi” tai vastaavia pi-vakioita, eikä se saa kutsua kirjastofunktiota pi: n laskemiseksi.
  • Se ei saa käyttää numeroita ”3”, ”1” ja ”4” peräkkäin.
  • Sen on suoritettava kohtuullisessa ajassa (alle 1 minuutti) modernilla tietokoneella.

Lyhin ohjelma voittaa.

Kommentit

  • Voit tarkistaa, ovatko numerosi oikein: eveandersson.com/pi/digits
  • Saammeko tulostaa yli 500 numeroa epätarkkuudella 500 ensimmäisen jälkeen?
  • @Alexandru, I oletetaan niin, mutta haluaisin mieluummin nähdä sen katkaistuna.
  • Voimmeko käyttää HTTP-kirjastoa pi ” -piirien lataamiseen pi ” verkkosivusto? 😉
  • Tuli tänne toivoen saavansa jotain mukavaa ja ytimekästä mielivaltaisten pi-likiarvojen tuottamiseksi pythonissa … valitettavasti @Soulman ’ python-ratkaisu on ilmeisesti viritetty 500 numerolle; 500 korvaaminen 1000: lla antaa virheellisen vastauksen. Mietin, onko olemassa hyvä tapa ilmaista vaihtoehtoinen haaste, joka tuottaisi mukavan lyhyen funktion, josta on yleensä hyötyä mielivaltaisen määrän numeroiden luomisessa?

Vastaus

Golfscript – 29 merkkiä

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

Lähetän analyysin myöhemmin

Kommentit

  • Voisitko selittää, miten tämä toimii?
  • ” Lähetän analyysin myöhemmin ”. (odottaa 3 vuotta) ….
  • ” Lähetän analyysin myöhemmin ” * odottaa lisää yli 6 vuotta *
  • ” lähetän analyysin myöhemmin ” (odottaa kahdeksan vuotta)
  • Odottaa edelleen …

Vastaa

Mathematica (34 merkkiä): (ilman ”huijausta” trigillä)

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

Selitä taika täällä:
Integrate[function, lower, upper] antaa käyrän ”funktio” alla olevan alueen ”alemmasta” ylempään. Tässä tapauksessa funktio on [1-x^2]^.5, joka on kaava, joka kuvaa ympyrän, jonka säde on 1, yläpuolta. Koska ympyrän säde on 1, sitä ei ole olemassa x: n arvot ovat alle -1 tai suurempia kuin 1. Siksi löydämme puoliympyrän pinta-alan. Kun kerrotaan 2: lla, saadaan alue ympyrän säteellä 1, joka on yhtä suuri kuin pi.

Kommentit

  • Ehkä sinä tulisi lisätä vastaukseesi selitys miksi tämä toimii (heille, jotka eivät ole matemaattisia ihmisiä).
  • hieno idea. Tulen huolehtimaan siitä tällä hetkellä. Annan ’ perustiedot mukana olevasta matematiikasta.
  • Ehkä voisit lyhentää sitä: muuta sqrt[1-x^2] (1-x^2)^.5)
  • ja voin poistaa * -merkin 2. Mathematican jälkeen on ihana.

Vastaa

Python (83 merkkiä)

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 

Vastaa

Husk , 28 25 24 tavua

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

Kokeile verkossa!

Laskee pi: n arvon rationaalilukuna käyttämällä äärettömän sarjan ensimmäiset 5000 termiä 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) ja poimi sitten ensimmäiset 500 numeroa.

Koodi pi-arvon laskemiseksi määritetystä lukumäärästä termejä on vain 13 tavua (Σ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 

Valitettavasti meidän täytyy sitten tuhlata 3 tavua määrittelemällä numero käytetyistä termeistä:

□70 # 70^2 = 4900 

Ja sitten vielä 8 tavua, jotka muuttavat rationaaliluvun (murtolukuna) sen numeroiksi desimaalimuodossa:

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

vastaus

PARI / GP, 14

\p500 acos(-1) 

Voit välttää laukaisun korvaamalla toinen rivi sanalla

gamma(.5)^2 

tai

(6*zeta(2))^.5 

tai

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

tai

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

tai

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

vastaus

Python3 136

Käyttää Madhava ”s -kaava.

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

Käyttää tätä kaava.

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

Vastaa

Mathematica (17 tavua)

N[ArcCos[-1],500] 

Pätevyyden todistus .

vastaus

Pyth , 21

u+/*GHhyHy^T500r^3T1Z 

Käyttää tätä algoritmia: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))), joka löytyy Golfscript-vastauksen kommenteista.

Kommentit

  • Tämä ei ’ ansaitse alamäkeä …
  • Tämä vastaus on väärä, se tuottaa 34247779. .. joka ei tietysti ole pi.
  • @orlp r -operaatiota muutettiin äskettäin tavalla, joka rikkoi tämän vastauksen. Muuta 1 arvoksi 0, ja se toimii nykyisessä pyytissä.

Vastaa

JavaScript, 60 tavua

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

Kokeile verkossa!

Kommentit

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

vastaus

bc -l (22 = 5 komentorivi + 17 ohjelmaa)

scale=500 4*a(1) 

Kommentit

  • Säännöt sanovat ” eikä se saa kutsua kirjastofunktiota pi: n laskemiseksi. ”
  • @Peter Ongelmana on kai ” kirjastofunktio ” ei ole aina hyvin määritelty termi, ja se pahenee vain, kun sanot ” laskeaksesi Pi ”, koska voit käyttää sitä välitulosten laskemiseen, esimerkiksi Sqrt () Alexandrussa

    vastaus.

  • Tämä on mielestäni huijausta, koska atan laskee 1/4 pi, mutta silti mielenkiintoinen ratkaisu.
  • @Thomas O : jos tämä on huijausta, missä ’ on raja?
  • trig-toiminnot olisi pitänyt kieltää tällaisten vastausten takia. idea on laskea pi algoritmilla, ei sisäänrakennetulla funktiolla. sqrt on hieman erilainen, koska se ’ ei ole trig-funktio.

Vastaa

Mathematica – 50

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

vastaus

Java 10 , 208 207 206 193 tavua

 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 tavua kiitos @ceilingcat .

Kokeile verkossa .

Tai koko ohjelmana (245 tavua):

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

Kokeile verkossa.

vastaus

aksiomi, 80 tavua

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

viitteeksi https://tuts4you.com/download.php?view.452 ; se olisi approksimaatio arvoon 6 * arctg (1 / sqrt (3)) =% pi ja se käyttää sarjalaajennusta 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 

Vastaa

05AB1E , 20 tavua

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

Portti Java-vastauksestani (503 korvattu nimellä 1000 – mikä tahansa \ $ \ geq503 \ $ on hyvä tulostaa ensimmäinen 500 numeroa tarkasti tällä lähestymistavalla).

Kokeile verkossa tai vahvista ” s on yhtä suuri kuin PI: n ensimmäiset 500 numeroa käyttämällä sisäänrakennettua žs .

Selitys:

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

Vastaa

Fortran, 154 tavua

Sekoitti rosettakoodi -ratkaisu. Tallennettu paljon tavuja käyttämällä implisiittisiä kokonaislukuja i j k l m n, print write -kohdan sijaan ja sekoittamalla asioita noin

Kokeile online-tilassa …

 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  

vastaus

APL (NARS2000), 20 tavua

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

En ole voinut testata tätä, mutta täällä ”on versio Dyalog APL: ssä. Ainoa ero niiden välillä on loppuliite ” x ”, jota käytetään NARS2000: n rationaalilukuihin, mutta ei ole käytettävissä Dyalogissa (tai muut verkossa olevat vaihtoehdot, sikäli kuin tiedän).

Se perustuu pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) -kaavaan kommenteissa hyväksytyn Golfscript-vastauksen alla.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *