Calcola 500 cifre di pi

Scrivi un programma per calcolare le prime 500 cifre di pi greco, rispettando le regole seguenti:

  • Deve contenere meno di 500 caratteri.
  • Non può includere “pi”, “math.pi” o costanti pi simili, né può chiamare una funzione di libreria per calcolare pi greco.
  • Non può utilizzare le cifre “3”, “1” e “4” consecutivamente.
  • Deve essere eseguito in un tempo ragionevole (meno di 1 minuto) su un computer moderno.

Vince il programma più breve.

Commenti

  • Per controllare se le cifre sono corrette: eveandersson.com/pi/digits
  • Siamo autorizzati a stampare più di 500 cifre con perdita di precisione dopo le prime 500?
  • @Alexandru, I supponiamo di sì, ma preferirei vederlo troncato.
  • Possiamo usare una libreria HTTP per scaricare ” cifre di pi ” sito web? 😉
  • Sono venuto qui sperando di ottenere qualcosa di carino e conciso per generare approssimazioni arbitrarie di lunghezza di pi in python … purtroppo la soluzione python di @Soulman ‘ è apparentemente sintonizzato per 500 cifre; sostituire 500 con 1000 dà una risposta errata. Mi chiedo se esiste un buon modo di formulare una sfida alternativa che produca una bella funzione breve che è generalmente utile per generare un numero arbitrario di cifre?

Risposta

Golfscript – 29 caratteri

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

Pubblicherò lanalisi più tardi

Commenti

  • Potresti spiegare come funziona?
  • ” Pubblicherò lanalisi più tardi “. (aspetta 3 anni) ….
  • ” posterò lanalisi più tardi ” * aspetta di più di 6 anni *
  • ” posterò lanalisi più tardi ” (aspetta 8 anni)
  • Ancora in attesa …

Risposta

Mathematica (34 caratteri): (senza “barare” con trig)

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

Quindi, per spiegare la magia qui:
Integrate[function, lower, upper] ti dà larea sotto la curva “funzione” da “inferiore” a “superiore”. In questo caso, la funzione è [1-x^2]^.5, che è una formula che descrive la metà superiore di un cerchio con raggio 1. Poiché il cerchio ha raggio 1, non esiste per valori di x inferiori a -1 o superiori a 1. Pertanto, stiamo trovando larea di mezzo cerchio. Quando moltiplichiamo per 2, otteniamo larea allinterno di un cerchio di raggio 1, che è uguale a pi greco.

Commenti

  • Forse tu dovresti inserire, nella tua risposta, una spiegazione del perché funziona (per loro non matematici).
  • idea meravigliosa. Ci penserò subito. ‘ fornirò una spiegazione di base della matematica coinvolta.
  • Forse potresti accorciarla: cambia sqrt[1-x^2] in (1-x^2)^.5)
  • e posso rimuovere * dopo il 2. Mathematica è meraviglioso.

Risposta

Python (83 caratteri)

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 

Risposta

Husk , 28 25 24 byte

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

Provalo online!

Calcola il valore di pi greco come numero razionale utilizzando i primi 5000 termini della serie infinita 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))), quindi estrae le prime 500 cifre.

Il codice per calcolare il valore di pi greco da un numero specificato di termini è solo di 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 

Sfortunatamente, dobbiamo quindi sprecare 3 byte specificando il numero di termini da utilizzare:

□70 # 70^2 = 4900 

E poi altri 8 byte che convertono il numero razionale (espresso come frazione) nelle sue cifre in forma decimale:

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

Risposta

PARI / GP, 14

\p500 acos(-1) 

Puoi evitare lattivazione sostituendo la seconda riga con

gamma(.5)^2 

o

(6*zeta(2))^.5 

o

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

o

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

o

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

Risposta

Python3 136

Utilizza Madhava “s formula.

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

Utilizza questo formula.

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

Risposta

Mathematica (17 byte)

N[ArcCos[-1],500] 

Prova di validità .

Risposta

Pyth , 21

u+/*GHhyHy^T500r^3T1Z 

Utilizza questo algoritmo: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) trovato nei commenti della risposta Golfscript.

Commenti

  • Questo ‘ t merita un voto negativo …
  • Questa risposta non è corretta, genera 34247779. .. che, per quanto ne so, non è pi.
  • @orlp Loperazione r è stata recentemente modificata in un modo che ha rotto questa risposta. Cambia 1 in 0 e funzionerà nel Pyth corrente.

Risposta

JavaScript, 60 byte

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

Provalo online!

Commenti

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

Risposta

bc -l (22 = 5 riga di comando + 17 programma)

scale=500 4*a(1) 

Commenti

  • Le regole dicono ” né può chiamare una funzione di libreria per calcolare pi greco. ”
  • @Peter Il problema è che ” funzione di libreria ” non è sempre un termine ben definito e peggiora solo quando dici ” per calcolare Pi “, poiché puoi usarlo per calcolare risultati intermedi, ad esempio Sqrt () in Alexandru

    s risposta.

  • Penso che questo sia un imbroglio perché atan calcola 1/4 pi ma è comunque una soluzione interessante.
  • @Thomas O : se questo è un imbroglio, dove ‘ è il limite?
  • le funzioni trigonometriche avrebbero dovuto essere proibite a causa di risposte come questa. lidea è di calcolare pi greco con un algoritmo, non una funzione incorporata. sqrt è leggermente diverso in quanto ‘ non è una funzione trigonometrica.

Risposta

Mathematica – 50

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

Answer

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 grazie a @ceilingcat .

Provalo online .

O come programma completo (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));}}  

Provalo online.

Risposta

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

per riferimento https://tuts4you.com/download.php?view.452 ; sarebbe unapprossimazione di 6 * arctg (1 / sqrt (3)) =% pi e userebbe lespansione serie per 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 

Risposta

05AB1E , 20 byte

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

Porta della mia risposta Java (con 503 sostituito con 1000 – qualsiasi cosa \ $ \ geq503 \ $ va bene per produrre il primo 500 cifre accuratamente con questo approccio).

Provalo online o verificalo ” è uguale alle prime 500 cifre di PI utilizzando la spiegazione incorporata žs .

:

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

Risposta

Fortran, 154 byte

Ha manipolato il codice rosetta . Molti byte salvati utilizzando numeri interi impliciti i j k l m n, print invece di write e mescolando le cose in giro

Provalo 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  

Risposta

APL (NARS2000), 20 byte

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

Non sono stato in grado di testarlo, ma qui “è una versione in Dyalog APL. Lunica differenza tra loro è il suffisso ” x “, che viene utilizzato per i numeri razionali in NARS2000 ma non è disponibile in Dyalog (o altre varianti disponibili online, per quanto ne so).

Si basa sulla formula pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) nei commenti sotto la risposta accettata da Golfscript.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *