Código de cálculo Pi Golf [cerrado]


17

El reto

Debe calcular pi en la longitud más corta posible. Cualquier idioma es bienvenido y puede usar cualquier fórmula para calcular pi. Debe poder calcular pi con al menos 5 decimales. Más corto, se mediría en caracteres. La competencia dura 48 horas. Empezar.


Nota : Esta pregunta similar establece que PI debe calcularse utilizando la serie 4 * (1 - 1/3 + 1/5 - 1/7 + ...). Esta pregunta no tiene esta restricción, y de hecho muchas de las respuestas aquí (incluida la más probable de ganar) serían inválidas en esa otra pregunta. Entonces, esto no es un duplicado.


55
@hvd ¿Por qué crees que debería ser descalificado? Se ajusta a las especificaciones ...
Dr. belisarius

55
@hvd acos (-1). ¡Yo gano!
Level River St

44
Esto se ve raro, inconsistente. Calcular π tiene que dividir un círculo por su diámetro, o alguna otra operación que dé π. Si aceptamos hacer 355/113 , que no tiene nada que ver con π excepto la suerte, como @ace, entonces lógicamente deberíamos aceptar hacer 3.14159 .
Nicolas Barbulesco

77
No entiendo por qué a la gente le gusta esta pregunta. Esta es una de las preguntas más mal definidas y poco interesantes que he visto aquí. La única diferencia entre este y hello world es que tiene algo que ver con Pi.
Cruncher

8
Para hacer esta pregunta interesante, necesita una función de puntuación que recompense dígitos de pi por byte de código.
Ben Jackson

Respuestas:


56

Python3, 7

Se ejecuta en el shell interactivo

355/113

Salida: 3.1415929203539825correcta a 6 decimales

¡Y finalmente tengo una solución que supera a APL!

Ah, y en caso de que te lo preguntes, esta relación se llama 密 率 (literalmente "relación precisa"), y es propuesta por el matemático chino Zu Chongzhi (429-500 DC). Un artículo relacionado de Wikipedia se puede encontrar aquí . Zu también dio la relación 22/7 como la "relación aproximada", y se sabe que es el primer matemático en proponer que 3.1415926 <= pi <= 3.1415927


12
mhmh: esa es en realidad una respuesta políglota. ¡También funciona en Smalltalk!
blabla999

77
¡Blasfemia! ¡Es apenas un cálculo!
mniip

3
bueno, es una división, y su precisión satisface el requisito ... (e incluso la Biblia es menos precisa; no etiquetarías esa blasfemia, ¿verdad? 3 * ;-)
blabla999

29
El momento incómodo cuando escribí esto como una respuesta seria pero todos lo interpretan como una broma ...
user12205

20
Lo más votado respuesta: 355/113. Bajo votaron respuesta: 3+.14159. No veo mucha diferencia, de verdad.
primo

49

PHP - 132 127 125 124 bytes

Simulación básica de Montecarlo. Cada 10 millones de iteraciones, imprime el estado actual:

for($i=1,$j=$k=0;;$i++){$x=mt_rand(0,1e7)/1e7;$y=mt_rand(0,1e7)/1e7;$j+=$x*$x+$y*$y<=1;$k++;if(!($i%1e7))echo 4*$j/$k."\n";}

¡Gracias a cloudfeet y zamnuts por sus sugerencias!

Salida de muestra:

$ php pi.php
3.1410564
3.1414008
3.1413388
3.1412641
3.14132568
3.1413496666667
3.1414522857143
3.1414817
3.1415271111111
3.14155092
...
3.1415901754386
3.1415890482759
3.1415925423731

55
¡Para una respuesta que realmente computa!
blabla999

No sé sobre PHP, pero en JS puede hacer algo como: lo $j+=$x*$x+$y*$y<=1;que le ahorraría cuatro bytes.
cloudfeet

1
También $k+=1/4;y print $j/$kpodría reducirse a $k++;y print 4*$j/$kpara otro byte.
cloudfeet

@cloudfeet - Cambios realizados, el código confirmado todavía se ejecuta igual. ¡Gracias!

