Calculer 500 chiffres de pi

Ecrire un programme pour calculer les 500 premiers chiffres de pi, en respectant les règles ci-dessous:

  • Il doit comporter moins de 500 caractères.
  • Il ne peut pas inclure « pi », « math.pi » ou des constantes pi similaires, ni appeler une fonction de bibliothèque pour calculer pi.
  • Il ne doit pas utiliser les chiffres « 3 », « 1 » et « 4 » consécutivement.
  • Il doit sexécuter dans un délai raisonnable (moins dune minute) sur un ordinateur moderne.

Le programme le plus court lemporte.

Commentaires

  • Pour vérifier si vos chiffres sont corrects: eveandersson.com/pi/digits
  • Sommes-nous autorisés à imprimer plus de 500 chiffres avec perte de précision après les 500 premiers?
  • @Alexandru, I supposons que oui, mais je préférerais le voir tronqué.
  • Pouvons-nous utiliser une bibliothèque HTTP pour télécharger un  » chiffres de pi  » site Web? 😉
  • Je suis venu ici en espérant obtenir quelque chose de joli et concis pour générer des approximations arbitraires de longueur de pi en python … Malheureusement, la solution python de @Soulman ‘ est apparemment réglé pour 500 chiffres; le remplacement de 500 par 1000 donne une réponse incorrecte. Je me demande sil existe un bon moyen de formuler un défi alternatif qui produirait une jolie fonction courte qui est généralement utile pour générer un nombre arbitraire de chiffres?

Réponse

Golfscript – 29 caractères

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

Je publierai une analyse plus tard

Commentaires

  • Pouvez-vous expliquer comment cela fonctionne?
  •  » Je publierai une analyse plus tard « . (attend 3 ans) ….
  •  » Je publierai lanalyse plus tard  » * attend plus plus de 6 ans *
  •  » Je publierai une analyse plus tard  » (attend 8 ans)
  • Toujours en attente …

Réponse

Mathematica (34 caractères): (sans « triche » avec trig)

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

Donc, pour expliquer la magie ici:
Integrate[function, lower, upper] vous donne laire sous la courbe « fonction » de « inférieur » à « supérieur ». Dans ce cas, cette fonction est [1-x^2]^.5, qui est une formule qui décrit la moitié supérieure dun cercle de rayon 1. Le cercle ayant un rayon de 1, il nexiste pas pour valeurs de x inférieures à -1 ou supérieures à 1. Par conséquent, nous trouvons laire dun demi-cercle. Lorsque nous multiplions par 2, nous obtenons laire à lintérieur dun cercle de rayon 1, qui est égal à pi.

Commentaires

  • Peut-être que vous devrait insérer, dans votre réponse, une explication de la raison pour laquelle cela fonctionne (pour les non-mathématiciens).
  • merveilleuse idée. Je vais y voir bientôt. Je ‘ Je vais donner une explication de base des mathématiques impliquées.
  • Vous pourriez peut-être le raccourcir: remplacez sqrt[1-x^2] par (1-x^2)^.5)
  • et je peux supprimer le * après le 2. Mathematica est merveilleux.

Réponse

Python (83 caractères)

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 

Réponse

Husk , 28 25 24 octets

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

Essayez-le en ligne!

Calcule la valeur de pi en tant que nombre rationnel en utilisant les 5000 premiers termes de la série infinie 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))), puis extrait les 500 premiers chiffres.

Le code pour calculer la valeur de pi à partir dun nombre spécifié de termes ne fait que 13 octets (Σ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 

Malheureusement, nous devons alors perdre 3 octets en spécifiant le nombre des termes à utiliser:

□70 # 70^2 = 4900 

Et puis 8 octets supplémentaires convertissant le nombre rationnel (exprimé sous forme de fraction) en ses chiffres sous forme décimale:

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

Réponse

PARI / GP, 14

\p500 acos(-1) 

Vous pouvez éviter trig en remplaçant la deuxième ligne avec

gamma(.5)^2 

ou

(6*zeta(2))^.5 

ou

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

ou

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

ou

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

Réponse

Python3 136

Utilise Madhava « s formule.

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

Utilise ceci formule.

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

Réponse

Mathematica (17 octets)

N[ArcCos[-1],500] 

Preuve de validité .

Réponse

Pyth , 21

u+/*GHhyHy^T500r^3T1Z 

Utilise cet algorithme: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) trouvé dans les commentaires de la réponse Golfscript.

Commentaires

  • Cela ne ‘ t mérite pas un vote défavorable …
  • Cette réponse est incorrecte, elle génère 34247779. .. qui, à ma connaissance, nest pas pi.
  • @orlp Lopération r a été récemment modifiée dune manière qui a cassé cette réponse. Remplacez 1 par 0, et cela fonctionnera dans Pyth actuel.

Réponse

JavaScript, 60 octets

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

Essayez-le en ligne!

Commentaires

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

Réponse

bc -l (22 = 5 ligne de commande + 17 programme)

scale=500 4*a(1) 

Commentaires

  • Les règles disent  » et ne peuvent pas appeler une fonction de bibliothèque pour calculer pi.  »
  • @Peter Le problème, je suppose, est que  » fonction de bibliothèque  » nest pas toujours un terme bien défini, et il ne fait quempirer lorsque vous dites  » pour calculer Pi « , comme vous pouvez lutiliser pour calculer des résultats intermédiaires, par exemple Sqrt () dans Alexandru

    .

  • Je pense que cest de la triche car atan calcule 1/4 pi mais cest néanmoins une solution intéressante.
  • @Thomas O : si cest de la triche, où ‘ est la limite?
  • les fonctions trigonométriques auraient dû être interdites à cause de réponses comme celle-ci. lidée est de calculer pi avec un algorithme, pas une fonction intégrée. sqrt est un peu différent car il ‘ nest pas une fonction trigonométrique.

Réponse

Mathematica – 50

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

Réponse

Java 10 , 208 207 206 193 octets

 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 octets grâce à @ceilingcat .

Essayez-le en ligne .

Ou en programme complet (245 octets):

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

Essayez-le en ligne.

Réponse

Axiome, 80 octets

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

pour référence https://tuts4you.com/download.php?view.452 ; ce serait une estimation de 6 * arctg (1 / sqrt (3)) =% pi et il utiliserait une extension de série pour 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 

Réponse

05AB1E , 20 octets

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

Port de ma réponse Java (avec le 503 remplacé par 1000 – tout \ $ \ geq503 \ $ est parfait pour afficher le premier 500 chiffres avec précision avec cette approche).

Essayez-le en ligne ou vérifiez-le  » s égale aux 500 premiers chiffres de PI en utilisant le žs intégré.

Explication:

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

Réponse

Fortran, 154 octets

A manqué le solution de code rosetta . Beaucoup doctets enregistrés en utilisant des entiers implicites i j k l m n, print au lieu de write, et en mélangeant les choses autour

Essayez-le en ligne …

 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  

Réponse

APL (NARS2000), 20 octets

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

Je nai « pas pu tester cela, mais voici » une version dans Dyalog APL. La seule différence entre eux est le suffixe  » x « , qui est utilisé pour les nombres rationnels dans NARS2000 mais nest pas disponible dans Dyalog (ou autres variantes disponibles en ligne, pour autant que je sache).

Elle est basée sur la formule pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) dans les commentaires sous la réponse Golfscript acceptée.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *