Dado un número real t
en (-10^9,13)
(sin incluir -10^9
o 13
) como entrada, salida Γ(t)
, también conocida como la función Gamma , que se define de la siguiente manera:
No puede usar una función Gamma incorporada para resolver esta tarea, ni puede usar funciones de integración numérica o simbólica incorporadas. Su salida debe ser precisa a 6 cifras significativas o dentro 10^-6
del valor real, lo que sea menos restrictivo para el valor dado. La función Gamma incorporada de Python se utilizará para determinar el valor real. Puede suponer que Γ(t)
está definido, es decir, t
es un número real positivo o un número real negativo no entero, y eso |Γ(t)| ≤ 10^9
. Aquí hay un programa de referencia que puede usar para obtener los valores reales, utilizando la función Gamma incorporada de Python.
Ejemplos
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
Reglas
- Este es el código de golf , por lo que gana la respuesta más corta (en bytes).
- Las lagunas estándar están prohibidas.
- La entrada y la salida se pueden realizar de cualquier manera que se considere estándar para su idioma.
- Puede escribir un programa completo, una función o cualquier cosa que normalmente se considere una respuesta válida para su idioma
Tabla de clasificación
El Fragmento de pila al final de esta publicación genera la tabla de clasificación a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que aparecerá en el fragmento:
## [><>](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>
Respuestas:
Pyth, 21 bytes
Al igual que con mi respuesta de TI-BASIC, no he podido probar esto con las iteraciones completas de 8 ^ 10, pero todo parece bien con casos más pequeños.
Explicación:
Pruébelo aquí con 2000 iteraciones en lugar de 8 ^ 10.
fuente
C ++ 14,
868581 bytesNo pasé mucho tiempo con este. Solo busqué una aproximación que parecía la más fácil de implementar (en forma de bytes). Tomará algún tiempo calcular el valor (ya que el bucle está sobre todos los enteros positivos), pero la limitación de tiempo no se especifica en el desafío. Es función anónima (lambda), que toma un argumento (convertible
T
en la quepow(double, T)
yoperator/(T,int)
puede ser llamado) y vuelvedouble
.Sin golfos con el uso
fuente
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x86
gamma(-10e9)
OP, pero declaró que solo se pueden considerar los parámetros para los que se define la función gamma.gamma(10e9)
regresainf
, mientras que la función Gamma incorporada de Python se utilizará para determinar el valor real diceOverflowError: math range error
Minkolang 0.12 ,
353425 bytesEsto se detiene con un error (al tratar de dividir por 0), pero eso está permitido según el consenso de Meta . Agregue un
.
al final para un programa que se detiene normalmente. Pruebe todos los casos de prueba a la vez.(El bucle itera solo 1e4 veces para que termine más pronto que tarde).Explicación
Zereges utilizó una de las definiciones alternativas e infinitas de productos . Como resultado, el otro es mucho más fácil de implementar en Minkolang.
Este es un límite que
n
va hasta el infinito, lo que significa que puedo calcular ambosn!
y sobre la marcha(t+n)
. Entonces saco1/t
(porque0!=1
) yn^t
porque ese no puede calcularse secuencialmente sin conocer el valor final den
. Como sucede, porquen
es el límite, puedo usarlo dos veces. Una vez como factor en el cálculo y una vez como el número de veces para ejecutar el ciclo.Un producto infinito secuencial tiene que comenzar con algo, generalmente 1. En este caso, es
n^t/t
. En el cuerpo del ciclo, calculok/(t+k)
y multiplico esto con el producto hasta ahora. Al final, todo el producto ha sido calculado y producido. Esto es esencialmente lo que hace mi programa, con unn
nivel lo suficientemente alto como para que la respuesta sea lo suficientemente precisa.Como no hay
.
, se envuelve y comienza de nuevo. Sin embargo,n
ahora se produce-1
porque la entrada está vacía, lo que finalmente lleva a intentar dividir por 0, lo que detiene el programa.fuente
Julia, 141 bytes
Esto crea una función lambda sin nombre que acepta un número real y devuelve un número real. Usa la aproximación de Spounge. para calcular Gamma.
Sin golf:
fuente
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)))
debería funcionar para 137 bytes (al menos en Julia 0.6)Japt, 45 bytes
Japt es una versión abreviada de Ja vaScri pt . Interprete
Por supuesto, 1e9 = 1,000,000,000 de iteraciones toma una eternidad, así que para probar, intente reemplazar el
9
con a6
. (1e6 tiene una precisión de ~ 5 cifras significativas. Usar 1e8 en una entrada de12
es suficiente para obtener los primeros seis).Resultados de casos de prueba: (utilizando precisión 1e7)
Cómo funciona
fuente
TI-BASIC, 35 bytes
Esto usa el mismo algoritmo que Zereges.
Advertencia: en realidad no he probado esto con las iteraciones completas de 1e9; basado en el tiempo necesario para valores más pequeños, espero que el tiempo de ejecución sea del orden de meses . Sin embargo, parece converger, y no debería haber problemas con los errores de redondeo. TI almacena números como flotantes decimales con 14 dígitos de precisión.
fuente
Python 3,
74687873 bytesGracias @Mego y @xnor
Esta es una traducción de la respuesta C ++ de Zereges. Básicamente, esta es una definición alternativa de la función gamma, por lo tanto, más precisa (¡y lo mejor es que usa menos bytes!)
Lo siento por todos los errores!
fuente
+1
el rango no importa cuando se trata de miles de millones. Además, debe especificar que se trata de Python 3: necesitaríafrom __future__ import division
una división flotante y unos pocos terabytes de RAM para lidiar con el hecho de querange
devuelve una lista en Python 2. Además, puede reemplazar la1.0
s con1
s y afeitarse 4 bytes^
es xor, ¿no te refieres**
a la exponenciación?int(1e9)
es justo10**9
, y no necesitas los padres alrededor(1+1/i)**z
.Python,
348448407390389 bytesUn agradecimiento especial a @Mego!
¡Un 448 tachado es (casi) todavía un 448! :pag
Esto se basa en la aproximación de Lanzcos. Golfé desde aquí
fuente
import *
por ejemplo) y utilizando un nombre de función de un carácter. También tenga en cuenta que solo necesita admitir entradas reales.z-=1;
en la primera línea degamma
para solucionarlo. También debe cambiar el nombregamma
deg
para guardar bytes y evitar conflictos de nombres concmath.gamma
. También elimine los ceros a la izquierda extraños.Julia, 41 bytes
Esta es una traducción de la respuesta C ++ de Zereges. Mientras mi otra respuesta de Julia termina instantáneamente, esto es bastante lento. Calcula los casos de prueba en un par de segundos cada uno en mi computadora.
Sin golf:
fuente
Prólogo, 114 bytes
Esta es una traducción de la respuesta C ++ de Zereges.
Pruébelo en línea aquí
Ejecútelo con una consulta del formulario:
Ejecutarlo con 1e9 recursiones lleva unos 15 minutos.
Si lo reduce a 1e6, se tarda aproximadamente 1 segundo, lo que facilita las pruebas (pero menos precisas).
Ejecutarlo en un intérprete en su computadora / laptop también es más rápido para la mayoría de las personas.
fuente
Mathematica, 40 bytes
fuente