Dado um número real t
em (-10^9,13)
(não incluindo -10^9
ou 13
) como entrada, saída Γ(t)
, também conhecida como função Gamma , que é definida da seguinte forma:
Você não pode usar uma função Gamma interna para resolver esta tarefa, nem funções de integração numérica ou simbólica internas. Sua saída deve ter precisão de 6 dígitos significativos ou dentro 10^-6
do valor real, o que for menos restritivo para o valor especificado. A função Gamma interna do Python será usada para determinar o valor real. Você pode assumir que Γ(t)
está definido - ou seja, t
é um número real positivo ou um número real negativo não inteiro - e isso |Γ(t)| ≤ 10^9
. Aqui está um programa de referência que você pode usar para obter os valores reais, usando a função Gamma interna do Python.
Exemplos
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
Regras
- Isso é código-golfe , então a resposta mais curta (em bytes) vence.
- As brechas padrão são proibidas.
- A entrada e a saída podem ser executadas da maneira que for considerada padrão para o seu idioma.
- Você pode escrever um programa completo, uma função ou qualquer coisa que seja normalmente considerada uma resposta válida para o seu idioma.
Entre os melhores
O snippet de pilha na parte inferior desta postagem gera o cabeçalho das respostas a) como uma lista da solução mais curta por idioma eb) como um cabeçalho geral.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números em seu cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou deseja listar as penalidades de sinalizador de intérprete separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](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>
Respostas:
Pitão, 21 bytes
Como na minha resposta do TI-BASIC, não pude testar isso com as iterações completas de 8 ^ 10, mas tudo parece bom em casos menores.
Explicação:
Experimente aqui com 2000 iterações em vez de 8 ^ 10.
fonte
C ++ 14,
868581 bytesEu não gastei muito tempo com isso. Eu apenas olhei para uma aproximação que parecia a mais fácil de implementar (na forma de bytes). Levará algum tempo para calcular o valor (já que o loop ultrapassa todos os números inteiros positivos), mas a limitação de tempo não está especificada no desafio. É função anônima (lambda), que leva qualquer argumento (conversível para
T
ondepow(double, T)
eoperator/(T,int)
pode ser chamado) e retornadouble
.Ungolfed with use
fonte
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x86
gamma(-10e9)
mas OP afirmou que somente parâmetros para os quais a função gama está definida podem ser considerados.gamma(10e9)
retornosinf
, enquanto Python embutido no Gamma função será usada para determinar o valor real dizOverflowError: math range error
Tamanho 0.12 ,
353425 bytesIsso pára com um erro (ao tentar dividir por 0), mas isso é permitido conforme o consenso do Meta . Adicione um
.
no final para um programa que para normalmente. Tente todos os casos de teste de uma só vez. (O loop itera apenas 1e4 vezes, para terminar mais cedo ou mais tarde.)Explicação
Zereges usou uma das alternativas, infinitas definições de produtos . Como se vê, o outro é muito mais viável de implementar em Minkolang.
Este é um limite no que
n
diz respeito ao infinito, o que significa que eu posso calcular ambosn!
e à(t+n)
medida que avançamos. Então eu retiro1/t
(porque0!=1
) en^t
porque esse não pode ser calculado sequencialmente sem conhecer o valor final den
. Por acaso, comon
é o limite, posso usá-lo duas vezes. Uma vez como um fator no cálculo e uma vez como o número de vezes para executar o loop.Um produto infinito seqüencial precisa começar com algo, geralmente 1. Nesse caso, é
n^t/t
. No corpo do loop, eu calculok/(t+k)
e multiplico isso pelo produto até o momento. No final, todo o produto foi calculado e produzido. Isso é essencialmente o que meu programa faz, comn
alto o suficiente para que a resposta seja precisa o suficiente.Como não há
.
, ele se volta e recomeça. No entanto,n
agora produz-1
porque a entrada está vazia, o que eventualmente leva à tentativa de dividir por 0, o que interrompe o programa.fonte
Julia, 141 bytes
Isso cria uma função lambda sem nome que aceita um número real e retorna um número real. Ele usa a aproximação do Spounge para calcular Gamma.
Ungolfed:
fonte
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)))
deve funcionar para 137 bytes (pelo menos em Julia 0,6)Japonês, 45 bytes
Japt é uma versão abreviada do Ja vaScri pt . Intérprete
Obviamente, 1e9 = 1.000.000.000 de iterações leva uma eternidade; portanto, para testar, tente substituir o
9
por um6
. (1e6 é preciso até ~ 5 números significativos. Usar 1e8 em uma entrada de12
é suficiente para obter os seis primeiros.)Resultados do caso de teste: (usando precisão 1e7)
Como funciona
fonte
TI-BASIC, 35 bytes
Isso usa o mesmo algoritmo que Zereges.
Advertência: Na verdade, eu não testei isso com as iterações 1e9 completas; com base no tempo gasto para valores menores, espero que o tempo de execução seja da ordem de meses . No entanto, parece convergir e não deve haver problemas com erros de arredondamento. A TI armazena números como números decimais com 14 dígitos de precisão.
fonte
Python 3,
74687873 bytesObrigado @Mego e @xnor
Esta é uma tradução da resposta em C ++ de Zereges. Basicamente, esta é uma definição alternativa da função gama, portanto, mais precisa (e o melhor é que usa menos bytes!)
Sinto muito por todos os erros!
fonte
+1
intervalo não importa quando você está lidando com bilhões. Além disso, você deve especificar que esse é o Python 3 - você precisariafrom __future__ import division
de divisão flutuante e alguns terabytes de RAM para lidar com o fato derange
retornar uma lista no Python 2. Além disso, você pode substituir1.0
s por1
se afastar 4 bytes.^
é xor, você não quis dizer**
exponenciação?int(1e9)
é justo10**9
e você não precisa de parênteses(1+1/i)**z
.Python,
348448407390389 bytesAgradecimentos especiais a @Mego!
Um 448 riscado ainda é (quase) ainda um 448! : p
Isso é baseado na aproximação de Lanzcos. Golfed daqui
fonte
import *
por exemplo) e usando um nome de função de um caractere. Observe também que você só precisa dar suporte à entrada real.z-=1;
na primeira linha degamma
para corrigi-lo. Você também deve renomeargamma
parag
para bytes salvos e para evitar conflitos de nomes comcmath.gamma
. Solte também os zeros iniciais estranhos.Julia, 41 bytes
Esta é uma tradução da resposta C ++ de Zereges. Enquanto minha outra resposta de Julia termina instantaneamente, isso é bastante lento. Ele calcula os casos de teste em alguns segundos, cada um no meu computador.
Ungolfed:
fonte
Prolog, 114 bytes
Esta é uma tradução da resposta C ++ de Zereges.
Experimente online aqui
Execute-o com uma consulta no formulário:
Executá-lo com recursões 1e9 leva cerca de 15 minutos.
Se você diminuir para 1e6, leva cerca de 1 segundo, o que facilita o teste (mas menos preciso).
A execução em um intérprete no seu computador / laptop é provavelmente mais rápida para a maioria das pessoas.
fonte
Mathematica, 40 bytes
fonte