Código de cálculo Pi Pi [fechado]


17

O desafio

Você deve calcular pi no menor comprimento possível. Qualquer idioma é bem-vindo, e você pode usar qualquer fórmula para calcular pi. Ele deve ser capaz de calcular pi com pelo menos 5 casas decimais. O menor, seria medido em caracteres. A competição dura 48 horas. Início.


Nota : Essa pergunta semelhante afirma que o PI deve ser calculado usando a série 4 * (1 - 1/3 + 1/5 - 1/7 +…). Esta pergunta não possui essa restrição e, de fato, muitas respostas aqui (incluindo as que têm maior probabilidade de ganhar) seriam inválidas nessa outra pergunta. Portanto, isso não é uma duplicata.


5
@hvd Por que você acha que deve ser desqualificado? Ele se encaixa nas especificações ...
Dr. belisarius

5
@ hvd acos (-1). Eu ganhei!
Level River St

4
Isso parece estranho, inconsistente. O cálculo de π deve estar dividindo um círculo por seu diâmetro, ou alguma outra operação que dê π. Se aceitarmos fazer 355/113 - que não tem nada a ver com π, exceto sorte -, como @ace, então logicamente devemos aceitar fazer 3.14159 .
Nicolas Barbulesco

7
Não entendo por que as pessoas gostam dessa pergunta. Essa é uma das perguntas mais mal definidas e desinteressantes que eu já vi aqui. A única diferença entre este e oi mundo é que isso tem algo a ver com o Pi.
triturador

8
Para tornar essa pergunta interessante, é necessária uma função de pontuação que recompense dígitos de pi por byte de código.
Ben Jackson

Respostas:


56

Python3, 7

Executa no shell interativo

355/113

Saída: 3.1415929203539825corrija até 6 casas decimais

E, finalmente, tenho uma solução que supera o APL!

Ah, e no caso de você estar se perguntando, essa proporção é chamada de 密 率 (literalmente "proporção precisa") e é proposta pelo matemático chinês Zu Chongzhi (429-500 dC). Um artigo relacionado da Wikipedia pode ser encontrado aqui . Zu também forneceu a relação 22/7 como a "relação aproximada" e é conhecido por ser o primeiro matemático a propor que 3,1415926 <= pi <= 3,1415927


12
mhmh - essa é realmente uma resposta poliglota. Também funciona em Smalltalk!
blabla999

7
Blasfêmia! É apenas um cálculo!
Mniip

3
bem, é uma divisão, e é satisfaz precisão a exigência ... (e até mesmo a Bíblia é menos preciso, você não rotular que a blasfêmia - você 3 * ;-)?
blabla999

29
O momento de constrangimento quando eu escrevi isso como uma resposta séria, mas interpreta a todos que como uma piada ...
user12205

20
Mais votado resposta: 355/113. Menor votou resposta: 3+.14159. Na verdade, não vejo muita diferença.
primo

49

PHP - 132 127 125 124 bytes

Simulação básica de Monte-Carlo. A cada 10 milhões de iterações, ele imprime o status atual:

for($i=1,$j=$k=0;;$i++){$x=mt_rand(0,1e7)/1e7;$y=mt_rand(0,1e7)/1e7;$j+=$x*$x+$y*$y<=1;$k++;if(!($i%1e7))echo 4*$j/$k."\n";}

Obrigado a cloudfeet e zamnuts por sugestões!

Saída de amostra:

$ php pi.php
3.1410564
3.1414008
3.1413388
3.1412641
3.14132568
3.1413496666667
3.1414522857143
3.1414817
3.1415271111111
3.14155092
...
3.1415901754386
3.1415890482759
3.1415925423731

5
Pronto para uma resposta que realmente calcula!
blabla999

Não conhece PHP, mas em JS você pode fazer algo como: o $j+=$x*$x+$y*$y<=1;que economizaria quatro bytes.
cloudfeet

11
Também $k+=1/4;e print $j/$kpode ser reduzido para $k++;e print 4*$j/$kpara outro byte.
cloudfeet

@cloudfeet - Alterações feitas, o código confirmado ainda é o mesmo. Obrigado!

