Défi
Le défi consiste à écrire un programme qui prend un nombre positifa
, un nombre non nulb
et des sorties a^b
(a élevé à la puissance b). Vous ne pouvez utiliser + - * / abs()
que des fonctions / opérateurs mathématiques. Celles-ci ne peuvent être appliquées qu'aux valeurs scalaires, mais pas aux listes entières ou aux tableaux.
Exemples:
1.234 ^ 5.678 = 3.29980
4.5 ^ 4.5 = 869.874
4.5 ^-4.5 = 0.00114959
Pertinent: http://xkcd.com/217/
Détails
Vous pouvez écrire une fonction ou une construction similaire à utiliser dans la console. Si vous ne pouvez pas utiliser l'entrée de console, vous pouvez supposer que les deux nombres sont enregistrés dans des variables et des sorties via une sortie standard ou en écrivant dans un fichier. La sortie doit être correcte avec au moins 4 chiffres significatifs. Vous pouvez supposer que les deux a
et b
sont différents de zéro. Un temps d'exécution de plus de 1 minute n'est pas acceptable. Le moins d'octets gagnera. Veuillez expliquer votre programme et votre algorithme.
EDIT: Seules les bases positives doivent être prises en compte. Vous pouvez supposer a>0
. Sachez que les deux nombres ne doivent pas nécessairement être des nombres entiers !!!
-0.5 ** 0.5
?Réponses:
Python, 77
Comme pour certaines autres réponses, cela est basé sur log et exp. Mais les fonctions sont calculées en résolvant numériquement des équations différentielles ordinaires.
Répond-il aux exigences? Pour les exemples de la question, oui. Pour un grand, cela prendra beaucoup de temps. Pour les grands a ou b, cela deviendra inexact.
Exemples:
Mise à jour: Flawr a demandé plus de détails sur les mathématiques, alors c'est parti. J'ai considéré les problèmes de valeur initiale suivants:
Si je peux trouver la valeur de t telle que x (t) = a, alors j'aurai y (t) = exp (bt) = a ^ b. La méthode la plus simple pour résoudre numériquement un problème de valeur initiale est la méthode d'Euler . Vous calculez la dérivée que la fonction est censée avoir, puis faites un pas dans la direction de la dérivée, et proportionnellement à celle-ci, mais mis à l'échelle par une toute petite constante. Voilà donc ce que je fais, faire de petites étapes jusqu'à ce que x soit aussi grand que a, puis voir ce que y est à ce moment-là. Eh bien, c'est comme ça que je pensais. Dans mon code, t n'est jamais calculé explicitement (c'est 1e-7 * le nombre d'étapes de la boucle while), et j'ai enregistré quelques caractères en faisant les calculs pour x avec a à la place.
la source
JavaScript (E6)
155174191Edit 2 Comme suggéré par @bebe, utilisation de la fonction récursive (moins
bonne mais plus courte) Fonction R légèrement modifiée pour éviter «trop de récursivité»
Suite de tests ajoutée. La fonction fonctionne bien pour les bases <3000 et l'exposant dans la plage -50..50.
Modifier plus de golf et une meilleure précision
Tout nombre réel peut être approximatif avec un nombre rationnel (et les nombres «réels» standard IEEE stockent des rationnels en fait). Tout nombre rationnel peut être exprimé sous la forme d'une fraction a / b avec des entiers a et b. x ^ (a / b) est la racine b de (x ^ a) ou (racine b de x) ^ a. L'exponentiation entière est assez facile en quadrature. La racine entière peut être approximée à l'aide de méthodes numériques.
Code
Tester dans la console FireFox ou FireBug
la source
e&1&&(r*=b)
fait, sauf en multipliantr
parb
?if(e&1 != 0) r *= b
P=(x,e)=>(F=(b,e,r=1)=>e?F(b*b,e>>1,e&1?r*b:r):r,R=(b,e,g=1,y=1e-16,d=(b/F(g,e-1)-g)/e)=>d>y|d<-y?R(b,e,g+d):g,e<0&&(x=1/x,e=-e),f=1<<24,F(R(x,f),e*f))
(je dois être fatigué)Haskell, 85
90Algorithme exp-log standard. Maintenant, avec un nom différent, raser quelques caractères supplémentaires:
raise
est maintenant appelé(%)
, ou%
en notation infixe, faisant même que son utilisation consomme moins d'octets:4.5%(-4.5)
La version non golfée utilise également seulement 172 octets:
la source
JS (ES6), 103 octets
Exemples :
Utilisez la série Taylor.
b^x = 1 + ln(b)*x/1! + (ln(b)*x)^2/2! + (ln(b)*x)^3/3! + (ln(b)*x)^4/4! + ...
avec approximation du logarithme naturel :
ln(b) = (1-1/x) + (1-1/x)^2/2 + (1-1/x)^3/3 + (1-1/x)^4/4 + ...
J'ai utilisé 128 itérations pour calculer
b^x
(plus d'itérations sont difficiles en raison de factorielles) et 262144 itérations pourln(b)
la source
e(80,5) ->1555962210.2240903
peut-être moinsgolflua 120
J'utilise le fait que
et écrit mes propres
log
&exp
fonctions. Les valeursa
etb
doivent être saisies sur des sauts de ligne lors de l'exécution dans le terminal:Exemples de cycles:
Une version non golfée de Lua est,
la source