Siguiendo el estimador de Pi de Monte Carlo, este desafío es producir el código más corto para el Pi constante. Excepto aquí, su código debe generar dígitos consecutivos de pi para siempre.
Este es el código de golf, por lo que el envío más corto (en bytes) gana, excepto que debe generar los primeros 10,000 dígitos en menos de 10 segundos en una PC razonable y nunca debe terminar.
No puede usar ninguna función incorporada para Pi o trigonométricas.
Se eliminó el límite estricto en el tamaño del código.
3141...
es eso: dígitos consecutivos de pi.Respuestas:
CJam - 48
Esto calcula π como 2 * suma (k! / (2k + 1) !!) con mayor y mayor precisión y en cada paso imprime un montón de dígitos desde donde se quedó.
Puede probar en línea una versión modificada que solo realiza 8 iteraciones (bucle externo) e imprime 512 dígitos, o usar el intérprete de Java para la cosa real. En mi computadora portátil llega a 16384 dígitos en aproximadamente 6 segundos.
Nota: este programa consume mucha memoria; una versión con mejor comportamiento pero un poco más larga es:
Explicación:
fuente
Python, 138 bytes
Implementación de http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf .
fuente
GolfScript (81 caracteres)
Demostración en línea (eso es mucho más lento que un escritorio razonable y tiene cambios de código triviales para recorrer un número finito de veces).
Por supuesto, he usado el algoritmo de espita que mencioné en un comentario anterior, pero me tomó un tiempo jugarlo a mi satisfacción. El algoritmo presentado en el artículo de Gibbons es (pseudocódigo)
El GolfScript anterior es equivalente a (pseudocódigo)
que guarda algunos caracteres en la inicialización y en la gestión de la pila.
fuente
Pyth -
8785 bytesOtra traducción de http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf . Iba a hacer Python pero @orlp me ganó, así que hice Pyth. Lo suficientemente pequeño como para caber en un tweet.
Da salida a stdout, aunque en pasos intermitentes debido al búfer de impresión que proviene de la configuración
end=""
en la impresión. Actualmente no imprimo el punto decimal ya que la especificación dice "dígitos consecutivos". Son las tareas las que están matando mi puntaje.Pruébalo aquí . (Nota: dado que el intérprete en línea solo da resultados completos, el bucle infinito está desactivado, por lo que solo imprime los primeros 100, lo que aumenta el tamaño del código. Para probar infinito, descargue el intérprete local).
Sincronización
En mi micro instancia de computación en la nube de Google, de acuerdo con el tiempo de GNU que tomó:
real: 0m2.062s
por lo tanto, obviamente es lo suficientemente rápido.fuente
Scala, 599 bytes
El siguiente código es un puerto directo del código Pascal del Apéndice 2 del Algoritmo A Spigot para los Dígitos de Pi . Claramente, se ha hecho muy poco golf. El código genera 10,000 dígitos en menos de 10 segundos
piSpigot(10000)
y, si uno tiene memoria infinita, se puede parametrizar para generar muchos dígitos, pero no infinito. No estoy seguro de si esto está cumpliendo las limitaciones del problema, así que por favor envíe sus comentarios.fuente
n
. Véase, por ejemplo, cs.ox.ac.uk/people/jeremy.gibbons/publications/spigot.pdfBefunge-98 (PyFunge), 120 bytes
Pruébalo en línea!
Esto es límite en términos del límite de tiempo. 10,000 dígitos toman alrededor de 11 segundos en mi computadora portátil, pero estoy seguro de que debe haber una PC "razonable" que pueda hacerlo más rápido que eso.
Sin embargo, si lo está probando en TIO, tenga en cuenta que no devolverá nada hasta que alcance el límite de tiempo de 60 segundos, ya que el algoritmo está diseñado para seguir funcionando para siempre. Sin embargo, para entonces tendrás más de 10,000 dígitos.
Estoy usando el algoritmo de espita Jeremy Gibbons, que creo que es el mismo que la mayoría de las otras respuestas aquí. Sin embargo, tenga en cuenta que esto depende de que el intérprete tenga celdas de memoria de precisión arbitrarias, y la única implementación que conozco que admite es PyFunge .
Explicación
fuente