Étant donné un nombre réel t
dans (-10^9,13)
(non compris -10^9
ou 13
) comme entrée, sortie Γ(t)
, également connue sous le nom de fonction Gamma , qui est définie comme suit:
Vous ne pouvez pas utiliser une fonction gamma intégrée pour résoudre cette tâche, ni utiliser des fonctions d'intégration numériques ou symboliques intégrées. Votre sortie doit être précise à 6 chiffres significatifs ou à l'intérieur 10^-6
de la valeur réelle, la valeur la moins restrictive étant retenue. La fonction Gamma intégrée de Python sera utilisée pour déterminer la valeur réelle. Vous pouvez supposer qu'il Γ(t)
est défini - c'est-à-dire qu'il s'agit d' t
un nombre réel positif ou d'un nombre réel négatif non entier - et cela |Γ(t)| ≤ 10^9
. Voici un programme de référence que vous pouvez utiliser pour obtenir les valeurs réelles, en utilisant la fonction Gamma intégrée de Python.
Exemples
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
Règles
- C'est le code-golf , donc la réponse la plus courte (en octets) l'emporte.
- Les failles standard sont interdites.
- L'entrée et la sortie peuvent être effectuées de la manière considérée comme standard pour votre langue.
- Vous pouvez écrire un programme complet, une fonction ou tout ce qui est normalement considéré comme une réponse valide pour votre langue
Classement
L'extrait de pile au bas de cet article génère le classement à partir des réponses a) comme une liste des solutions les plus courtes par langue et b) comme un classement général.
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
## Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
## Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:
## [><>](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>
Réponses:
Pyth, 21 octets
Comme pour ma réponse TI-BASIC, je n'ai pas pu tester cela avec les 8 ^ 10 itérations complètes, mais tout semble bien avec des cas plus petits.
Explication:
Essayez-le ici avec 2000 itérations au lieu de 8 ^ 10.
la source
C ++ 14,
868581 octetsJe n'ai pas passé beaucoup de temps sur celui-ci. Je viens de regarder l'approximation qui semblait la plus simple à mettre en œuvre (à la manière des octets). Il faudra un certain temps pour calculer la valeur (puisque la boucle est sur tous les entiers positifs), mais la limitation de temps n'est pas spécifiée dans le défi. C'est une fonction anonyme (lambda), qui prend n'importe quel argument (convertible en
T
sur lequelpow(double, T)
etoperator/(T,int)
peut être appelé) et retournedouble
.Ungolfed avec l'utilisation
la source
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x86
gamma(-10e9)
mais OP a déclaré que seuls les paramètres pour lesquels une fonction gamma est définie peuvent être pris en compte.gamma(10e9)
retoursinf
, alors que Python fonction Gamma intégré seront utilisées pour déterminer la valeur réelle ditOverflowError: math range error
Minkolang 0,12 ,
353425 octetsCela s'arrête avec une erreur (en essayant de diviser par 0), mais cela est autorisé selon le consensus Meta . Ajoutez un
.
à la fin pour un programme qui s'arrête normalement. Essayez tous les cas de test en même temps.(La boucle n'itère que 1e4 fois, donc elle se terminera plus tôt que tard.)Explication
Zereges a utilisé l'une des définitions de produits alternatives infinies . Il s'avère que l'autre est beaucoup plus facile à mettre en œuvre à Minkolang.
C'est une limite qui
n
va à l'infini, ce qui signifie que je peux calculer les deuxn!
et au(t+n)
fur et à mesure. Je retire donc1/t
(parce que0!=1
) etn^t
parce que celui-ci ne peut pas être calculé séquentiellement sans connaître la valeur finale den
. En l'occurrence, parce quen
c'est la limite, je peux l'utiliser deux fois. Une fois comme facteur dans le calcul et une fois comme nombre de fois pour exécuter la boucle.Un produit infini séquentiel doit commencer par quelque chose, généralement 1. Dans ce cas, c'est
n^t/t
. Dans le corps de la boucle, je calculek/(t+k)
et multiplie cela avec le produit jusqu'à présent. À la fin, le produit entier a été calculé et produit. C'est essentiellement ce que fait mon programme, avecn
suffisamment de précision pour que la réponse soit suffisamment précise.Comme il n'y en a pas
.
, il s'enroule et recommence. Cependant,n
produit maintenant-1
parce que l'entrée est vide, ce qui conduit finalement à tenter de diviser par 0, ce qui interrompt le programme.la source
Julia, 141 octets
Cela crée une fonction lambda sans nom qui accepte un nombre réel et renvoie un nombre réel. Il utilise l'approximation de Spounge pour calculer le gamma.
Non golfé:
la source
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)))
devrait fonctionner pour 137 octets (au moins dans Julia 0.6)Japt, 45 octets
Japt est une version abrégée de Ja vaScri pt . Interprète
Bien sûr, 1e9 = 1 000 000 000 d'itérations prend une éternité, donc pour les tests, essayez de remplacer le
9
par un6
. (1e6 est précis à ~ 5 chiffres significatifs. L'utilisation de 1e8 sur une entrée de12
suffit pour obtenir les six premiers.)Résultats du cas de test: (en utilisant la précision 1e7)
Comment ça fonctionne
la source
TI-BASIC, 35 octets
Celui-ci utilise le même algorithme que Zereges.
Mise en garde: je n'ai pas réellement testé cela avec les itérations 1e9 complètes; en fonction du temps pris pour des valeurs plus petites, je m'attends à ce que le temps d'exécution soit de l'ordre des mois . Cependant, il semble converger et il ne devrait pas y avoir de problème avec les erreurs d'arrondi. TI stocke les nombres sous forme de nombres décimaux avec 14 chiffres de précision.
la source
Python 3,
74687873 octetsMerci @Mego et @xnor
Ceci est une traduction de la réponse C ++ par Zereges. Fondamentalement, il s'agit d'une autre définition de la fonction gamma, donc plus précise (et ce qui est génial, c'est qu'elle utilise moins d'octets!)
Je suis désolé pour toutes les erreurs!
la source
+1
sur la gamme n'a pas d'importance lorsque vous avez affaire à des milliards. En outre, vous devez spécifier qu'il s'agit de Python 3 - vous auriez besoinfrom __future__ import division
d'une division flottante et de quelques téraoctets de RAM pour faire face au fait querange
renvoie une liste en Python 2. De plus, vous pouvez remplacer le1.0
s par1
s et raser 4 octets.^
est xor, ne voulais -tu pas dire**
pour l'exponentiation?int(1e9)
est juste10**9
, et vous n'avez pas besoin des parens autour(1+1/i)**z
.Python,
348448407390389 octetsUn merci spécial à @Mego!
Un 448 barré est (presque) toujours un 448! : p
Ceci est basé sur l'approximation de Lanzcos. Golfé d' ici
la source
import *
par exemple) et en utilisant un nom de fonction à un caractère. Notez également que vous ne devez prendre en charge que les entrées réelles.z-=1;
dans la première ligne degamma
pour le corriger. Vous devez également renommergamma
àg
des octets sauvetages et pour éviter les conflits de noms aveccmath.gamma
. Supprimez également les zéros non significatifs.Julia, 41 octets
Ceci est une traduction de la réponse C ++ de Zereges. Alors que mon autre réponse Julia se termine instantanément, c'est plutôt lent. Il calcule les cas de test en quelques secondes chacun sur mon ordinateur.
Non golfé:
la source
Prolog, 114 octets
Ceci est une traduction de la réponse C ++ de Zereges.
Essayez-le en ligne ici
Exécutez-le avec une requête du formulaire:
L'exécuter avec 1e9 récursions prend environ 15 minutes.
Si vous le diminuez à 1e6, cela prend environ 1 seconde, ce qui rend les tests plus faciles (mais moins précis).
L'exécuter dans un interprète sur votre ordinateur / ordinateur portable est également plus rapide pour la plupart des gens.
la source
Mathematica, 40 octets
la source