Учитывая действительное число t
в (-10^9,13)
(не включая -10^9
или 13
) в качестве входных данных, выходных данных Γ(t)
, также известный как гамма-функция , которая определяется следующим образом:
Вы не можете использовать встроенную гамма-функцию для решения этой задачи, а также не можете использовать встроенные числовые или символьные функции интеграции. Ваш вывод должен быть точным до 6 значащих цифр или в пределах 10^-6
фактического значения, в зависимости от того, какое ограничение является менее значимым для данного значения. Встроенная гамма-функция Python будет использоваться для определения фактического значения. Вы можете предположить, Γ(t)
что определено - то есть, t
является ли положительное действительное число или нецелое отрицательное действительное число - и это |Γ(t)| ≤ 10^9
. Вот справочная программа, которую вы можете использовать для получения фактических значений, используя встроенную в Python функцию Gamma.
Примеры
1 -> 1.000000
-2.5 -> -0.945309
3.14159265 -> 2.288038
-2.71828182846 -> -0.952682
12 -> 39916800.000000
0.5 -> 1.772454
8.675309 -> 20248.386956
-10.1 -> -0.000002
правила
- Это код-гольф , поэтому самый короткий ответ (в байтах) выигрывает.
- Стандартные лазейки запрещены.
- Ввод и вывод могут быть выполнены любым способом, который считается стандартным для вашего языка.
- Вы можете написать полную программу, функцию или что-либо, что обычно считается правильным ответом для вашего языка
Leaderboard
Фрагмент стека в нижней части этого поста создает таблицу лидеров из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
## Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 63887; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Ответы:
Pyth, 21 байт
Как и в случае с моим ответом TI-BASIC, я не смог проверить это с полными 8 ^ 10 итерациями, но все кажется хорошим в меньших случаях.
Объяснение:
Попробуйте это здесь с 2000 итерациями вместо 8 ^ 10.
источник
C ++ 14,
868581 байтЯ не тратил много времени на это. Я просто посмотрел на приближение, которое казалось наиболее простым для реализации (в виде байтов). Для вычисления значения потребуется некоторое время (поскольку цикл проходит по всем натуральным числам), но ограничение по времени в задаче не указано. Это анонимная функция (лямбда), которая принимает любой аргумент (преобразуемый в
T
которыйpow(double, T)
иoperator/(T,int)
может быть вызван) и возвращаетdouble
.Неутолимый с использованием
источник
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x86
gamma(-10e9)
но OP указал, что могут рассматриваться только параметры, для которых определена гамма-функция.gamma(10e9)
возвращаетсяinf
, в то время как Python встроенного Gamma функция будет использоваться для определения фактического значения говоритOverflowError: math range error
Минколанг 0,12 ,
353425 байтЭто останавливается с ошибкой (при попытке деления на 0), но это разрешено согласно мета-консенсусу . Добавьте
.
в конце программу, которая обычно останавливается. Попробуйте все тестовые случаи одновременно. (Цикл повторяется только 1e4 раза, поэтому он закончится раньше, чем позже.)объяснение
Zereges использовал одно из альтернативных, бесконечных определений продукта . Как выяснилось, другой гораздо удобнее реализовать в Минколанге.
Это предел в
n
бесконечности, что означает, что я могу рассчитывать и то,n!
и другое(t+n)
. Таким образом, я вынимаю1/t
(потому что0!=1
) иn^t
потому, что это не может быть вычислено последовательно, не зная конечного значенияn
. Как это бывает, потому чтоn
это предел, я могу использовать его дважды. Один раз как фактор в расчете и один раз как количество раз, чтобы запустить цикл.Последовательный бесконечный продукт должен начинаться с чего-то, обычно 1. В данном случае это так
n^t/t
. В теле цикла я вычисляюk/(t+k)
и умножаю это на произведение. В конце концов, весь продукт был рассчитан и выведен. По сути, это то, что делает моя программа,n
достаточно высокая, чтобы ответ был достаточно точным.Как нет
.
, он оборачивается и начинается заново. Однакоn
сейчас производит-1
потому что ввод пуст, что в конечном итоге приводит к попытке делить на 0, что останавливает программу.источник
Юлия, 141 байт
Это создает безымянную лямбда-функцию, которая принимает действительное число и возвращает действительное число. Оно использует приближение Spounge для вычисления гаммы.
Ungolfed:
источник
z->(z-=1;a=90;c(k)=(k=big(k);(-1)^~-k/factorial(k-1)*(a-k)^(k-.5)*exp(a-k));(z+a)^(z+.5)*exp(-z-a)*(√(2π)+sum(c(k)/(z+k)for k=1:a-1)))
должен работать на 137 байтов (по крайней мере, в Julia 0,6)Japt, 45 байт
Japt - это сокращенная версия Ja vaScri pt . переводчик
Конечно, 1e9 = 1 000 000 000 итераций занимает вечность, поэтому для тестирования попробуйте заменить
9
a на6
. (1e6 с точностью до ~ 5 значащих цифр. Использование 1e8 на входе12
достаточно, чтобы получить первые шесть.)Результаты теста: (с точностью до 1e7)
Как это устроено
источник
TI-BASIC, 35 байтов
Это использует тот же алгоритм, что и Zereges.
Предостережение: я фактически не проверял это с полными итерациями 1e9; исходя из времени, необходимого для меньших значений, я ожидаю, что время выполнения будет порядка месяцев . Однако, похоже, что они сходятся, и не должно быть проблем с ошибками округления. TI хранит числа как десятичные числа с точностью до 14 цифр.
источник
Python 3,
74687873 байтаСпасибо @Mego и @xnor
Это перевод ответа С ++ Зерегеса. По сути, это альтернативное определение гамма-функции, следовательно, более точное (и то, что замечательно, это то, что использует меньше байтов!)
Прошу прощения за все ошибки!
источник
+1
На диапазон не имеет значения , когда вы имеете дело с миллиардами. Кроме того, вы должны указать, что это Python 3 - вам потребуетсяfrom __future__ import division
разделение с плавающей запятой и несколько терабайт оперативной памяти, чтобы справиться с фактом,range
возвращающим список в Python 2. Кроме того, вы можете заменить1.0
s на1
s и сбрить 4 байт.^
это XOR , вы не имели в виду**
как для возведения в степень?int(1e9)
это просто10**9
, и вам не нужны парены вокруг(1+1/i)**z
.Python,
348448407390389 байтОтдельное спасибо @Mego!
Вычеркнутый 448 - это (почти) по-прежнему 448! :п
Это основано на приближении Ланцкоса. Гольф от сюда
источник
import *
например, в) и используя односимвольное имя функции. Также обратите внимание, что вам нужно только поддерживать реальный ввод.z-=1;
в первой строке,gamma
чтобы исправить это. Вы должны также переименоватьgamma
вg
течение байт сохраняет и избежать конфликтов имен сcmath.gamma
. Также отбросьте посторонние ведущие нули.Юлия, 41 байт
Это перевод ответа Серега на С ++. В то время как мой другой ответ Джулии заканчивается мгновенно, это довольно медленно. Он вычисляет тестовые случаи за пару секунд каждый на моем компьютере.
Ungolfed:
источник
Пролог, 114 байт
Это перевод ответа Серега на С ++.
Попробуйте онлайн здесь
Запустите его с помощью запроса в форме:
Запуск его с 1e9 рекурсиями занимает около 15 минут.
Если вы уменьшите его до 1e6, это займет около 1 секунды, что упрощает (но менее точно) тестирование.
Запуск его в интерпретаторе на вашем компьютере / ноутбуке, скорее всего, быстрее для большинства людей.
источник
Mathematica, 40 байт
источник