Programas compactos para calcular pi con la fórmula de Leibniz
En artículos anteriores hemos comparado la eficiencia de programas en distintos lenguajes. En este vamos a comparar la simplicidad de los programas para resolver un problema.
Como ejemplo he elegido el problema del cálculo compacto del número mediante la fórmula de Leibniz
El enunciado de problema es el siguiente
Escribir un programa, con el menor número posible de caracteres, para calcular el número
usando la fórmula de Leibniz con un error menor que 0.00001.
El problema se ha planteado en Code Golf: Leibniz formula for Pi y se han escrito distintas respuestas que resumo al final del artículo. Antes voy a presentar programas compactos en nuestros lenguajes habituales (Haskell, Maxima y Common Lisp).
Programa en Haskell (con 34 caracteres)
1 |
4*sum[(-1)**x/(2*x+1)|x<-[0..1e5]] |
Una sesión es
1 2 3 4 |
Prelude> 4*sum[(-1)**x/(2*x+1)|x<-[0..1e5]] 3.1416026534897203 Prelude> abs(pi-4*sum[(-1)**x/(2*x+1)|x<-[0..1e5]]) < 1e-5 True |
Programa en Haskell (con 27 caracteres)
1 |
foldr1(-)$map(4/)[1,3..2e5] |
Una sesión es
1 2 3 4 |
> foldr1(-)$map(4/)[1,3..2e5] 3.141602653489794 > abs(pi-(foldr1(-)$map(4/)[1,3..2e5])) < 1e-5 True |
Programa en Maxima (con 38 caracteres)
1 |
bfloat(4*sum((-1)**x/(2*x+1),x,0,1e5)); |
Una sesión es
1 2 3 4 |
>bfloat(4*sum((-1)**x/(2*x+1),x,0,1e5)); 3.141602653489794b0 > is(abs(%pi-bfloat(4*sum((-1)**x/(2*x+1),x,0,1e5)))<1e-5); true |
Programa en Common Lisp (con 55 caracteres)
1 |
(loop for i from 1 upto 3e5 by 4 sum (/ 8d0 i (+ i 2))) |
Una sesión es
1 2 3 4 |
> (loop for i from 1 upto 3e5 by 4 sum (/ 8d0 i (+ i 2))) 3.141585986923141d0 > (< (abs (- pi (loop for i from 1 upto 3e5 by 4 sum (/ 8d0 i (+ i 2))))) 1e-5) T |
Resumen de la compacidad de los programas
La compacidad de los programas publicados en Code Golf: Leibniz formula for Pi se resume en la siguiente tabla
Conclusiones
De nuestros lenguajes habituales el programa más compacto es el de Haskell de 27 caracteres.
De todos los programas, el más corto es el siguiente programa en el lenguaje J con sólo 14 caracteres
1 |
4*-/%>:+:i.1e6 |
Si conoces programas más compactos para resolver el problema puedes escribirlo en los comentarios. Evidentemente, al no basarse en la fórmula de Leibniz, no se admiten la siguiente respuesta (con 6 caracteres)
1 |
3.1416 |
ni esta otra (con dos caracteres)
1 |
pi |