2
@MarkC - Conceitualmente, ele lança dardos aleatoriamente em um retângulo de 0,0 a 1,1. Aqueles menores ou iguais à distância 1 a 0,0 são considerados dentro e fora. O formato dessa distância 1 passa a ser um quarto de círculo ou π / 4. O [número de dardos dentro do quarto de círculo] / [número total de dardos] será aproximado em π / 4 à medida que o número de amostras aumentar.

31

J 6

{:*._1

Explicação: *.fornece o comprimento e o ângulo de um número complexo. O ângulo de -1 é pi. {:pega o final da lista [comprimento, ângulo]

Apenas para os fetiche por séries de convergência lenta, por 21 bytes, uma série de Leibniz:

      +/(4*_1&^%>:@+:)i.1e6
 3.14159

12
Em outras palavras, é isso atan(0) + pi. Não acho que o uso de funções trigonométricas e o próprio pi devam contar como um "cálculo".
Jason C

@JasonC Arg(isto é, o argumento de um número complexo) não é uma função trigonométrica, apesar de ter valores semelhantes aos de arco tangente
mniip

11
@mniip Sim, é. É apenas um sinônimo de atan (bem, atan2) nas partes reais e imaginárias. Como você pode ver lá, é precisamente igual, por definição, a atan(0) + pi.
Jason C

25

Perl, 42 bytes

map{$a+=(-1)**$_/(2*$_+1)}0..9x6;print$a*4

Ele calcula π usando a fórmula de Leibniz :

Fórmula de Leipniz

999999 é usado como o maior n para obter a precisão de cinco dígitos decimais.

Resultado: 3.14159165358977


Isso é legal! Ele me inspirou a escrever um em Java 8.
David Conrad

19

Piet, muitos codéis

Não é minha resposta, mas esta é a melhor solução que já vi para esse problema:

Aproximação Pi em Piet

Meu entendimento é que ele soma os pixels do círculo e divide pelo raio, e depois novamente. Isso é:

A = πr²  # solve for π
π = A/r²
π = (A/r)/r

Uma abordagem melhor em minha mente é um programa que gera essa imagem em um tamanho arbitrário e a executa através de um intérprete Piet.

Fonte: http://www.dangermouse.net/esoteric/piet/samples.html


Você poderia explicar o que realmente faz? (Conheço a idéia geral por trás do Piet, mas uma explicação sobre como esse programa em particular funcionaria seria uma boa adição à sua resposta).
plannapus

Eu realmente não conheço Piet, mas acho que isso literalmente mede a área do círculo vermelho e depois divide o raio duas vezes, resolvendo para π = A / (r * r)
Não que Charles

Bem, a área é bastante clara, pois quando o ponteiro entra no círculo vermelho, conta o número de codels na área vermelha e empurra-o para a pilha ao sair (já que o ponto de saída é vermelho escuro, portanto, nenhuma alteração de tonalidade, mas um passo mais escuro ), é a parte "dividir pelo raio ao quadrado" que eu tive problemas para entender.
plannapus

11
@ plannapus O raio é "codificado" na linha vermelha escura que se estende do canto superior esquerdo até a metade da borda esquerda (é difícil ver na imagem). Piet é difícil de seguir, mas a essência é que os blocos de cores têm um valor igual à sua área (a linha na borda esquerda tem pixels r , o círculo tem pixels na área ), e o material intermediário é apenas um monte de operações aritméticas e de pilha. Os programas começam no canto superior esquerdo. O texto no canto superior direito é essencialmente um comentário.
Jason C

2
@JasonC ah, é claro! O círculo toca os lados superior e inferior, de modo que a linha vermelha escura que desce do lado superior até o meio exato é necessário, o raio! Inteligente!
plannapus

18

Tecnicamente estou calculando, 9

0+3.14159

Tecnicamente, ainda estou calculando, 10

PI-acos(1)

Estou calculando tão difícil, 8

acos(-1)

ACIDENTEMENTE PI, 12

"3.14"+"159"

E tecnicamente, essa resposta é ruim.


31
Então cabeçalho, título muito grande, muita dor para os meus olhos, uau.
Pierre Arlaud 26/02

11
pluzz wan por muito lulz, thankz
Jonathan Van Matre

Ei, querida, quer expandir minha série Taylor?
Jason C


@ SimonT Você não respondeu minha pergunta sobre a série Taylor. Mas enquanto você pensa sobre isso, veja meus comentários sobre a pergunta e a maioria das outras respostas aqui. : P
Jason C

14

APL - 6

2ׯ1○1

Saídas 3.141592654 . Ele calcula o dobro do arco de seno de 1.

Uma solução de 13 caracteres seria:

--/4÷1-2×⍳1e6

Isso gera 3.141591654para mim, que se ajusta à precisão solicitada.
No + 4/1 - 4/3 + 4/5 - 4/7 ...entanto, ele usa as séries simples para calcular.


11
Uau, essa é uma convergência lenta!

Meu primeiro pensamento foi “por que não ¯2○¯1?” (Ie acos -1). Mas isso dá uma aproximação complexa em repl.it ( 3.1415926425236J¯1.1066193467303274e¯8). Alguma idéia do porquê? Todas as implementações fazem isso?
James Wood

+1 para sua segunda solução. 2 * asin(1)é um pouco trapaceiro, no entanto.
Jason C

@JamesWood Eu não conheço o APL, mas se eu tivesse que adivinhar, diria que ele tentou fazer um sqrt(1-theta^2)(que aparece em muitas identidades trigonométricas) em algum momento e perdeu alguma precisão em algum lugar, terminando com um pouco negativo 1-theta^2.
Jason C

11
O estranho é que ainda há uma pequena parte imaginária acos -0.75. Não há como calcular 1 - 0.75 ^ 2como negativo.
James Wood

14

J - 5 bytes

|^._1

Isto significa |log(-1)|.


Uso inteligente da identidade de Euler.
primo

11
Legal, outra resposta algébrica de identidade. Tão inteligente quanto ln(e^(42*pi))/42ou pi*113/113.
Jason C

Também funciona em TI-BASIC
Timtech 26/02

11
(Totalmente alheios, Eu gostaria que pudéssemos usar LaTeX em codegolf.)
Jason C

11
(Resposta a uma pergunta totalmente independente, eu me dou bem com os gráficos do google, por exemplo aqui .) No tópico, essa é a resposta mais gentil e, portanto, deveria ter sido aceita.
Primo

14

Calculadora do Google, 48

stick of butter*(26557.4489*10^-9)/millimeters^3

Toma um pedaço de manteiga, faz cálculos avançados, faz pi com isso. Imaginei que, como todo mundo estava fazendo respostas matemáticas simples, eu adicionaria uma mais leve.

Exemplo


3
O stick of butteré fofo e engraçado, mas essa é essencialmente mais uma pi*x/x+y-yidentidade algébrica.
Jason C

10
Há tantas maneiras melhores para fazer pi usando uma vara de manteiga
Não que Charles

Você já tentou fazer manteiga com um pedaço de pi?
precisa

12

Oitava, 31

quad(inline("sqrt(4-x^2)"),0,2)

Calcula a área de um quarto de círculo com raio 2, através da integração numérica.

octave:1> quad(inline("sqrt(4-x^2)"),0,2)
ans =     3.14159265358979

11
Agradável! +1 quando meus votos recarregam.
Jason C


10

Python, 88

Solução:

l=q=d=0;t,s,n,r=3.,3,1,24
while s!=l:l,n,q,d,r=s,n+q,q+8,d+r,r+32;t=(t*n)/d;s+=t
print s

Exemplo de saída no shell Python:

>>> print s
3.14159265359

Consegue evitar importações. Pode ser facilmente trocado para usar a biblioteca Decimal de precisão arbitrária; apenas substitua3. por Decimal('3'), defina a precisão antes e depois e, em seguida, unário mais o resultado para converter a precisão.

E ao contrário de um lote inteiro das respostas aqui, na verdade, calcula π em vez de confiar em built-in constantes ou fakery matemática, ou seja math.acos(-1), math.radians(180), etc.


9

linguagem assembly x86 (5 caracteres)

fldpi

Se isso carrega uma constante da ROM ou realmente calcula a resposta, depende do processador (mas, pelo menos em algumas, ele efetua um cálculo, não apenas carregando o número da ROM). Para colocar as coisas em perspectiva, ele é listado como tendo 40 ciclos de clock em um 387, o que é um pouco mais do que parece fazer sentido se ele estivesse carregando o valor da ROM.

Se você realmente deseja garantir um cálculo, pode fazer algo como:

fld1
fld1
fpatan
fimul f

f dd 4

[para 27 caracteres]


11
Você pode explicar por favor?
Nicolas Barbulesco 25/02

E, em alguns processadores, o que o cálculo faria fldpi?
Nicolas Barbulesco 25/02

11
Eu não acho que usar um comando que carrega pi (ou mesmo o calcule com base na implementação de outra pessoa ou em qualquer implementação existente de função trigonométrica) realmente conta com o espírito de "calcular" qualquer coisa (o fator "omg assembler" não ' realmente não mude isso). Talvez leve isso para a menor implementação possível do assembler, e isso pode ser chamado de "cálculo".
Jason C

2
@JasonC: Parece uma noção totalmente arbitrária para mim, com nenhum sentido mais real do que eu decidir que as pessoas precisam implementar adição, subtração, multiplicação e divisão por conta própria, se estiverem usando para usá-las.
Jerry Coffin

3
@JerryCoffin Em vez de discutir aspectos técnicos, basta dizer que nem asin(-1)nem fldpisão particularmente interessantes ou criativos. Não há muito objetivo em competir para ver qual idioma favorito tem o nome mais curto para funções trigonométricas e constantes pi predefinidas.
Jason C

8

bc -l, 37 bytes

for(p=n=2;n<7^7;n+=2)p*=n*n/(n*n-1);p

Não vejo nenhuma outra resposta usando o produto Wallis , então, desde que recebeu o nome do meu homônimo (meu professor de História da Matemática recebeu um grande impulso disso), não pude resistir.

Acontece que é um algoritmo bastante bom da perspectiva do golfe, mas sua taxa de convergência é péssima - chegando a 1 milhão de iterações apenas para obter 5 casas decimais:

$ time bc -l<<<'for(p=n=2;n<7^7;n+=2)p*=n*n/(n*n-1);p'
3.14159074622629555058

real    0m3.145s
user    0m1.548s
sys 0m0.000s
$ 

bc -l, 15 bytes

Como alternativa, podemos usar Newton-Raphson para resolver sin(x)=0, com uma aproximação inicial de 3. Como isso converge em tão poucas iterações, simplesmente codificamos duas iterações, o que fornece 10 casas decimais:

x=3+s(3);x+s(x)

A fórmula iterativa de acordo com Newton-Raphson é:

x[n+1] = x[n] - ( sin(x[n]) / sin'(x[n]) )

sin'=== cose cos(pi)=== -1, simplesmente aproximamos o costermo para obter:

x[n+1] = x[n] + sin(x[n])

Resultado:

$ bc -l<<<'x=3+s(3);x+s(x)'
3.14159265357219555873
$ 

+1 agora é mais assim!
Jason C

@JasonC Qual é a sua opinião sobre a aplicação de Newton-Raphson na solução de sin (x) = 0 (veja editar)?
Digital Trauma

6

Pitão - 47 45

pi está realmente sendo calculado sem funções trigonométricas ou constantes.

a=4
for i in range(9**6):a-=(-1)**i*4/(2*i+3)

resultado:

>>> a
3.1415907719167966

Deve ser capaz de salvar um byte descartando o zero após a casa decimal para a interpretação de flutuação forçada. :) Pontos de bônus por brevidade, mas eu gosto dos meus por precisão arbitrária e menor utilização de memória. (Editado a arranhar a ideia parêntese, eu ver o que está acontecendo lá e meu teste isolado não entendi a questão.)
amcgregor

Oh não. Após sua modificação, isso não fornece mais saída válida. (265723 ≭ π) Você ainda precisa do período, mas não do zero à direita.
Amcgregor

@amcgregor usa python 3?
QWR

Sim, embora eu desenvolva principalmente sob 2.7 e faça meu código funcionar em ambos. No entanto, na instalação padrão do Mac 10.9 python3, seu código causa uma falha de segmentação.
Amcgregor

@amcgregor Eu só testei, ele funciona para mim (python 3.3.4)
QWR

6

C, 99

Calcula diretamente a área / r ^ 2 de um círculo.

double p(n,x,y,r){r=10000;for(n=x=0;x<r;++x)for(y=1;y<r;++y)n+=x*x+y*y<=r*r;return(double)n*4/r/r;}

Esta função calculará pi contando o número de pixels em um círculo de raio e rdepois dividindo por r*r(na verdade, apenas calcula um quadrante). Com r10000, é preciso ter 5 casas decimais (3,1415904800). Os parâmetros para a função são ignorados, eu apenas os declarei lá para economizar espaço.


6

Javascript, 43 36

x=0;for(i=1;i<1e6;i++){x+=1/i/i};Math.sqrt(6*x)

xtorna zeta(2)=pi^2/6- se assim sqrt(6*x)=pi. (47 caracteres)

Depois de usar a propriedade distributiva e excluir os colchetes do forloop, você obtém:

x=0;for(i=1;i<1e6;i++)x+=6/i/i;Math.sqrt(x)

(43 caracteres)

Retorna:

3.14159169865946

Editar:

Encontrei uma maneira ainda mais curta usando o produto Wallis:

x=i=2;for(;i<1e6;i+=2)x*=i*i/(i*i-1)

(36 caracteres)

Retorna:

3.141591082792245

6

Python, Riemann zeta (58 41 caracteres)

(6*sum(n**-2for n in range(1,9**9)))**0.5

Ou poupe dois caracteres, mas use scipy

import scipy.special as s
(6*s.zeta(2,1))**0.5

Editar : salvou 16 (!) Caracteres graças a amcgregor


11
Pode, potencialmente, evitar a mathimportação e sqrtchamada girando a exponenciação em vez disso:(6*sum(n**-2 for n in range(1,9**9)))**0.5
amcgregor

5

Javascript: 99 caracteres

Usando a fórmula dada por Simon Plouffe em 1996, isso funciona com 6 dígitos de precisão após o ponto decimal:

function f(k){return k<2?1:f(k-1)*k}for(y=-3,n=1;n<91;n++)y+=n*(2<<(n-1))*f(n)*f(n)/f(2*n);alert(y)

Essa variante mais longa (130 caracteres) tem uma precisão melhor, 15 dígitos após o ponto decimal:

function e(x){return x<1?1:2*e(x-1)}function f(k){return k<2?1:f(k-1)*k}for(y=-3,n=1;n<91;n++)y+=n*e(n)*f(n)*f(n)/f(2*n);alert(y)

Fiz isso com base nas minhas duas respostas a esta pergunta .


5

Rubi, 54 50. 49.

p (0..9**6).map{|e|(-1.0)**e/(2*e+1)*4}.reduce :+

Versão online para teste.

Outra versão sem criar uma matriz (50 caracteres):

x=0;(0..9**6).each{|e|x+=(-1.0)**e/(2*e+1)*4}; p x

Versão online para teste.


É interessante ver as diferenças de idioma que essas soluções compactas podem oferecer. Por exemplo, a tradução do Python acima é de 105 caracteres (depois de usar alguns truques triviais de compactação de código): a=__import__;reduce(a('operator').__add__,a('itertools').imap(lambda e:(-1.0)**e/(2*e+1)*4,xrange(9**6)))- observe o uso de xrange / imap; no Python 3 você pode evitar isso; basicamente, não quero que toda a sua memória RAM seja consumida construindo uma lista com tantas entradas.
Amcgregor

11
Você está absolutamente correto. Geralmente, é muito conveniente usar as funções Array e Enumerable (especialmente Ruby), embora possa realmente não ser a melhor idéia em termos de desempenho e velocidade ... Bem, pensando nisso, deve ser possível fazer o cálculo com o método Método Range.each em vez de criar um mapa.
David Herrmann

Sim, é possível - apenas um caráter mais ...
David Herrmann

Sua primeira resposta não é tão precisa quanto a sua segunda.
Josh

Você poderia elaborar, por favor? Mesmo algoritmo, mesma saída para mim?
David Herrmann

5

TI CAS, 35

lim(x*(1/(tan((180-360/x)/2))),x,∞)

11
Olhei para isso e eu esquecer completamente como funciona: P
TheDoctor

5

Perl - 35 bytes

$\=$\/(2*$_-1)*$_+2for-46..-1;print

Produz precisão total de ponto flutuante. Uma derivação da fórmula usada pode ser vista em outro lugar .

Uso da amostra:

$ perl pi.pl
3.14159265358979

Versão de Precisão Arbitrária

use bignum a,99;$\=$\/(2*$_-1)*$_+2for-329..-1;print

Estenda conforme necessário. O comprimento da iteração (por exemplo -329..-1) deve ser ajustado para ser aproximadamente log 2 (10)3.322 vezes o número de dígitos.

3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211707

Ou, usando bigint:

use bigint;$\=$\/(2*$_-1)*$_+2e99for-329..-1;print

Isso é notavelmente mais rápido, mas não inclui um ponto decimal.

3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

5

C # 192

class P{static void Main(){var s=(new System.Net.WebClient()).DownloadString("http://www.ctan.org/pkg/tex");System.Console.WriteLine(s.Substring(s.IndexOf("Ver&shy;sion")+21).Split(' ')[0]);}}

Saídas:

3.14159265

Nenhuma matemática envolvida. Apenas consulta a versão atual do TeX e faz algumas análises primitivas do html resultante. Eventualmente, ele se tornará π de acordo com a Wikipedia .


Estou com 5 anos de atraso, mas esta é uma brecha padrão criada quatro dias antes desta resposta.
Benjamin Urquhart

5

Python 3 Monte Carlo (103 caracteres)

from random import random as r
sum(1 for x,y in ((r(),r()) for i in range(2**99)) if x**2+y**2<1)/2**97

5

Linguagem do Game Maker, 34

Assume todas as variáveis ​​não inicializadas como 0. Isso é padrão em algumas versões do Game Maker.

for(i=1;i<1e8;i++)x+=6/i/i;sqrt(x)

Resultado:

3.14159169865946

muito agradável. Também, em C float k(){double x=0,i=0;for(;i++<999999;)x+=6/i/i;return sqrt(x);}é menor do que este
izabera

ainda mais curto com 1e8em vez de 999999
izabera

Você poderia usar for(i=1;i<1e8;)x+=6/i/i++;sqrt(x)para salvar um byte (ou como alternativa for(i=1;i++<1e8;))?
mbomb007

@ mbomb007 Infelizmente, o GML requer todos os 3 parâmetros.
Timtech

4

Java - 83 55

Versão mais curta graças ao Navin.

class P{static{System.out.print(Math.toRadians(180));}}

Versão antiga:

class P{public static void main(String[]a){System.out.print(Math.toRadians(180));}}

Isso não faz nenhum cálculo.
Hosch250

Eu não entendo o voto negativo, embora - eu tivesse respondido com "Math.toRadians (180)". Também é questionável quem calcula pi: o compilador ou o programa. Mas isso não fazia parte da questão.
24514 Blabla999

2
@ user2509848 Certamente faz: multiplica 180por pi/180.
AJMansfield

Você quer dizer que multiplica pi por 1? É essencialmente a mesma coisa. Não diminuí a votação, mas acho que realmente não conta.
Hosch250


4

R : 33 caracteres

sqrt(8*sum(1/seq(1,1000001,2)^2))
[1] 3.141592

Espero que isso siga as regras.


3

Ruby, 82

q=1.0
i=0
(0.0..72).step(8){|k|i+=1/q*(4/(k+1)-2/(k+4)-1/(k+5)-1/(k+6))
q*=16}
p i

Usa uma fórmula que eu realmente não entendo e apenas copio. : P

Resultado: 3.1415926535897913


3

Ruby, 12

p 1.570796*2

Eu estou tecnicamente "cálculo" pi uma aproximação do pi.


Não, você não está tecnicamente calculando pi. Você está tecnicamente calculando 3.141592, que está próximo de pi, mas nunca convergirá para exatamente acos(-1).
Wchargin

@Wchar Ok, editado
Maçaneta da

3
Eu não acho que codificar pi / 2 e depois multiplicá-lo por 2 é realmente importante; o ponto é calcular pi, não ofuscar um literal numérico.
Jason C

3

JavaScript - 19 bytes

Math.pow(29809,1/9)

Calcula a raiz de 29809 .

3.1415914903890925
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.