2
@MarkC - Conceptualmente está lanzando dardos al azar en un rectángulo de 0,0 a 1,1. Aquellos menores o iguales a la distancia 1 de 0,0 se consideran adentro, de lo contrario afuera. La forma de esta distancia 1 es un cuarto de círculo o π / 4. El [número de dardos dentro del cuarto de círculo] / [número total de dardos] se aproximará a π / 4 a medida que aumenta el número de muestras.

31

J 6

{:*._1

Explicación: *.da la longitud y el ángulo de un número complejo. El ángulo de -1 es pi. {:toma la cola de la lista [longitud, ángulo]

Solo para los fetichistas de la serie de convergencia lenta, para 21 bytes, una serie de Leibniz:

      +/(4*_1&^%>:@+:)i.1e6
 3.14159

12
En otras palabras, esto es atan(0) + pi. No creo que el uso de funciones trigonométricas y pi en sí deba contar como un "cálculo".
Jason C

@JasonC Arg(es decir, argumento de un número complejo) no es una función trigonométrica, a pesar de tener valores similares a los de arcotangente
mniip

1
@mniip Sí, lo es. Es solo un sinónimo de atan (bueno, atan2) en las partes real e imaginaria. Como puede ver allí, es exactamente igual, por definición, a atan(0) + pi.
Jason C

25

Perl, 42 bytes

map{$a+=(-1)**$_/(2*$_+1)}0..9x6;print$a*4

Calcula π usando la fórmula de Leibniz :

Fórmula de Leipniz

999999 se utiliza como n más grande para obtener la precisión de cinco dígitos decimales.

Resultado: 3.14159165358977


¡Esto es genial! Me inspiró a escribir uno en Java 8.
David Conrad

19

Piet, muchos codeles

No es mi respuesta, pero esta es la mejor solución que he visto para este problema:

Aproximación de Pi en Piet

Entiendo que suma los píxeles en el círculo y los divide por el radio, y luego nuevamente. Es decir:

A = πr²  # solve for π
π = A/r²
π = (A/r)/r

Un mejor enfoque en mi mente es un programa que genera esta imagen en un tamaño arbitrario y luego la ejecuta a través de un intérprete Piet.

Fuente: http://www.dangermouse.net/esoteric/piet/samples.html


¿Podría explicar lo que realmente hace? (Conozco la idea general detrás de Piet, pero una explicación sobre cómo funciona este programa en particular sería una buena adición a su respuesta).
plannapus

Realmente no conozco a Piet, pero creo que esto mide literalmente el área del círculo rojo y luego se divide por el radio dos veces, resolviendo para π = A / (r * r)
No es que Charles

Bueno, el área es bastante clara, ya que cuando el puntero ingresa al círculo rojo, cuenta el número de códeles en el área roja y lo empuja a la pila al salir (ya que el punto de salida es rojo oscuro, por lo tanto, no hay cambio de tono pero un paso más oscuro ), es la parte "dividir por el radio cuadrado" que tuve problemas para entender.
plannapus

1
@plannapus El radio está "codificado" en la línea roja oscura que se extiende desde la esquina superior izquierda hasta la mitad del borde izquierdo (es difícil de ver en la imagen). Piet es difícil de seguir, pero la esencia es que los bloques de color tienen un valor igual a su área (la línea en el borde izquierdo tiene r píxeles, el círculo tiene píxeles de área ), y las cosas intermedias son solo un montón de operaciones de pila y aritméticas. Los programas comienzan en la esquina superior izquierda. El texto en la parte superior derecha es esencialmente un comentario.
Jason C

2
@ JasonC ah, por supuesto! ¡El círculo toca el lado superior e inferior, por lo que la línea roja oscura que desciende desde el lado superior hasta el centro exacto es necesario el radio! ¡Inteligente!
plannapus

18

TÉCNICAMENTE ESTOY CALCULANDO, 9

0+3.14159

TÉCNICAMENTE ESTOY CALCULANDO, 10

PI-acos(1)

ESTOY CALCULANDO TAN DURO, 8

acos(-1)

ACCIDENTEMENTE PI, 12

"3.14"+"159"

Y técnicamente, esta respuesta apesta.


31
Así que encabezado, mucho título grande, mucho dolor para mis ojos, wow.
Pierre Arlaud

1
Pluzz wan por mucho lulz, gracias
Jonathan Van Matre

Hola bebé, ¿quieres expandir mi serie Taylor?
Jason C


@SimonT No respondiste mi pregunta sobre la serie Taylor. Pero mientras lo piensa, vea mis comentarios sobre la pregunta y la mayoría de las otras respuestas aquí. : P
Jason C

14

APL - 6

2ׯ1○1

Salidas 3.141592654. Calcula el doble del arcoseno de 1.

Una solución de 13 caracteres sería:

--/4÷1-2×⍳1e6

Esto resulta 3.141591654para mí, que se ajusta a la precisión solicitada.
Sin + 4/1 - 4/3 + 4/5 - 4/7 ...embargo, utiliza la serie simple para calcular.


1
¡Vaya, esa es una convergencia lenta!

Mi primer pensamiento fue "¿por qué no ¯2○¯1?" (Es decir, acos -1). Pero eso da una aproximación compleja en repl.it ( 3.1415926425236J¯1.1066193467303274e¯8). ¿Alguna idea de por qué? ¿Todas las implementaciones hacen eso?
James Wood

+1 para tu segunda solución. 2 * asin(1)es un poco tramposo, sin embargo.
Jason C

@JamesWood No conozco APL, pero si tuviera que adivinar diría que intentó hacer un sqrt(1-theta^2)(que aparece en muchas identidades trigonométricas) en algún momento y perdió algo de precisión en algún lugar, terminando con un poco negativo 1-theta^2.
Jason C

1
Lo extraño es que todavía hay una pequeña parte imaginaria para acos -0.75. No hay forma de que pueda 1 - 0.75 ^ 2ser negativo.
James Wood

14

J - 5 bytes

|^._1

Este medio |log(-1)|.


Uso inteligente de la identidad de Euler.
primo

1
Genial, otra respuesta de identidad algebraica. Tan inteligente como ln(e^(42*pi))/42o pi*113/113.
Jason C

También funciona en TI-BASIC
Timtech

1
(Totalmente sin relación, desearía poder usar LaTeX en codegolf.)
Jason C

1
(Respuesta a una pregunta totalmente no relacionada, me las arreglo con los gráficos de Google, por ejemplo aquí ). En el tema, esta es la respuesta más acertada, y por lo tanto debería haber sido aceptada.
primo

14

Calculadora Google, 48

stick of butter*(26557.4489*10^-9)/millimeters^3

Toma un trozo de mantequilla, hace cálculos avanzados, hace pi con él. Pensé que como todos los demás estaban haciendo respuestas matemáticas simples, agregaría una un poco más única.

Ejemplo


3
El stick of butteres lindo y divertido, pero esta es esencialmente otra pi*x/x+y-yidentidad algebraica.
Jason C

10
Hay muchas maneras mejores de hacer pi usando un trozo de mantequilla
No es que Charles

¿Has intentado hacer mantequilla con un palo de pi?
mbomb007

12

Octava, 31

quad(inline("sqrt(4-x^2)"),0,2)

Calcula el área de un cuarto de círculo con radio 2, a través de la integración numérica.

octave:1> quad(inline("sqrt(4-x^2)"),0,2)
ans =     3.14159265358979

1
¡Agradable! +1 cuando mis votos se recargan.
Jason C


10

Python, 88

Solución:

l=q=d=0;t,s,n,r=3.,3,1,24
while s!=l:l,n,q,d,r=s,n+q,q+8,d+r,r+32;t=(t*n)/d;s+=t
print s

Salida de muestra en Python Shell:

>>> print s
3.14159265359

Logra evitar cualquier importación. Se puede intercambiar fácilmente para usar la biblioteca Decimal de precisión arbitraria; simplemente reemplace 3.con Decimal('3'), establezca la precisión antes y después, luego unario más el resultado para convertir la precisión.

Y a diferencia de una gran cantidad de las respuestas aquí, en realidad calcula π lugar de depender de constantes integradas o falsedad de matemáticas, es decir math.acos(-1), math.radians(180), etc.


9

lenguaje ensamblador x86 (5 caracteres)

fldpi

Sin embargo, si esto carga una constante desde la ROM o si realmente calcula la respuesta depende del procesador (pero al menos en algunos, en realidad hace un cálculo, no solo carga el número desde la ROM). Para poner las cosas en perspectiva, se enumera como tomar 40 ciclos de reloj en un 387, lo que es más de lo que parece tener sentido si solo cargara el valor de la ROM.

Si realmente desea garantizar un cálculo, puede hacer algo como:

fld1
fld1
fpatan
fimul f

f dd 4

[para 27 caracteres]


1
¿Puedes explicar, por favor?
Nicolas Barbulesco

Y, en algunos procesadores, ¿qué haría el cálculo fldpi?
Nicolas Barbulesco

1
No creo que usar un comando que cargue pi (o incluso lo calcule basándose en la implementación asin de otra persona o en cualquier implementación de función trigonométrica existente) realmente cuenta en el espíritu de "calcular" cualquier cosa (el factor "ensamblador omg" no ' Realmente cambia eso). Quizás transfiera esto a la implementación de ensamblador más corta posible, y puede llamarse un "cálculo".
Jason C

2
@JasonC: A mí me parece una noción completamente arbitraria, sin más sentido que decidir que las personas tienen que implementar la suma, la resta, la multiplicación y la división por su cuenta si quieren usarlas.
Jerry Coffin

3
@JerryCoffin En lugar de discutir tecnicismos, basta con decir que ni asin(-1)tampoco fldpison particularmente interesantes o creativos. No tiene mucho sentido competir para ver qué idioma favorito tiene el nombre más corto para las funciones trigonométricas predefinidas y las constantes pi.
Jason C

8

bc -l, 37 bytes

for(p=n=2;n<7^7;n+=2)p*=n*n/(n*n-1);p

No veo ninguna otra respuesta usando el producto Wallis , así que dado que lleva el nombre de mi homónimo (mi profesor de Historia de las Matemáticas recibió un gran impulso de eso), no pude resistirme.

Resulta que es un algoritmo bastante agradable desde la perspectiva del golf, pero su tasa de convergencia es abismal: se acerca a 1 millón de iteraciones solo para obtener 5 decimales:

$ time bc -l<<<'for(p=n=2;n<7^7;n+=2)p*=n*n/(n*n-1);p'
3.14159074622629555058

real    0m3.145s
user    0m1.548s
sys 0m0.000s
$ 

bc -l, 15 bytes

Alternativamente, podemos usar Newton-Raphson para resolver sin(x)=0, con una aproximación inicial de 3. Debido a que esto converge en muy pocas iteraciones, simplemente codificamos 2 iteraciones, lo que da 10 decimales:

x=3+s(3);x+s(x)

La fórmula iterativa según Newton-Raphson es:

x[n+1] = x[n] - ( sin(x[n]) / sin'(x[n]) )

sin'=== cosy cos(pi)=== -1, así que simplemente aproximamos el costérmino para obtener:

x[n+1] = x[n] + sin(x[n])

Salida:

$ bc -l<<<'x=3+s(3);x+s(x)'
3.14159265357219555873
$ 

¡+1 ahora es más parecido!
Jason C

@JasonC ¿Cuál es su opinión sobre la aplicación de Newton-Raphson para resolver sin (x) = 0 (ver edición)?
Trauma digital

6

pitón - 47 45

pi se calcula realmente sin funciones trigonométricas o constantes.

a=4
for i in range(9**6):a-=(-1)**i*4/(2*i+3)

resultado:

>>> a
3.1415907719167966

Debería poder guardar un byte soltando el cero después del decimal para la interpretación de flotación forzada. :) Puntos de bonificación por brevedad, pero me gustan los míos por precisión arbitraria y menor utilización de memoria. (Editado rayar la idea paréntesis; veo lo que está pasando allí y mi aisladas prueba no coger el tema.)
amcgregor

UH no. Después de su modificación esto ya no da salida válida. (265723 ≭ π) Todavía necesita el período, pero no el cero final.
amcgregor

@amcgregor usa python 3?
qwr

Lo hago, aunque principalmente desarrollo bajo 2.7 y hago que mi código funcione en ambos. Sin embargo, en la instalación estándar de Mac 10.9 python3, su código causa un error de segmentación.
amcgregor

@amcgregor Lo acabo de probar, funciona para mí (python 3.3.4)
qwr

6

C, 99

Calcula directamente el área / r ^ 2 de un círculo.

double p(n,x,y,r){r=10000;for(n=x=0;x<r;++x)for(y=1;y<r;++y)n+=x*x+y*y<=r*r;return(double)n*4/r/r;}

Esta función calculará pi contando el número de píxeles en un círculo de radio y rluego dividiendo entre r*r(en realidad solo calcula un cuadrante). Con r10000, tiene una precisión de 5 decimales (3.1415904800). Los parámetros de la función se ignoran, los acabo de declarar allí para ahorrar espacio.


6

Javascript, 43 36

x=0;for(i=1;i<1e6;i++){x+=1/i/i};Math.sqrt(6*x)

x se convierte zeta(2)=pi^2/6 así sqrt(6*x)=pi. (47 caracteres)

Después de usar la propiedad distributiva y eliminar los corchetes del forbucle, obtienes:

x=0;for(i=1;i<1e6;i++)x+=6/i/i;Math.sqrt(x)

(43 caracteres)

Vuelve:

3.14159169865946

Editar:

Encontré una forma aún más corta usando el producto Wallis:

x=i=2;for(;i<1e6;i+=2)x*=i*i/(i*i-1)

(36 caracteres)

Vuelve:

3.141591082792245

6

Python, Riemann zeta (58 41 char)

(6*sum(n**-2for n in range(1,9**9)))**0.5

O ahorre dos caracteres, pero use scipy

import scipy.special as s
(6*s.zeta(2,1))**0.5

Editar : Guardado 16 (!) Caracteres gracias a amcgregor


1
Potencialmente puede evitar la mathimportación y la sqrtllamada girando a la exponenciación en su lugar:(6*sum(n**-2 for n in range(1,9**9)))**0.5
amcgregor

5

Javascript: 99 caracteres

Usando la fórmula dada por Simon Plouffe en 1996, esto funciona con 6 dígitos de precisión después del punto decimal:

function f(k){return k<2?1:f(k-1)*k}for(y=-3,n=1;n<91;n++)y+=n*(2<<(n-1))*f(n)*f(n)/f(2*n);alert(y)

Esta variante más larga (130 caracteres) tiene una mejor precisión, 15 dígitos después del punto decimal:

function e(x){return x<1?1:2*e(x-1)}function f(k){return k<2?1:f(k-1)*k}for(y=-3,n=1;n<91;n++)y+=n*e(n)*f(n)*f(n)/f(2*n);alert(y)

Hice esto basado en mis dos respuestas a esta pregunta .


5

Rubí, 54 50 49

p (0..9**6).map{|e|(-1.0)**e/(2*e+1)*4}.reduce :+

Versión en línea para pruebas.

Otra versión sin crear una matriz (50 caracteres):

x=0;(0..9**6).each{|e|x+=(-1.0)**e/(2*e+1)*4}; p x

Versión en línea para pruebas.


Es interesante ver las diferencias de idioma que pueden ofrecer soluciones tan compactas. Por ejemplo, la traducción de Python de lo anterior es de 105 caracteres (después de usar algunos trucos de compresión de código triviales): a=__import__;reduce(a('operator').__add__,a('itertools').imap(lambda e:(-1.0)**e/(2*e+1)*4,xrange(9**6)))- tenga en cuenta el uso de xrange / imap; en Python 3 puedes evitar esto; básicamente no quiero que toda tu RAM se consuma construyendo una lista con tantas entradas.
amcgregor

1
Estás absolutamente en lo correcto. A menudo es muy conveniente usar (especialmente Ruby) las funciones Array y Enumerable, aunque en realidad podría no ser la mejor idea en términos de rendimiento y velocidad ... Bueno, pensando en eso, debería ser posible hacer el cálculo con el Alcance cada método en lugar de crear un mapa.
David Herrmann

Sí, es posible, solo un personaje más ...
David Herrmann

Su primera respuesta no es tan precisa como la segunda.
Josh

¿Podrías dar más detalles, por favor? ¿El mismo algoritmo, la misma salida para mí?
David Herrmann

5

TI CAS, 35

lim(x*(1/(tan((180-360/x)/2))),x,∞)

1
Miré hacia atrás y olvidé por completo cómo funciona: P
TheDoctor

5

Perl - 35 bytes

$\=$\/(2*$_-1)*$_+2for-46..-1;print

Produce precisión de coma flotante completa. Una derivación de la fórmula utilizada se puede ver en otra parte .

Uso de la muestra:

$ perl pi.pl
3.14159265358979

Versión de precisión arbitraria

use bignum a,99;$\=$\/(2*$_-1)*$_+2for-329..-1;print

Extienda según sea necesario. La longitud de la iteración (p -329..-1. Ej. ) Debe ajustarse para que sea aproximadamente log 2 (10)3.322 veces el número de dígitos.

3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211707

O, usando en su bigintlugar:

use bigint;$\=$\/(2*$_-1)*$_+2e99for-329..-1;print

Esto funciona notablemente más rápido, pero no incluye un punto decimal.

3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

5

C # 192

class P{static void Main(){var s=(new System.Net.WebClient()).DownloadString("http://www.ctan.org/pkg/tex");System.Console.WriteLine(s.Substring(s.IndexOf("Ver&shy;sion")+21).Split(' ')[0]);}}

Salidas:

3.14159265

No hay matemáticas involucradas. Simplemente busca la versión actual de TeX y realiza un análisis primitivo del html resultante. Eventualmente se convertirá en π según Wikipedia .


Llego 5 años tarde, pero esta es una laguna estándar que se creó 4 días antes de esta respuesta.
Benjamin Urquhart

5

Python 3 Monte Carlo (103 caracteres)

from random import random as r
sum(1 for x,y in ((r(),r()) for i in range(2**99)) if x**2+y**2<1)/2**97

5

Game Maker Language, 34

Asume todas las variables no inicializadas como 0. Esto es predeterminado en algunas versiones de Game Maker.

for(i=1;i<1e8;i++)x+=6/i/i;sqrt(x)

Resultado:

3.14159169865946

muy agradable. también, en C float k(){double x=0,i=0;for(;i++<999999;)x+=6/i/i;return sqrt(x);}es más corto que este
izabera

aún más corto con el 1e8lugar de 999999
izabera

¿Podría usar for(i=1;i<1e8;)x+=6/i/i++;sqrt(x)para guardar un byte (o alternativamente for(i=1;i++<1e8;))?
mbomb007

@ mbomb007 Desafortunadamente no, GML requiere los 3 parámetros.
Timtech

4

Java - 83 55

Versión más corta gracias a Navin.

class P{static{System.out.print(Math.toRadians(180));}}

Versión antigua:

class P{public static void main(String[]a){System.out.print(Math.toRadians(180));}}

Esto no hace ningún cálculo.
Hosch250

Aunque no entiendo el voto negativo, respondí con "Math.toRadians (180)". También es cuestionable quién calcula pi: el compilador o el programa. Pero eso no era parte de la pregunta.
blabla999

2
@ user2509848 Ciertamente lo hace: se multiplica 180por pi/180.
AJMansfield

¿Quieres decir que multiplica pi por 1? Es esencialmente lo mismo. No lo rechacé, pero no creo que realmente cuente.
Hosch250


4

R : 33 caracteres

sqrt(8*sum(1/seq(1,1000001,2)^2))
[1] 3.141592

Esperemos que esto siga las reglas.


3

Rubí, 82

q=1.0
i=0
(0.0..72).step(8){|k|i+=1/q*(4/(k+1)-2/(k+4)-1/(k+5)-1/(k+6))
q*=16}
p i

Utiliza alguna fórmula que realmente no entiendo y que acabo de copiar. :PAG

Salida: 3.1415926535897913


3

Rubí, 12

p 1.570796*2

Yo estoy técnicamente "calculando" pi una aproximación de pi.


No, técnicamente no estás calculando pi. Técnicamente está calculando 3.141592, que está cerca de pi, pero nunca convergerá exactamente acos(-1).
wchargin

@Wchar Ok, editado
Pomo

3
No creo que codificar duro pi / 2 y luego multiplicarlo por 2 realmente cuente; el punto es calcular pi, no ofuscar un literal numérico.
Jason C

3

JavaScript: 19 bytes

Math.pow(29809,1/9)

Calcula el 9 º raíz de 29809 .

3.1415914903890925
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.