Défi
Voici le défi (de ma propre invention, bien que je ne serais pas surpris si elle a déjà paru ailleurs sur le web).
Écrire une fonction qui prend un seul argument qui est un représentation sous forme de chaîne d'un simple expression mathématique et évalue comme une valeur à virgule flottante. Un "la simple expression" peuvent inclure suivantes: positif ou négatif les nombres décimaux, +, -, *, /, (, ). Expressions (normal) notation infixe. Les opérateurs devraient être évalués dans le ordre où ils apparaissent, c'est à dire pas comme dans BODMAS, bien que les crochets devraient être correctement observé, bien sûr. La fonction doit retourner le résultat correct pour toute expression possible de cette forme. Cependant, la fonction n'a pas pour traiter la malformation de expressions (c'est à dire ceux avec une mauvaise syntaxe).
Des exemples d'expressions:
1 + 3 / -8 = -0.5 (No BODMAS) 2*3*4*5+99 = 219 4 * (9 - 4) / (2 * 6 - 2) + 8 = 10 1 + ((123 * 3 - 69) / 100) = 4 2.45/8.5*9.27+(5*0.0023) = 2.68...
Les règles
Je prévois une certaine forme de "tricher"/astuces ici, donc merci de me prévenir contre elle! En trichant, je me réfère à l'utilisation de l' eval
ou l'équivalent de la fonction dans les langages dynamiques tels que JavaScript ou PHP, ou également la compilation et l'exécution de code à la volée. (Je pense que mon spécification de "pas de BODMAS" a à peu près garanti à cela, cependant.) En dehors de cela, il n'y a pas de restrictions. J'anticipe un peu de Regex solutions ici, mais il serait agréable de voir plus que ça.
Maintenant, je m'intéresse principalement en C#/.NET solution ici, mais toute autre langue serait parfaitement acceptable (en particulier, F# et Python pour la fonctionnelle/approches mixtes). Je n'ai pas encore décidé si je vais accepter le plus court ou le plus ingénieux de la solution (au moins pour la langue) comme la réponse, mais je suis favorable à toute forme de solution dans n'importe quelle langue, à l'exception de ce que je viens interdit au-dessus!
Ma Solution
Maintenant, j'ai posté mon C# solution ici (403 caractères). Mise à jour: Ma nouvelle solution a battu l'ancienne de manière significative à 294 caractères, avec l'aide d'un peu de belle regex! Je me doutais bien que cela permettra d'obtenir facilement battu par certains des langues avec le plus léger de la syntaxe (en particulier le fonctionnel/dynamique), et ont été prouvés à droite, mais je serais curieux de savoir si quelqu'un pourrait battre ce en C# encore.
Mise à jour
J'ai vu quelques très rusé déjà des solutions. Merci à tous ceux qui ont posté. Bien que je n'ai pas testé l'un d'eux encore, je vais faire confiance aux gens et assument-ils au moins travailler avec tous les exemples donnés.
Juste pour la remarque, re-entrancy (c'est à dire thread-safety) n'est pas une exigence pour la fonction, si c'est un bonus.
Format
Merci de poster toutes les réponses dans le format suivant dans le but de faciliter la comparaison:
Langue
Nombre de caractères: ???
Entièrement codé à la fonction:
(code here)
Clair/semi-caché de la fonction:
(code here)
Toutes les notes sur l'algorithme/intelligent raccourcis qu'il faut.