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
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
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 o1
para um0
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}
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 .
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));}}
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
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.