Escreva o código mais curto que aceitará qualquer número real maior que 1 como entrada e produzirá seu fatorial inverso positivo. Em outras palavras, responde à pergunta "que número fatorial é igual a esse número?". Use a função Gamma para estender a definição de fatorial para qualquer número real, conforme descrito aqui .
Por exemplo:
input=6 output=3
input=10 output=3.390077654
porque 3! = 6
e3.390077654! = 10
Regras
- É proibido o uso de funções fatoriais ou funções gama, ou funções que dependam dessas funções.
- O programa deve ser capaz de calculá-lo com 5 dígitos decimais, com a capacidade teórica de calculá-lo com qualquer precisão (deve conter um número que possa ser arbitrário grande ou pequeno para obter precisão arbitrária)
- Qualquer idioma é permitido, o código mais curto em caracteres vence.
Eu fiz um exemplo de trabalho aqui . Dar uma olhada.
Respostas:
Javascript (116)
Magias negras aqui! Dá um resultado em alguns milissegundos .
Somente funções matemáticas elementares usados:
ln
,pow
,exponential
Pena que o LaTeX não é suportado no codegolf, mas basicamente codifiquei um solucionador de newton para
f(y)=gamma(y)-n=0
ex=y-1
(porquex!
égamma(x+1)
) e aproximações para as funções gama e digamma.A aproximação gama é aproximação Stirling Aproximação
digamma use a fórmula de Euler Maclaurin
A função digamma é a derivada da função gama dividida pela função gama:
f'(y)=gamma(y)*digamma(y)
Ungolfed:
Casos de teste :
fonte
n=prompt(M=Math)
Mathematica -
745449.A maneira correta será
Se simplesmente abandonássemos o teste,
?NumberQ
ele ainda funcionaria, mas lançaria alguns avisos desagradáveis, que desapareceriam se mudarmos para a integração simbólicaIntegrate
, mas isso seria ilegal (suponho), porque a função seria automaticamente convertida emGamma
função. Também podemos nos livrar da função externa dessa maneira.De qualquer forma
Para verificar com a entrada correta, basta definir a função (não é possível deixar o MatLab vencer)
Se fatorial embutido fosse permitido
O exposto acima não fornece um número inteiro (que é o argumento para uma verdadeira função fatorial). O seguinte faz:
fonte
NumberQ
necessário teste padrão? Ou parens emE^(-t)
? É batota para ligarNIntegrate
paraIntegrate
? Provavelmente ... :)ised:
7246 caracteresIsso é quase um ajuste perfeito ... existe uma "linguagem" por aí que parece ser feita exatamente para o golfe matemático: ised . Sua sintaxe ofuscada cria um código muito curto (sem variáveis nomeadas, apenas slots de memória inteiros e muitos operadores versáteis de char único). Definindo a função gama usando uma integral, consegui 80 caracteres aparentemente aleatórios
Aqui, o slot de memória $ 4 é uma função fatorial, espera-se que a função de bissecção do slot de memória $ 6 e o slot de memória $ 2 sejam configurados como entrada (fornecido antes de fornecer este código). Os slots $ 0 e $ 1 são os limites da bissecção. Exemplo de chamada (supondo que o código acima esteja no arquivo
inversefactorial.ised
)Claro, você pode usar o builtin! operador, nesse caso você tem até 45 caracteres
Cuidado, a precedência do operador às vezes é estranha.
Editar: lembrou-se de incorporar as funções em vez de salvá-las. Bata o Mathematica com 72 caracteres!
E usando o! incorporado você obtém 41.
Atualização com atraso de um ano:
Acabei de perceber que isso era altamente ineficiente. Golfe até 60 caracteres:
Se utf-8 for usado (o Mathematica também), chegamos a 57:
Uma reescrita um pouco diferente pode reduzir para 46 (ou 27, se estiver usando o builtin!):
Os dois últimos caracteres podem ser removidos se você estiver de acordo com a resposta impressa duas vezes.
fonte
MATLAB
5447Se eu escolher os desafios certos, o MATLAB é muito bom para jogar golfe :). No meu código, encontro a solução para a equação (ux!) = 0 na qual u é a entrada do usuário ex x a variável a ser resolvida. Isso significa que u = 6 levará a x = 3, etc ...
A precisão pode ser alterada alterando o limite superior da integral, que é definido como 99. Reduzir isso alterará a precisão da saída da seguinte maneira. Por exemplo, para uma entrada 10:
etc.
fonte
Python - 199 caracteres
Ok, então você precisará de muito espaço na pilha e muito tempo, mas, ei, chegará lá!
Aqui está outra abordagem com ainda mais recursão.
Ambos podem ser testados
>>>f(10,1)
desde que você defina o limite de recursão em torno de 10000. Mais de uma casa decimal de precisão provavelmente não será concluída com nenhum limite de recursão realista.Incorporando os comentários e algumas modificações, até 199 caracteres.
fonte
code-golf
pergunta, é necessário fornecer a resposta mais curta, informando a duração da sua solução.Python 2.7 -
215189 caracteresUso:
Para alterar a precisão: altere
1e-5
para um número menor para maior precisão, número maior para pior precisão. Para uma melhor precisão, você provavelmente deseja dar um valor melhore
.Isso apenas implementa a função fatorial como
f
e, em seguida, faz uma pesquisa binária para aprimorar o valor mais preciso do inverso da entrada. Supõe que a resposta seja menor ou igual a 99 (com certeza não funcionaria para uma resposta do 365, recebo um erro de estouro de matemática). O uso muito razoável de espaço e tempo, sempre termina.Como alternativa, substitua
if abs(n-f(x))<=10**-5: print x;break
porprint x
para cortar 50 caracteres . Ele funcionará para sempre, oferecendo uma estimativa cada vez mais precisa. Não tenho certeza se isso se encaixaria com as regras.fonte
cat file | wc -c
.dg -
131133 bytesComo o dg produz o bytecode CPython, isso também deve contar para o Python, mas ... Alguns exemplos:
Edição: Adicionado dois bytes, porque eu não lembrava que ele deveria aceitar carros alegóricos também!
fonte
42.8006566063
, então eles correspondem a 5 dígitos de precisão!1e100
ele dá:69.95780520000001
para1e150
ele produz96.10586423000002
, enquanto que para1e200
ele explode. Mas realmente eu não sei se esses resultados são confiáveis ...R , 92 bytes
Uma função,
g
que recebe entradaz
e gera o fatorial inverso desse númeroÉ quase certo que ainda há muito a ser jogado fora disso, então se você vir algo que eu possa melhorar, entre em contato.
Experimente online!
Sem Golfe e Comentado
Experimente online!
fonte
Javascript (sem usar loops!)
Para fazer isso, usei uma aproximação numérica bem conhecida do inverso da aproximação do fator de Stirling (e também me inspirei nesse código de ..cough .. tosse .. de outra pessoa ...)
fonte