Golfscript, 71 70 69 caracteres
2\!:^2^..292^15.2/3]{(.)2/.9>+{\+.((}*;.}do;;]-1%{^0@{2$*+\}/"/"\n}/;
(Asume que no le pasa nada en stdin)
No quiero escuchar más quejas de personas que no tienen constantes incorporadas para pi. ¡Ni siquiera tengo números de coma flotante!
Ver http://en.wikipedia.org/wiki/Continued_fraction#Best_rational_approximations para el fondo.
# 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]
ya me dejó alucinado.Mathematica,
6763Esto no va a ser rápido, pero creo que es técnicamente correcto.
Round[π, x]
da la fracción más cercana a π en pasos dex
. Esto es "listable", lo mismoRound[π,1/Range@1*^6]
ocurre con todas las fracciones1/10^6
en orden. La lista resultante con muchas aproximaciones racionales "malas" se//.
procesa repetidamente ( ) eliminando cualquier elemento que esté más lejos de π que el anterior.fuente
Round[Pi, x]
da la fracción más cercana aPi
en pasos dex
. Esto es "listable", así loRound[Pi,1/Range@1*^6]
hace para todas las fracciones hasta 1/10 ^ 6 en orden. La lista resultante con muchas aproximaciones racionales "malas" se//.
procesa repetidamente ( ) eliminando cualquier elemento que esté más lejos de pi que el anterior.Select[Round[f=Pi,1/Range@1*^6],If[#<f,f=#;True]&@Abs[#-Pi]&]
... pero inútil dado el sesgo dominantePerl, 77 caracteres
Un desafío menor es que Perl no tiene una constante π incorporada disponible, así que primero tuve que calcularlo como
atan2(0,-1)
. Estoy seguro de que esto será superado por los idiomas más adecuados para el trabajo, pero no está mal para un idioma diseñado principalmente para el procesamiento de texto.fuente
999999
a1e6
y guardar 3 caracteres.String found where operator expected at prog.pl line 1, near "say"$=/$_""
-M5.01
conmutador (y Perl 5.10.0 o posterior) para elsay
comando. Perdón por no mencionar eso.Python,
969389 caracteresPython,
9593 caracteres, algoritmo diferentenota: tenía menos caracteres para escribir
p=3.14159265359;
quefrom math import*
. ¡Malditas esas importaciones de palabras!fuente
1.0
->1.
,10**6
->1e6
JS (95 caracteres)
Imprime 167 líneas.
fuente
Ruby 1.9, 84 caracteres
fuente
C99, 113 caracteres
Necesito compilar
-lm
, y probablemente lleno de comportamiento indefinido, pero funciona para mí.fuente
Scala - 180 caracteres
// sin golf: 457
La anotación tailrec es solo una verificación, para verificar, que es recursiva, lo que a menudo es una mejora del rendimiento.
fuente
pi.scala:1 error: not found: value math
math
conMath
podría ser suficiente. Mencioné simplescala en este metathread, si lo busca de nuevo: meta.codegolf.stackexchange.com/a/401/373Mathematica
1817 caracteresElegí usar, como una medida de "mejor", el número de términos en una representación de fracción continua de π. Según este criterio, las mejores aproximaciones racionales de π son sus convergentes.
Hay 10 convergentes de π con un denominador menor a un millón. Esto es menor que los 167 términos solicitados, pero lo incluyo aquí porque puede ser de interés para otros.
Si realmente desea ver el denominador para el primer convergente, le costará 11 caracteres adicionales:
Para aquellos que estén interesados, lo siguiente muestra las relaciones entre los convergentes, los cocientes parciales y la expresión de fracción continua de los convergentes de π:
Disculpe el formato inconsistente de las fracciones continuas.
fuente
C #
140129 caracteresCódigo sin comprimir
fuente
var
No siempre es tu amigo. Al eliminarlo a su favordouble
, obtiene la capacidad de fusionar declaraciones, pierde el requisito de usar literales dobles y puede guardar 16 caracteres. OTOH, la pregunta pide un programa, por lo que perderá algunos al agregar una declaración de clase y unMain
método.J,
6965Nuevo
Todavía un enfoque de fuerza bruta pero mucho más rápido y un poco más corto.
Antiguo
Una simple "fuerza bruta":
haga una lista de
a/b
sy luego descarte aquellos que están más lejos de π para algunosb'<b
.Nota: Cambie
1e3
a1e6
para obtener la lista completa. Ve a hacer otra cosa y vuelve más tarde.fuente