Gegeben eine reelle Zahl t
in (-10^9,13)
(ohne -10^9
oder 13
) als Eingabe, Ausgabe Γ(t)
, auch bekannt als die Gamma-Funktion , die wie folgt definiert ist:
Sie können weder eine integrierte Gamma-Funktion verwenden, um diese Aufgabe zu lösen, noch integrierte numerische oder symbolische Integrationsfunktionen. Ihre Ausgabe sollte auf 6 signifikante Stellen genau sein oder innerhalb 10^-6
des tatsächlichen Werts liegen, je nachdem, welcher Wert für den angegebenen Wert weniger einschränkend ist. Die in Python integrierte Gamma-Funktion wird zur Ermittlung des tatsächlichen Werts verwendet. Sie können davon ausgehen Γ(t)
, dass definiert ist - das heißt, dass es t
sich entweder um eine positive reelle Zahl oder eine nicht ganzzahlige negative reelle Zahl handelt - und dass |Γ(t)| ≤ 10^9
. Hier ist ein Referenzprogramm, mit dem Sie mithilfe der in Python integrierten Gamma-Funktion die tatsächlichen Werte ermitteln können.
Beispiele
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
Regeln
- Das ist Code-Golf , also gewinnt die kürzeste Antwort (in Bytes).
- Standardlücken sind verboten.
- Die Ein- und Ausgabe kann auf die für Ihre Sprache als Standard geltende Weise erfolgen.
- Sie können ein vollständiges Programm, eine Funktion oder alles schreiben, was normalerweise als gültige Antwort für Ihre Sprache angesehen wird
Bestenliste
Das Stapel-Snippet am Ende dieses Beitrags generiert die Rangliste aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamtrangliste.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:
## [><>](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>
Antworten:
Pyth, 21 Bytes
Wie bei meiner TI-BASIC-Antwort konnte ich dies nicht mit den vollständigen 8 ^ 10-Iterationen testen, aber bei kleineren Fällen scheint alles in Ordnung zu sein.
Erläuterung:
Versuchen Sie es hier mit 2000 Iterationen anstelle von 8 ^ 10.
quelle
C ++ 14,
868581 BytesIch habe nicht viel Zeit damit verbracht. Ich habe nur die Annäherung betrachtet, die (in der Art von Bytes) am einfachsten zu implementieren schien. Die Berechnung des Werts wird einige Zeit in Anspruch nehmen (da sich die Schleife über alle positiven Ganzzahlen erstreckt), die Zeitbeschränkung ist jedoch in der Abfrage nicht angegeben. Es ist eine anonyme Funktion (Lambda), die ein beliebiges Argument (konvertierbar in
T
welchespow(double, T)
und aufrufbar) annimmtoperator/(T,int)
und zurückgibtdouble
.Ungolfed mit Gebrauch
quelle
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x86
gamma(-10e9)
aber OP gibt an, dass nur Parameter berücksichtigt werden können, für die eine Gammafunktion definiert ist.gamma(10e9)
kehrt zurückinf
, während die eingebaute Gamma-Funktion von Python zur Bestimmung des tatsächlichen Werts verwendet wird, heißt esOverflowError: math range error
Minkolang 0.12 ,
353425 BytesDies stoppt zwar mit einem Fehler (beim Versuch, durch 0 zu teilen), dies ist jedoch gemäß Metakonsens zulässig . Fügen Sie
.
am Ende ein für ein Programm hinzu, das normalerweise angehalten wird. Probieren Sie alle Testfälle gleichzeitig aus. (Die Schleife durchläuft nur 1e4-mal, sodass sie eher früher als später beendet wird.)Erläuterung
Zereges verwendete eine der alternativen, unendlichen Produktdefinitionen . Wie sich herausstellt, ist das andere System in Minkolang viel leichter umzusetzen.
Dies ist eine Grenze,
n
bis ins Unendliche geht, was bedeutet , dass ich beide berechnen kannn!
und(t+n)
wie ich gehe. Also nehme ich heraus1/t
(weil0!=1
) undn^t
weil dieser nicht sequentiell berechnet werden kann, ohne den Endwert von zu kennenn
. Wie es passiert, weiln
das Limit ist, kann ich es zweimal verwenden. Einmal als Faktor in der Berechnung und einmal als Anzahl der Durchläufe der Schleife.Ein sequentielles unendliches Produkt muss mit etwas beginnen, normalerweise 1. In diesem Fall ist es
n^t/t
. Im Rumpf der Schleife berechnek/(t+k)
und multipliziere ich dies mit dem bisherigen Produkt. Am Ende wurde das gesamte Produkt berechnet und ausgegeben. Dies ist im Wesentlichen das, was mein Programm tut, und zwar son
hoch, dass die Antwort präzise genug ist.Da es keine gibt
.
, wickelt es sich um und beginnt von vorne. Allerdingsn
produziert jetzt ,-1
da die Eingabe leer ist, die schließlich führt zu durch 0 zu teilen versuchen, die das Programm stoppt.quelle
Julia, 141 Bytes
Dadurch wird eine unbenannte Lambda-Funktion erstellt, die eine reelle Zahl akzeptiert und eine reelle Zahl zurückgibt. Es verwendet die Näherung von Spounge , um Gamma zu berechnen.
Ungolfed:
quelle
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)))
sollte aber für 137 Bytes funktionieren (zumindest in Julia 0.6)Japt, 45 Bytes
Japt ist eine verkürzte Version von Ja vaScri pt . Dolmetscher
Natürlich dauert 1e9 = 1,000,000,000 Iterationen ewig, also versuchen Sie zum Testen, das
9
durch a zu ersetzen6
. (1e6 ist auf ~ 5 signifikante Zahlen genau. Die Verwendung von 1e8 bei einer Eingabe von12
genügt, um die ersten sechs zu erhalten.)Testergebnisse: (mit 1e7-Präzision)
Wie es funktioniert
quelle
TI-BASIC, 35 Bytes
Dies verwendet den gleichen Algorithmus wie Zereges.
Vorsichtsmaßnahme: Ich habe dies noch nicht mit den vollständigen 1e9-Iterationen getestet. Aufgrund der Zeit, die für kleinere Werte benötigt wird, erwarte ich eine Laufzeit in der Größenordnung von Monaten . Es scheint jedoch zu konvergieren, und es sollte keine Probleme mit Rundungsfehlern geben. TI speichert Zahlen als dezimale Gleitkommazahlen mit einer Genauigkeit von 14 Stellen.
quelle
Python 3,
74687873 BytesVielen Dank an @Mego und @xnor
Dies ist eine Übersetzung der C ++ - Antwort von Zereges. Grundsätzlich ist dies eine alternative Definition der Gammafunktion, daher genauer (und was großartig ist, dass weniger Bytes verwendet werden!)
Es tut mir leid für alle Fehler!
quelle
+1
Reichweite spielt keine Rolle, wenn Sie mit Milliarden zu tun haben. Außerdem sollten Sie angeben, dass dies Python 3 ist - Sie benötigenfrom __future__ import division
eine Float-Division und ein paar Terabyte RAM, um mit der Tatsache fertig zu werden, dassrange
in Python 2 eine Liste zurückgegeben wird. Außerdem können Sie1.0
s durch1
s ersetzen und off 4 rasieren Bytes.^
ist xor, meintest du nicht was die**
Potenzierung anbelangt ?int(1e9)
ist nur10**9
, und Sie brauchen nicht die Eltern herum(1+1/i)**z
.Python,
348448407390389 BytesBesonderer Dank geht an @Mego!
Ein durchgestrichener 448 ist (fast) immer noch ein 448! : p
Dies basiert auf der Lanzcos-Näherung. Von hier aus Golf gespielt
quelle
import *
zum Beispiel) entfernen und einen einstelligen Funktionsnamen verwenden. Beachten Sie auch, dass Sie nur echte Eingaben unterstützen müssen.z-=1;
in der ersten Zeile vongamma
, um den Fehler zu beheben. Sie sollten auch umbenennengamma
,g
um Bytes zu speichern und Namenskonflikte zu vermeidencmath.gamma
. Löschen Sie auch die äußeren führenden Nullen.Julia, 41 Bytes
Dies ist eine Übersetzung der C ++ - Antwort von Zereges. Während meine andere Julia-Antwort sofort endet, ist dies ziemlich langsam. Es berechnet die Testfälle in jeweils wenigen Sekunden auf meinem Computer.
Ungolfed:
quelle
Prolog, 114 Bytes
Dies ist eine Übersetzung der C ++ - Antwort von Zereges.
Probieren Sie es hier online aus.
Führen Sie es mit einer Abfrage des Formulars aus:
Das Ausführen mit 1e9-Rekursionen dauert ungefähr 15 Minuten.
Wenn Sie es auf 1e6 verringern, dauert es ungefähr 1 Sekunde, was das Testen erleichtert (aber weniger genau macht).
Das Ausführen in einem Interpreter auf Ihrem Computer / Laptop ist wahrscheinlich auch für die meisten Menschen schneller.
quelle
Mathematica, 40 Bytes
quelle