Seguindo o estimador de Pi de Monte Carlo, este desafio é produzir o código mais curto para o Pi constante. Exceto aqui, seu código deve gerar dígitos consecutivos de pi para sempre.
Este é um código de código, portanto, o envio mais curto (em bytes) vence, exceto que ele deve gerar os primeiros 10.000 dígitos em menos de 10 segundos em um PC razoável e nunca deve terminar.
Você não pode usar nenhuma função interna para funções Pi ou trigonométricas.
Removido o limite rígido no tamanho do código.
3141...
é isso - dígitos consecutivos de pi.Respostas:
CJam - 48
Isso calcula π como 2 * soma (k! / (2k + 1) !!) com uma precisão cada vez maior e a cada passo imprime um monte de dígitos de onde parou.
Você pode experimentar on - line uma versão modificada que realiza apenas 8 iterações (loop externo) e imprime 512 dígitos, ou pode usar o interpretador java para real. No meu laptop, ele chega a 16384 dígitos em cerca de 6 segundos.
Nota: este programa consome muita memória; uma versão melhor comportada, mas um pouco mais longa é:
Explicação:
fonte
Python, 138 bytes
Implementação de http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf .
fonte
GolfScript (81 caracteres)
Demonstração on-line (que é muito mais lenta que uma área de trabalho razoável e possui alterações triviais no código para repetir um número finito de vezes).
Obviamente, usei o algoritmo de torneira que mencionei em um comentário anterior, mas demorei um pouco para jogar com satisfação. O algoritmo apresentado no artigo de Gibbons é (pseudocódigo)
O GolfScript acima é equivalente a (pseudocódigo)
que salva alguns caracteres na inicialização e no gerenciamento de pilhas.
fonte
Pitão -
8785 bytesOutra tradução de http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf . Eu ia fazer Python, mas @orlp me venceu, então eu fiz Pyth. Pequeno o suficiente para caber em um tweet.
Ele fornece saída para stdout, embora em etapas intermitentes, devido ao buffer de impressão resultante da configuração
end=""
na impressão. Atualmente, não imprimo o ponto decimal, pois a especificação indica "dígitos consecutivos". São as tarefas que estão matando minha pontuação.Experimente aqui . (Nota: Como o intérprete on-line fornece apenas resultados completos, o loop infinito é desativado; portanto, ele imprime apenas os 100 primeiros, o que aumenta o tamanho do código. Para testar o infinito, faça o download do intérprete local.)
Cronometragem
Na minha instância da computação no Google Cloud, de acordo com o tempo que o GNU levou:
real: 0m2.062s
é obviamente rápido o suficiente.fonte
Scala, 599 bytes
O código abaixo é uma porta reta do código Pascal do Apêndice 2 do A Algoritmo de torneira para os dígitos do Pi . Claramente, muito pouco golfe ainda foi feito. O código gera 10.000 dígitos em menos de 10 segundos
piSpigot(10000)
e, se houver memória infinita, pode ser parametrizado para gerar muitos dígitos, mas não infinitos. Não tenho certeza se isso está atendendo às restrições do problema, portanto, forneça feedback.fonte
n
. Veja, por exemplo, cs.ox.ac.uk/people/jeremy.gibbons/publications/spigot.pdfBefunge-98 (PyFunge), 120 bytes
Experimente online!
Isso é limítrofe em termos de prazo. 10.000 dígitos levam cerca de 11 segundos no meu laptop, mas tenho certeza de que deve haver um PC "razoável" que possa fazê-lo mais rápido que isso.
No entanto, se você estiver testando no TIO, observe que ele não retornará nada até atingir o limite de 60 segundos, pois o algoritmo foi projetado para continuar para sempre. A essa altura, você terá mais de 10.000 dígitos.
Estou usando o algoritmo de torneira Jeremy Gibbons, que acho que é o mesmo que a maioria das outras respostas aqui. No entanto, observe que isso depende do intérprete ter células de memória de precisão arbitrárias, e a única implementação que eu conheço que suporta isso é o PyFunge .
Explicação
fonte