Вслед за оценкой Монте-Карло числа Pi эта задача состоит в том, чтобы создать кратчайший код для константы Pi. За исключением того, что здесь ваш код должен выводить последовательные цифры пи всегда.
Это кодовый гольф, поэтому выигрывает самое короткое представление (в байтах), за исключением того, что оно должно выводить первые 10000 цифр менее чем за 10 секунд на приемлемом ПК и никогда не прекращаться.
Вы не можете использовать какие-либо встроенные функции Pi или trig.
Убрано жесткое ограничение на размер кода.
3141...
это - последовательные цифры числа пи.Ответы:
CJam - 48
Это вычисляет π как 2 * сумму (k! / (2k + 1) !!) с большей и большей точностью и на каждом шаге печатает набор цифр с того места, где он остановился.
Вы можете попробовать онлайн модифицированную версию, которая делает только 8 (внешний цикл) итераций и печатает 512 цифр, или использовать интерпретатор java для реальной вещи. На моем ноутбуке он достигает 16384 цифр за 6 секунд.
Примечание: эта программа очень требовательна к памяти; лучше ведет себя, но немного длиннее версия:
Объяснение:
источник
Python, 138 байт
Реализация http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf .
источник
GolfScript (81 символ)
Демонстрация в Интернете (это намного медленнее, чем на обычном рабочем столе, и имеет тривиальные изменения кода, чтобы зацикливаться конечное число раз).
Я, конечно, использовал алгоритм spigot, который я упомянул в предыдущем комментарии, но мне потребовалось некоторое время, чтобы поиграть в него к моему удовольствию. Алгоритм, представленный в статье Гиббона, (псевдокод)
Приведенный выше код GolfScript эквивалентен (псевдокод)
который сохраняет некоторые символы в инициализации и в управлении стеком.
источник
Pyth -
8785 байтЕще один перевод http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf . Я собирался сделать Python, но @orlp победил меня, поэтому я сделал Pyth. Достаточно маленький, чтобы поместиться в твит.
Он выводит на стандартный вывод, хотя и с перерывами, из-за буфера печати, который задается настройкой
end=""
печати. В настоящее время я не печатаю десятичную точку, поскольку в спецификации написано "последовательные цифры". Это задания, которые убивают мой счет.Попробуй это здесь . (Примечание: поскольку онлайн-интерпретатор дает только завершенные результаты, бесконечный цикл отключен, поэтому он печатает только первые 100, что увеличивает размер кода. Чтобы попробовать бесконечный, загрузите локальный интерпретатор.)
тайминг
На моем Google Cloud Compute Micro экземпляр, в соответствии с GNU время заняло:
real: 0m2.062s
так что, очевидно, достаточно быстро.источник
Scala, 599 байт
Приведенный ниже код является прямым портом кода Паскаля из Приложения 2 Алгоритма Spigot для цифр числа Пи . Очевидно, что очень мало игры в гольф было сделано. Код генерирует 10 000 цифр менее чем за 10 секунд,
piSpigot(10000)
и если у вас есть бесконечная память, можно параметризовать, чтобы генерировать много цифр, но не бесконечно. Я не уверен, что это соответствует ограничениям проблемы, поэтому, пожалуйста, оставьте отзыв.источник
n
. См. Например cs.ox.ac.uk/people/jeremy.gibbons/publications/spigot.pdfBefunge-98 (PyFunge), 120 байт
Попробуйте онлайн!
Это границы с точки зрения сроков. 10 000 цифр на моем ноутбуке занимают около 11 секунд, но я уверен, что должен быть «разумный» ПК, который мог бы делать это быстрее, чем этот.
Однако, если вы попробуете это на TIO, обратите внимание, что он ничего не вернет, пока не достигнет 60-секундного ограничения времени, так как алгоритм разработан так, чтобы продолжать работать вечно. К тому времени у вас будет намного больше 10 000 цифр.
Я использую алгоритм spigot Джереми Гиббонс, который, я думаю, такой же, как и большинство других ответов здесь. Однако обратите внимание, что это зависит от интерпретатора, имеющего ячейки памяти произвольной точности, и единственная известная мне реализация, которая поддерживает это, - это PyFunge .
объяснение
источник