Golfscript, 71 70 69 caracteres
2\!:^2^..292^15.2/3]{(.)2/.9>+{\+.((}*;.}do;;]-1%{^0@{2$*+\}/"/"\n}/;
(Supõe que você não passa nada no stdin)
Não quero mais ouvir lamentações de pessoas que não têm constantes internas para pi. Eu nem tenho números de ponto flutuante!
Veja http://en.wikipedia.org/wiki/Continued_fraction#Best_rational_approximations para obter mais informações.
# No input, so the stack contains ""
2\!:^2^..292^15.2/3]
# ^ is used to store 1 because that saves a char by allowing the elimination of whitespace
# Otherwise straightforward: stack now contains [2 1 2 1 1 1 292 1 15 7 3]
# Pi as a continued fraction is 3+1/(7+1/(15+1/(...)))
# If you reverse the array now on the stack you get the first 10 continuants followed by 2
# (rather than 3)
# That's a little hack to avoid passing the denominator 1000000
{
# Stack holds: ... [c_n c_{n-1} ... c_0]
(.)2/.9>+
# Stack holds ... [c_{n-1} ... c_0] c_n (1+c_n)/2+((1+c_n)/2 > 9 ? 1 : 0)
# (1+c_n)/2 > 9 is an ad-hoc approximation of the "half rule"
# which works in this case but not in general
# Let k = (1+c_n)/2+((1+c_n)/2 > 9 ? 1 : 0)
# We execute the next block k times
{
# ... [c_{n-1} ... c_0] z
\+.((
# ... [z c_{n-1} ... c_0] [c_{n-1} ... c_0] z-1
}*
# So we now have ... [c_n c_{n-1} ... c_0] [(c_n)-1 c_{n-1} ... c_0] ...
# [(c_n)-k+1 c_{n-1} ... c_0] [c_{n-1} ... c_0] c_n-k
;
# Go round the loop until the array runs out
.
}do
# Stack now contains all the solutions as CFs in reverse order, plus two surplus:
# [2 1 2 1 1 1 292 1 15 7 3] [1 2 1 1 1 292 1 15 7 3] ... [6 3] [5 3] [4 3] [3] [2] []
# Ditch the two surplus ones, bundle everything up in an array, and reverse it
;;]-1%
# For each CF...
{
# Stack holds ... [(c_n)-j c_{n-1} ... c_0]
# We now need to convert the CF into a rational in canonical form
# We unwind from the inside out starting with (c_n)-j + 1/infinity,
# representing infinity as 1/0
^0@
# ... 1 0 [c_n-j c_{n-1} ... c_0]
# Loop over the terms of the CF
{
# ... numerator denominator term-of-CF
2$*+\
# ... (term-of-CF * numerator + denominator) numerator
}/
# Presentation
"/"\n
# ... numerator "/" denominator newline
}/
# Pop that final newline to avoid a trailing blank line which isn't in the spec
;
"#{Math.PI}"
.2\!:^2^..292^15.2/3]
já me impressionou.Mathematica,
6763Isso não vai ser rápido, mas acredito que é tecnicamente correto.
Round[π, x]
dá a fração mais próxima de π em passos dex
. Isso é "listável", o mesmoRound[π,1/Range@1*^6]
ocorre com todas as frações1/10^6
em ordem. A lista resultante com muitas aproximações racionais "ruins" é//.
processada repetidamente ( ) removendo quaisquer elementos que estejam mais distantes de π do que o anterior.fonte
Round[Pi, x]
dá a fração mais próxima dePi
em etapas dex
. Isso é "listável", o mesmoRound[Pi,1/Range@1*^6]
ocorre com todas as frações até 1/10 ^ 6 em ordem. A lista resultante com muitas aproximações racionais "ruins" é então//.
processada repetidamente ( ) removendo quaisquer elementos que estejam mais longe de pi do que o anterior.Select[Round[f=Pi,1/Range@1*^6],If[#<f,f=#;True]&@Abs[#-Pi]&]
... mas inútil dado o viés dominantePerl, 77 caracteres
Um pequeno desafio é que o Perl não tem uma constante π embutida disponível, então primeiro tive que calculá-la como
atan2(0,-1)
. Tenho certeza de que isso será superado por idiomas mais adequados para o trabalho, mas não é ruim para um idioma projetado principalmente para processamento de texto.fonte
999999
para1e6
e salvar 3 caracteres.String found where operator expected at prog.pl line 1, near "say"$=/$_""
-M5.01
opção (e do Perl 5.10.0 ou posterior) para osay
comando. Desculpe por não mencionar isso.Python,
969389 caracteresPython,
9593 caracteres, algoritmo diferenteNota: Havia menos caracteres para escrever do
p=3.14159265359;
quefrom math import*
. Droga essas importações prolixo!fonte
1.0
->1.
,10**6
->1e6
JS (95 caracteres)
Imprime 167 linhas.
fonte
Ruby 1.9, 84 caracteres
fonte
C99, 113 caracteres
Precisa compilar com
-lm
, e provavelmente cheio de comportamento indefinido, mas funciona para mim.fonte
Scala - 180 caracteres
// ungolfed: 457
A anotação do tailrec é apenas uma verificação, para verificar se é recursiva da cauda, o que geralmente é uma melhoria de desempenho.
fonte
pi.scala:1 error: not found: value math
math
porMath
pode ser suficiente. Mencionei simplyscala neste metathread, se você procurá-lo novamente: meta.codegolf.stackexchange.com/a/401/373Mathematica
1817 caracteresEu escolhi usar, como uma medida do "melhor", o número de termos em uma representação de fração contínua de π. Por esse critério, as melhores aproximações racionais de π são seus convergentes.
Existem 10 convergentes de π com um denominador menor que um milhão. Isso é menor do que os 167 termos solicitados, mas eu o incluo aqui porque pode ser do interesse de outras pessoas.
Se você realmente deseja ver o denominador para o primeiro convergente, custará 11 caracteres adicionais:
Para aqueles interessados, a seguir, são mostradas as relações entre convergentes, quocientes parciais e expressão contínua da fração de convergentes de π:
Por favor, desculpe a formatação inconsistente das frações continuadas.
fonte
C #
140129 caracteresCódigo não compactado
fonte
var
nem sempre é seu amigo. Ao removê-lo a favor,double
você ganha a capacidade de mesclar declarações, perde o requisito de usar literais duplos e pode salvar 16 caracteres. OTOH a pergunta pede um programa, então você perderá alguns adicionando uma declaração de classe e umMain
método.J,
6965Novo
Ainda uma abordagem de força bruta, mas muito mais rápida e um pouco mais curta.
Velho
Uma simples "força bruta":
faça uma lista de
a/b
s e depois descarte aqueles que estão mais distantes de π para algunsb'<b
.Nota: Altere
1e3
para1e6
para a lista completa. Vá fazer outra coisa e volte mais tarde.fonte