31 votes

Code Golf: formule de Leibniz pour Pi

J'ai récemment posté un de mes préférés interview de tableau de codage des questions dans "Quel est votre plus controversés de la programmation de l'opinion", qui consiste à écrire une fonction qui calcule Pi en utilisant la formule de Leibniz.

Il peut être abordée dans un certain nombre de façons différentes, et la sortie à l'état, il faut un peu de réflexion, j'ai donc pensé qu'il pourrait être intéressant de code de golf de la question. Plus court code gagne!

Étant donné que Pi peut être estimée à l'aide de la fonction 4 * (1 - 1/3 + 1/5 - 1/7 + ...) avec plus de termes en donnant plus de précision, écrire une fonction qui calcule Pi à l'intérieur de 0.00001.

Edit: 3 Jan 2008

Comme suggéré dans les commentaires, j'ai changé la sortie de la condition d'être à moins de 0,00001 que c'est vraiment ce que je voulait dire (une précision de 5 décimales est beaucoup plus difficile en raison de l'arrondissement et je ne veux pas de demander que, dans une interview, alors que dans 0.00001 est plus facile à comprendre et à mettre en œuvre à la sortie de l'affection).

Aussi, afin de répondre aux commentaires, je suppose que mon intention était que la solution doit calculer le nombre d'itérations, ou de vérifier quand il en avait assez fait, mais il n'y a rien pour vous empêcher de le pré-calcul du nombre d'itérations et de l'aide de ce numéro. J'ai vraiment posé la question de l'intérêt de voir ce que les gens viennent avec.

61voto

friol Points 4806

J, 14 caractères

4*-/%>:+:i.1e6

Explication

  • 1e6 est le numéro 1 suivi de 6 zéros (1000000).
  • i.y génère la première y non les nombres négatifs.
  • +: est une fonction qui double à chaque élément de la liste argument.
  • >: est une fonction qui incrémente de un chaque élément de la liste d'argument.

Ainsi, l'expression >:+:i.1e6 génère le premier million de nombres impairs:

1 3 5 7 ...

  • % est la réciproque de l'opérateur (numérateur "1" peut être omis).
  • -/ t une autre somme de chaque élément dans la liste d'argument.

Ainsi, l'expression -/%>:+:i.1e6 génère de l'autre la somme des inverses de la première d'un million de nombres impairs:

1 - 1/3 + 1/5 - 1/7 + ...

  • 4* est une multiplication par quatre. Si vous multipliez par quatre précédentes somme, vous avez π.

Ça y est! J est un langage puissant pour les mathématiques.


Edit: étant donné que la production de 9! (362880) conditions pour l'autre somme est suffisante pour avoir 5 chiffres décimaux exactitude, et, depuis, la formule de Leibniz peut être aussi écrit de cette façon:

4 - 4/3 + 4/5 - 4/7 + ...

...vous pouvez écrire une courte, 12 chars version du programme:

-/4%>:+:i.9!

37voto

strager Points 41713

Langue: Brainfuck, Nombre de personnages: 51/59

Est-ce que ça compte? =]

Parce qu'il n'y a pas de nombres à virgule flottante dans Brainfuck, il était assez difficile de faire fonctionner les divisions correctement. Grr.

Sans nouvelle ligne (51):

 +++++++[>+++++++<-]>++.-----.+++.+++.---.++++.++++.
 

Avec nouvelle ligne (59):

 +++++++[>+++++++>+<<-]>++.-----.+++.+++.---.++++.++++.>+++.
 

24voto

JB. Points 12482

Perl

26 caractères

26 seulement la fonction, 27, de calculer, de 31 à imprimer. D'après les commentaires de cette réponse.

sub _{$-++<1e6&&4/$-++-&_}       # just the sub
sub _{$-++<1e6&&4/$-++-&_}_      # compute
sub _{$-++<1e6&&4/$-++-&_}say _  # print

28 caractères

28 juste de l'informatique, de 34 à imprimer. D'après les commentaires. Notez que cette version ne peut pas utiliser de 'dire'.

$.=.5;$\=2/$.++-$\for 1..1e6        # no print
$.=.5;$\=2/$.++-$\for$...1e6;print  # do print, with bonus obfuscation

36 caractères

36 informatique, 42 à imprimer. Hudson prendre à dreeves du réarrangement, à partir des commentaires.

$/++;$\+=8/$//($/+2),$/+=4for$/..1e6
$/++;$\+=8/$//($/+2),$/+=4for$/..1e6;print

Sur le nombre d'itérations: aussi loin que mes maths souvenirs aller, 400000 est prouvable assez pour être précis à 0,00001. Mais un million de dollars (ou aussi bas que 8e5) fait la virgule expansion en fait match 5 fractions d'endroits, et c'est le même nombre de caractères, donc j'ai gardé cette.

23voto

Zach Langley Points 3523

Ruby, 33 caractères

 (0..1e6).inject{|a,b|2/(0.5-b)-a}
 

20voto

CMS Points 315406

Une autre version C #:

(60 caractères)

 4*Enumerable.Range(0, 500000).Sum(x => Math.Pow(-1, x)/(2*x + 1));  // = 3,14159
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X