Golfscript, 71 70 69 символов
2\!:^2^..292^15.2/3]{(.)2/.9>+{\+.((}*;.}do;;]-1%{^0@{2$*+\}/"/"\n}/;
(Предполагается, что вы ничего не передаете на стандартный ввод)
Я не хочу больше слышать звуки от людей, у которых нет встроенных констант для пи. У меня даже нет чисел с плавающей запятой!
См. Http://en.wikipedia.org/wiki/Continued_fraction#Best_rational_approximations для фона.
# 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]
уже поразила меня.Математика,
6763Это не будет быстрым, но я считаю, что это технически правильно.
Round[π, x]
дает ближайшую дробь к π с шагомx
. Это «список», такRound[π,1/Range@1*^6]
же как и для всех дробей по1/10^6
порядку. Результирующий список со многими «плохими» рациональными приближениями затем многократно (//.
) обрабатывается путем удаления любых элементов, которые находятся дальше от π, чем предыдущий.источник
Round[Pi, x]
дает ближайшую дробьPi
в шагахx
. Это «список», такRound[Pi,1/Range@1*^6]
же как и для всех дробей до 1/10 ^ 6 по порядку. Результирующий список со многими «плохими» рациональными приближениями затем многократно (//.
) обрабатывается путем удаления любых элементов, которые находятся дальше от pi, чем предыдущий.Select[Round[f=Pi,1/Range@1*^6],If[#<f,f=#;True]&@Abs[#-Pi]&]
... но бесполезно, учитывая доминирующее предубеждениеPerl, 77 символов
Незначительная проблема заключается в том, что в Perl нет встроенной π- константы, поэтому мне сначала пришлось рассчитать ее как
atan2(0,-1)
. Я уверен, что это будет побеждено языками, более подходящими для работы, но это не плохо для языка, главным образом разработанного для обработки текста.источник
999999
чтобы1e6
и сохранить 3 символов.String found where operator expected at prog.pl line 1, near "say"$=/$_""
-M5.01
переключатель (и Perl 5.10.0 или новее) дляsay
команды. Извините, что не упомянул это.Python,
969389 символовPython,
9593 символа, другой алгоритмпримечание: было меньше символов,
p=3.14159265359;
чем написатьfrom math import*
. Черт возьми, этот объемный импорт!источник
1.0
->1.
,10**6
->1e6
JS (95 символов)
Он печатает 167 строк.
источник
Ruby 1.9, 84 символа
источник
C99, 113 знаков
Нужно скомпилировать
-lm
и, возможно, полно неопределенного поведения, но это работает для меня.источник
Скала - 180 символов
// ungolfed: 457
Хвостовая аннотация - это просто проверка, чтобы убедиться, что она хвостовая рекурсивная, что часто является улучшением производительности.
источник
pi.scala:1 error: not found: value math
math
сMath
может быть достаточным. Я упомянул просто scala об этой метатреде, если вам снова придетсяMathematica
1817 символовВ качестве меры «наилучшего» я выбрал количество членов в представлении непрерывной дроби числа π. По этому критерию наилучшие рациональные приближения π являются его сходящимися.
Существует 10 сходящихся π со знаменателем менее одного миллиона. Это меньше, чем запрошенные 167 терминов, но я включил их сюда, потому что это может быть интересно для других.
Если вы действительно хотите увидеть знаменатель для первого сходящегося, это будет стоить дополнительно 11 символов:
Для тех, кто заинтересован, следующее показывает отношения между конвергентами, частными частными и продолженным дробным выражением конвергентов π:
Прошу прощения за несогласованное форматирование продолженных дробей.
источник
C #
140129 символовНесжатый код
источник
var
не всегда твой друг. Удаляя его в пользуdouble
вас, вы получаете возможность объединять объявления, теряете требование использовать двойные литералы и можете сэкономить 16 символов. OTOH вопрос требует программы, так что вы потеряете несколько из-за добавления объявления класса иMain
метода.J,
6965новый
Все еще подход грубой силы, но намного быстрее и немного короче.
старый
Простая "грубая сила":
составьте список
a/b
s, а затем отбросьте те, которые находятся дальше от π для некоторыхb'<b
.Примечание: Изменения
1e3
в1e6
течение полного списка. Иди, сделай что-нибудь еще и вернись позже.источник