Dans la continuité de l'estimateur de Monte Carlo de Pi, ce défi consiste à produire le code le plus court pour la constante Pi. Sauf qu'ici, votre code doit produire des chiffres consécutifs de pi pour toujours.
Il s'agit du code golf, donc la soumission la plus courte (en octets) gagne, sauf qu'elle doit sortir les 10 000 premiers chiffres en moins de 10 secondes sur un PC raisonnable et ne doit jamais se terminer.
Vous ne pouvez pas utiliser de fonctions intégrées pour Pi ou trig.
Suppression de la limite stricte sur la taille du code.
3141...
est que - chiffres consécutifs de pi.Réponses:
CJam - 48
Cela calcule π comme 2 * somme (k! / (2k + 1) !!) avec une précision de plus en plus grande et à chaque étape imprime un tas de chiffres d'où il s'était arrêté.
Vous pouvez essayer en ligne une version modifiée qui ne fait que 8 itérations (boucle externe) et imprime 512 chiffres, ou utiliser l' interpréteur java pour la vraie chose. Sur mon ordinateur portable, il atteint 16384 chiffres en environ 6 secondes.
Remarque: ce programme est très gourmand en mémoire; une version mieux comportée mais légèrement plus longue est:
Explication:
la source
Python, 138 octets
Implémentation de http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf .
la source
GolfScript (81 caractères)
Démonstration en ligne (qui est beaucoup plus lente qu'un ordinateur de bureau raisonnable et a des changements de code triviaux pour boucler un nombre fini de fois).
J'ai, bien sûr, utilisé l'algorithme de spigot que j'ai mentionné dans un commentaire précédent, mais il m'a fallu un certain temps pour le jouer à ma satisfaction. L'algorithme tel que présenté dans l'article de Gibbons est (pseudocode)
Le GolfScript ci-dessus est équivalent à (pseudocode)
ce qui enregistre certains caractères dans l'initialisation et dans la gestion de la pile.
la source
Pyth -
8785 octetsUne autre traduction de http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf . J'allais faire Python mais @orlp m'a battu, alors j'ai fait Python. Assez petit pour tenir dans un tweet.
Il donne la sortie à stdout, bien que par étapes intermittentes en raison du tampon d'impression qui provient de la configuration
end=""
de l'impression. Je n'imprime actuellement pas la virgule décimale car la spécification dit "chiffres consécutifs". Ce sont les affectations qui tuent mon score.Essayez-le ici . (Remarque: Étant donné que l'interpréteur en ligne ne donne que des résultats complets, la boucle infinie est désactivée, il n'imprime donc que les 100 premiers, ce qui augmente la taille du code. Pour essayer l'infini, téléchargez l'interpréteur local.)
Horaire
Sur ma micro-instance de Google Cloud Compute, selon le temps GNU qu'il a fallu:
real: 0m2.062s
il est donc évidemment assez rapide.la source
Scala, 599 octets
Le code ci-dessous est un port direct du code Pascal de l'annexe 2 de A Spigot Algorithm for the Digits of Pi . Il est clair que très peu de golf a encore été fait. Le code génère 10 000 chiffres en moins de 10 secondes avec
piSpigot(10000)
et si l'un a une mémoire infinie, il peut être paramétré pour générer de nombreux chiffres, mais pas infini. Je ne sais pas si cela répond aux contraintes du problème, veuillez donc fournir des commentaires.la source
n
. Voir par exemple cs.ox.ac.uk/people/jeremy.gibbons/publications/spigot.pdfBefunge-98 (PyFunge), 120 octets
Essayez-le en ligne!
C'est limite en termes de délai. 10 000 chiffres prennent environ 11 secondes sur mon ordinateur portable, mais je suis sûr qu'il doit y avoir un PC "raisonnable" qui pourrait le faire plus rapidement que cela.
Cependant, si vous l'essayez sur TIO, notez qu'il ne retournera rien tant qu'il n'aura pas atteint le délai de 60 secondes, car l'algorithme est conçu pour continuer indéfiniment. À ce moment-là, vous aurez bien plus de 10 000 chiffres.
J'utilise l'algorithme de broche Jeremy Gibbons, qui je pense est le même que la plupart des autres réponses ici. Cependant, notez que cela repose sur l'interpréteur ayant des cellules de mémoire de précision arbitraire, et la seule implémentation que je connaisse qui prend en charge c'est PyFunge .
Explication
la source