Calcule 500 dígitos de pi (Português)

Escreva um programa para calcular os primeiros 500 dígitos de pi, atendendo às regras abaixo:

  • Deve ter menos de 500 caracteres de comprimento.
  • Não pode incluir “pi”, “math.pi” ou constantes pi semelhantes, nem pode chamar uma função de biblioteca para calcular pi.
  • Não pode usar os dígitos “3”, “1” e “4” consecutivamente.
  • Deve ser executado em um tempo razoável (menos de 1 minuto) em um computador moderno.

O programa mais curto vence.

Comentários

  • Para verificar se seus dígitos estão corretos: eveandersson.com/pi/digits
  • Podemos imprimir mais de 500 dígitos com perda de precisão após os primeiros 500?
  • @Alexandru, I suponha que sim, mas eu preferiria vê-lo truncado.
  • Podemos usar uma biblioteca HTTP para baixar ” dígitos de pi ” site? 😉
  • Vim aqui na esperança de obter algo bom e conciso para gerar aproximações de comprimento arbitrário de pi em python … infelizmente @Soulman ‘ a solução de python é aparentemente ajustado para 500 dígitos; substituir 500 por 1000 dá uma resposta incorreta. Eu me pergunto se existe uma boa maneira de formular um desafio alternativo que produza uma função curta agradável que seja geralmente útil para gerar um número arbitrário de dígitos?

Resposta

Golfscript – 29 chars

6666,-2%{2+.2/@*\/9)499?2*+}* 

Postarei a análise mais tarde

Comentários

  • Você poderia explicar como isso funciona?
  • ” Postarei a análise mais tarde “. (aguarda 3 anos) ….
  • ” Postarei a análise mais tarde ” * aguarda mais de 6 anos *
  • ” Postarei a análise mais tarde ” (aguarda 8 anos)
  • Ainda esperando …

Resposta

Mathematica (34 caracteres): (sem “trapacear” com trig)

N[2Integrate[[1-x^2]^.5,-1,1],500]

Então, para explicar a mágica aqui:
Integrate[function, lower, upper] fornece a área sob a “função” da curva de “inferior” para “superior”. Nesse caso, essa função é [1-x^2]^.5, que é uma fórmula que descreve a metade superior de um círculo com raio 1. Como o círculo tem raio 1, ele não existe para valores de x menores que -1 ou maiores que 1. Portanto, estamos encontrando a área da metade de um círculo. Quando multiplicamos por 2, obtemos a área dentro de um círculo de raio 1, que é igual a pi.

Comentários

  • Talvez você deve inserir, em sua resposta, uma explicação de por que isso funciona (para os que não são matemáticos).
  • ideia maravilhosa. Eu vou cuidar disso em breve. Eu ‘ darei uma explicação básica da matemática envolvida.
  • Talvez você pudesse encurtá-la: altere sqrt[1-x^2] para (1-x^2)^.5)
  • e eu posso remover o * após o 2. Mathematica é maravilhoso.

Resposta

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 

Resposta

Husk , 28 25 24 bytes

i*!500İ⁰ΣG*2mṠ/o!İ1→ḣ□70 

Experimente online!

Calcula o valor de pi como um número racional usando os primeiros 5.000 termos da série infinita 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) e, em seguida, extrai os primeiros 500 dígitos.

O código para calcular o valor de pi a partir de um número especificado de termos tem apenas 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 

Infelizmente, precisamos perder 3 bytes especificando o número de termos a serem usados:

□70 # 70^2 = 4900 

E mais 8 bytes convertendo o número racional (expresso como uma fração) em seus dígitos na forma decimal:

i*!500İ⁰ i # integer value of * # multiplying by !500 # 500th element of İ⁰ # series of powers of 10 

Resposta

PARI / GP, 14

\p500 acos(-1) 

Você pode evitar trigonometria substituindo a segunda linha com

gamma(.5)^2 

ou

(6*zeta(2))^.5 

ou

psi(3/4)-psi(1/4) 

ou

4*intnum(x=0,1,(1-x^2)^.5) 

ou

sumalt(k=2,(-1)^k/(2*k-3))*4 

Resposta

Python3 136

Usa 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

Usa isso 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]) 

Resposta

Mathematica (17 bytes)

N[ArcCos[-1],500] 

Prova de validade .

Resposta

Pyth , 21

u+/*GHhyHy^T500r^3T1Z 

Usa este algoritmo: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) encontrado nos comentários da resposta Golfscript.

Comentários

  • Isso não ‘ t merece uma votação negativa …
  • Esta resposta está incorreta, ele gera 34247779. .. que, pelo que sei, não é pi.
  • @orlp A operação r foi recentemente alterada de uma forma que quebrou essa resposta. Altere o 1 para um 0 e funcionará no Pyth atual.

Resposta

JavaScript, 60 bytes

i=1n;p=x=3n*(10n**520n);while(x=x*i/(i*4n+4n)){i+=2n;p+=x/i} 

Experimente online!

Comentários

  • 62 bytes: for(i=1n,p=x=3n*(10n**520n);x>0;x=x*i/(i*4n+4n),p+=x/(i+=2n));

Resposta

bc -l (22 = 5 linha de comando + 17 programa)

scale=500 4*a(1) 

Comentários

  • As regras dizem ” nem pode chamar uma função de biblioteca para calcular o pi. ”
  • @Peter O problema, eu acho, é que ” função de biblioteca ” nem sempre é um termo bem definido e só piora quando você diz ” para calcular Pi “, já que você pode usá-lo para calcular resultados intermediários, por exemplo Sqrt () em Alexandru

    s resposta.

  • Acho que isso é trapaça porque atan calcula 1/4 pi, mas é uma solução interessante, no entanto.
  • @Thomas O : se isso é trapaça, onde ‘ é o limite?
  • funções trigonométricas deveriam ter sido proibidas por causa de respostas como esta. a ideia é calcular pi com um algoritmo, não uma função embutida. sqrt é um pouco diferente, pois ‘ não é uma função trigonométrica.

Resposta

Mathematica – 50

½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½] 

Resposta

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 graças a @ceilingcat .

Experimente online .

Ou como um 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));}}  

Experimente online.

Resposta

Axioma, 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 referência https://tuts4you.com/download.php?view.452 ; seria uma aproximação de 6 * arctg (1 / sqrt (3)) =% pi e usaria expansão em série 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 

Resposta

05AB1E , 20 bytes

₄°·D.ΓN>*N·3+÷}O+₄;£ 

Porta de minha resposta Java (com 503 substituído por 1000 – qualquer coisa \ $ \ geq503 \ $ é suficiente para gerar o primeiro 500 dígitos com precisão com esta abordagem).

Experimente online ou verifique-o ” s iguais aos primeiros 500 dígitos de PI usando o žs incorporado.

Explicação:

 ₄° # 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)  

Resposta

Fortran, 154 bytes

Desfigurou o código rosetta . Muitos bytes salvos usando inteiros implícitos i j k l m n, print em vez de write e embaralhando as coisas em torno de

Experimente online …

 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  

Resposta

APL (NARS2000), 20 bytes

{2+⍵×⍺÷1+⍨2×⍺}/⍳7e3x 

Não fui capaz de testar isso, mas aqui “está uma versão em Dyalog APL. A única diferença entre eles é o sufixo ” x “, que é usado para números racionais em NARS2000, mas não está disponível em Dyalog (ou outras variantes disponíveis online, pelo que eu sei).

É baseado na fórmula pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) nos comentários sob a resposta aceita do Golfscript.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *