Escriba un programa para calcular los primeros 500 dígitos de pi, cumpliendo las siguientes reglas:
- Debe tener menos de 500 caracteres de longitud.
- No puede incluir «pi», «math.pi» o constantes pi similares, ni puede llamar a una función de biblioteca para calcular pi.
- No puede usar los dígitos «3», «1» y «4» consecutivamente.
- Debe ejecutarse en un tiempo razonable (menos de 1 minuto) en una computadora moderna.
El programa más corto gana.
Comentarios
- Para verificar si sus dígitos son correctos: eveandersson.com/pi/digits
- ¿Se nos permite imprimir más de 500 dígitos con pérdida de precisión después de los primeros 500?
- @Alexandru, I supongo que sí, pero preferiría verlo truncado.
- ¿Podemos usar una biblioteca HTTP para descargar un » dígitos de pi » sitio web? 😉
- Vine aquí con la esperanza de obtener algo agradable y conciso para generar aproximaciones de longitud arbitraria de pi en python … desafortunadamente, la solución de Python de @Soulman ‘ es aparentemente sintonizado para 500 dígitos; reemplazar 500 con 1000 da una respuesta incorrecta. Me pregunto si hay una buena manera de formular un desafío alternativo que produzca una función corta agradable que sea generalmente útil para generar un número arbitrario de dígitos.
Respuesta
Golfscript – 29 caracteres
6666,-2%{2+.2/@*\/9)499?2*+}*
Publicaré el análisis más tarde
Comentarios
- ¿Podrías explicar cómo funciona esto?
- » Publicaré el análisis más tarde «. (espera 3 años) ….
- » Publicaré el análisis más tarde » * espera más de 6 años *
- » Publicaré el análisis más tarde » (espera 8 años)
- Todavía esperando …
Responder
Mathematica (34 caracteres): (sin «hacer trampa» con trig)
N[2Integrate[[1-x^2]^.5,-1,1],500]
Entonces, para explicar la magia aquí:
Integrate[function, lower, upper]
le da el área bajo la curva «función» de «inferior» a «superior». En este caso, esa función es [1-x^2]^.5
, que es una fórmula que describe la mitad superior de un círculo con radio 1. Debido a que el círculo tiene un radio de 1, no existe para valores de x menores que -1 o mayores que 1. Por lo tanto, estamos encontrando el área de la mitad de un círculo. Cuando multiplicamos por 2, obtenemos el área dentro de un círculo de radio 1, que es igual a pi.
Comentarios
- Quizás debe insertar, en su respuesta, una explicación de por qué esto funciona (para ellos, gente que no es matemática).
- maravillosa idea. Me ocuparé de ello ahora mismo. ‘ daré una explicación básica de las matemáticas involucradas.
- Tal vez puedas acortarlo: cambia
sqrt[1-x^2]
a(1-x^2)^.5)
- y puedo eliminar el * después del 2. Mathematica es maravilloso.
Respuesta
Python (83 caracteres)
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
Respuesta
Husk , 28 25 24 bytes
i*!500İ⁰ΣG*2mṠ/o!İ1→ḣ□70
Calcula el valor de pi como un número racional usando los primeros 5000 términos de la serie infinita 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
, y luego extrae los primeros 500 dígitos.
El código para calcular el valor de pi a partir de un número específico de términos tiene solo 13 bytes (Σ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
Desafortunadamente, necesitamos desperdiciar 3 bytes especificando el número de términos a utilizar:
□70 # 70^2 = 4900
Y luego 8 bytes más convirtiendo el número racional (expresado como una fracción) en sus dígitos en forma decimal:
i*!500İ⁰ i # integer value of * # multiplying by !500 # 500th element of İ⁰ # series of powers of 10
Respuesta
PARI / GP, 14
\p500 acos(-1)
Puede evitar trigonométricas reemplazando la segunda línea 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
Respuesta
Python3 136
Utiliza Madhava «s fórmula.
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
Utiliza esto fórmula.
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])
Respuesta
Respuesta
Pyth , 21
u+/*GHhyHy^T500r^3T1Z
Utiliza este algoritmo: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
que se encuentra en los comentarios de la respuesta de Golfscript.
Comentarios
- Esto no ‘ no merece un voto negativo …
- Esta respuesta es incorrecta, genera 34247779. .. que, que yo sepa, no es pi.
- @orlp La operación
r
se cambió recientemente de una manera que rompió esta respuesta. Cambie1
a0
y funcionará en Pyth actual.
Respuesta
JavaScript, 60 bytes
i=1n;p=x=3n*(10n**520n);while(x=x*i/(i*4n+4n)){i+=2n;p+=x/i}
Comentarios
- 62 bytes:
for(i=1n,p=x=3n*(10n**520n);x>0;x=x*i/(i*4n+4n),p+=x/(i+=2n));
Respuesta
bc -l (22 = 5 línea de comando + 17 programa)
scale=500 4*a(1)
Comentarios
- Las reglas dicen » ni pueden llamar a una función de biblioteca para calcular pi. »
- @Peter El problema, supongo, es que » función de biblioteca » no siempre es un término bien definido, y solo empeora cuando dices » para calcular Pi «, ya que puede usarlo para calcular resultados intermedios, por ejemplo Sqrt () en Alexandru
s respuesta.
- Creo que esto es una trampa porque atan calcula 1/4 pi, pero de todos modos es una solución interesante.
- @Thomas O : si esto es trampa, ¿dónde ‘ es el límite?
- Las funciones trigonométricas deberían haberse prohibido debido a respuestas como esta. la idea es calcular pi con un algoritmo, no con una función incorporada. sqrt es un poco diferente ya que ‘ no es una función trigonométrica.
Responder
Mathematica – 50
½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½]
Respuesta
Java 10 , 208 207 206 193 bytes
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 bytes gracias a @ceilingcat .
O como programa completo (245 bytes):
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));}}
Respuesta
Axiom, 80 bytes
digits(503);v:=1./sqrt(3);6*reduce(+,[(-1)^k*v^(2*k+1)/(2*k+1)for k in 0..2000])
para referencia https://tuts4you.com/download.php?view.452 ; sería una aproximación a 6 * arctg (1 / sqrt (3)) =% pi y usaría expansión de serie para 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
Respuesta
05AB1E , 20 bytes
₄°·D.ΓN>*N·3+÷}O+₄;£
Puerto de mi respuesta de Java (con 503
reemplazado con 1000
– cualquier cosa \ $ \ geq503 \ $ está bien para generar la primera 500 dígitos con precisión con este enfoque).
Pruébelo en línea o verifíquelo » s igual a los primeros 500 dígitos de PI usando la žs
incorporada.
Explicación:
₄° # 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)
Respuesta
Fortran, 154 bytes
Destrozado solución de código Rosetta . Se guardaron muchos bytes usando enteros implícitos i j k l m n
, print
en lugar de write
, y mezclando cosas alrededor
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
Respuesta
APL (NARS2000), 20 bytes
{2+⍵×⍺÷1+⍨2×⍺}/⍳7e3x
No he podido probar esto, pero aquí una versión en Dyalog APL. La única diferencia entre ellos es el sufijo » x «, que se usa para números racionales en NARS2000 pero no está disponible en Dyalog (o otras variantes disponibles en línea, hasta donde yo sé).
Se basa en la fórmula pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
en los comentarios debajo de la respuesta aceptada de Golfscript.