Écrivez le code le plus court qui prendra en entrée tout nombre réel supérieur à 1 et produira sa factorielle inverse positive. En d'autres termes, il répond à la question "quel nombre factoriel est égal à ce nombre?". Utilisez la fonction Gamma pour étendre la définition de factorielle à n'importe quel nombre réel comme décrit ici .
Par exemple:
input=6 output=3
input=10 output=3.390077654
parce que 3! = 6
et3.390077654! = 10
Règles
- Il est interdit d'utiliser des fonctions factorielles intégrées ou des fonctions gamma, ou des fonctions qui reposent sur ces fonctions.
- Le programme devrait pouvoir le calculer à 5 chiffres décimaux, avec la capacité théorique de le calculer avec n'importe quelle précision (il devrait contenir un nombre qui peut être rendu arbitraire grand ou petit pour obtenir une précision arbitraire)
- N'importe quelle langue est autorisée, le code le plus court en caractères l'emporte.
J'ai fait un exemple de travail ici . Regarde.
Réponses:
Javascript (116)
La magie noire ici! Donne un résultat en quelques millisecondes .
Seules les fonctions mathématiques élémentaires utilisées:
ln
,pow
,exponential
Dommage que LaTeX ne soit pas supporté sur codegolf mais en gros, j'ai codé un solveur newton pour
f(y)=gamma(y)-n=0
etx=y-1
(carx!
c'estgamma(x+1)
) et des approximations pour les fonctions gamma et digamma.L'approximation gamma est l'approximation de Stirling L'approximation
Digamma utilise la formule d'Euler Maclaurin
La fonction digamma est la dérivée de la fonction gamma divisée par la fonction gamma:
f'(y)=gamma(y)*digamma(y)
Non golfé:
Cas de test:
la source
n=prompt(M=Math)
Mathematica -
745449La bonne façon sera
Si nous abandonnions simplement le test,
?NumberQ
cela fonctionnerait toujours, mais lancerait des avertissements désagréables, qui disparaîtraient si nous passions à l'intégration symboliqueIntegrate
, mais ce serait illégal (je suppose), car la fonction serait automatiquement convertie enGamma
fonction. Nous pouvons également nous débarrasser de la fonction externe de cette façon.En tous cas
Pour vérifier avec une entrée appropriée, juste la définition de la fonction (ne peut pas laisser MatLab gagner)
Si le factoriel intégré était autorisé
Ce qui précède ne donne pas un entier (qui est l'argument pour une vraie fonction factorielle). Ce qui suit:
la source
NumberQ
test de configuration est-il requis? Ou parensE^(-t)
? Est - il triche à tournerNIntegrate
àIntegrate
? Probablement ... :)isé:
7246 caractèresC'est presque un ajustement parfait ... il existe un "langage" qui semble être destiné précisément au golf mathématique: ised . Sa syntaxe obscurcie en fait un code très court (pas de variables nommées, juste des emplacements de mémoire entiers et beaucoup d'opérateurs polyvalents à caractère unique). Définissant la fonction gamma à l'aide d'une intégrale, je l'ai obtenue avec 80 caractères apparemment aléatoires
Ici, le slot mémoire $ 4 est une fonction factorielle, le slot mémoire $ 6 fonction de bissection et le slot mémoire $ 2 devraient être définis pour entrer (donné avant de sourcer ce code). Les emplacements $ 0 et $ 1 sont les limites de la bissection. Exemple d'appel (en supposant que le code ci-dessus se trouve dans le fichier
inversefactorial.ised
)Bien sûr, vous pouvez utiliser la fonction intégrée! opérateur, auquel cas vous obtenez jusqu'à 45 caractères
La précaution de l'opérateur est parfois bizarre.
Modifier: n'oubliez pas d'inclure les fonctions au lieu de les enregistrer. Battez Mathematica avec 72 caractères!
Et en utilisant le! intégré vous obtenez 41.
Une mise à jour attendue depuis un an:
Je viens de réaliser que c'était très inefficace. Golfé jusqu'à 60 caractères:
Si utf-8 est utilisé (Mathematica le fait aussi), nous arrivons à 57:
Une réécriture un peu différente peut la réduire à 46 (ou 27 si vous utilisez la fonction intégrée!):
Les deux derniers caractères peuvent être supprimés si vous êtes d'accord pour que la réponse soit imprimée deux fois.
la source
MATLAB
5447Si je choisis les bons défis, MATLAB est vraiment bien pour le golf :). Dans mon code, je trouve la solution de l'équation (ux!) = 0 dans laquelle u est l'entrée utilisateur et x la variable à résoudre. Cela signifie que u = 6 conduira à x = 3, etc ...
La précision peut être modifiée en modifiant la limite supérieure de l'intégrale, qui est fixée à 99. L'abaisser modifiera la précision de la sortie comme suit. Par exemple pour une entrée de 10:
etc.
la source
Python - 199 caractères
D'accord, vous aurez donc besoin de beaucoup d'espace de pile et de beaucoup de temps, mais bon, ça y arrivera!
Voici une autre approche avec encore plus de récursivité.
Ces deux
>>>f(10,1)
paramètres peuvent être testés à condition de définir la limite de récursivité autour de 10000. Plus d'une décimale d'exactitude ne correspondra probablement pas à une limite de récursivité réaliste.Intégrant les commentaires et quelques modifications, jusqu'à 199 caractères.
la source
code-golf
question, vous devez donc fournir la réponse la plus courte, en indiquant la longueur de votre solution.Python 2.7 -
215189 caractèresUsage:
Pour modifier la précision: passez
1e-5
à un nombre plus petit pour une plus grande précision, un nombre plus grand pour une précision moindre. Pour une meilleure précision, vous voudrez probablement donner une meilleure valeur poure
.Cela implémente simplement la fonction factorielle en tant que
f
, puis effectue une recherche binaire pour affiner la valeur la plus précise de l'inverse de l'entrée. Suppose que la réponse est inférieure ou égale à 99 (cela ne fonctionnerait pas pour une réponse de 365 à coup sûr, j'obtiens une erreur de débordement mathématique). L'utilisation d'espace et de temps très raisonnable se termine toujours.Vous pouvez également remplacer
if abs(n-f(x))<=10**-5: print x;break
parprint x
pour raser 50 caractères . Il bouclera pour toujours, vous donnant une estimation de plus en plus précise. Je ne sais pas si cela correspondrait aux règles.la source
cat file | wc -c
.dg -
131133 octetsPuisque dg produit du bytecode CPython, cela devrait aussi compter pour Python, mais oh ... Quelques exemples:
EDIT: Ajout de deux octets parce que je ne me souvenais pas qu'il devrait également accepter les flottants!
la source
42.8006566063
, donc ils correspondent à moins de 5 chiffres de précision!1e100
il donne:,69.95780520000001
car1e150
il sort96.10586423000002
, tandis que pour1e200
il explose. Mais vraiment je ne sais pas si ces résultats sont fiables ...R , 92 octets
Une fonction,
g
qui prend en entréez
et sort l'inverse factorielle de ce nombreIl y a presque certainement plus à jouer à cela, donc si vous voyez quelque chose que je peux améliorer, faites-le moi savoir.
Essayez-le en ligne!
Non golfé et commenté
Essayez-le en ligne!
la source
Javascript (sans utiliser de boucles!)
Pour ce faire, j'ai utilisé une approximation numérique bien connue de l'inverse de l'approximation factorielle de Stirling , (et j'ai également été inspiré par ce ..cough .. toux .. code de quelqu'un d'autre ...)
la source