这就是挑战(我自己的发明,如果它以前出现在网络的其他地方,我也不会感到惊讶)。
编写一个接受单个 这是一个 简单的字符串表示形式 数学表达式和计算式 它作为一个浮点值 「简单表达式」可包括 积极的或消极的 十进制数,+,-,*,/,(,)。 表达式使用(正常) 中缀表示法。 运算符应在 它们出现的顺序,即 没有 BODMAS 虽然括号应该是正确的 当然是观察到的。函数应该返回 任何可能表达式的正确结果 但是,该函数并没有 处理格式不正确的表达式(即语法不正确的表达式)。
例句:
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...
我期待某种形式的“欺骗”/狡猾在这里,所以请让我预先警告它!通过作弊,我指的是在动态语言(如 JavaScript 或 PHP)中使用 eval
或等效函数,或者同样地动态编译和执行代码。(然而,我认为我的“ no BODMAS”规范已经很好地保证了这一点。)除此之外,没有任何限制。我期望在这里看到一些正则表达式解决方案,但是如果能看到更多的解决方案就更好了。
我主要对 C #/感兴趣。NET 解决方案,但任何其他语言也完全可以接受(特别是函数式/混合式方法的 F # 和 Python)。我还没有决定是否接受最短的或者最巧妙的解决方案(至少对于语言来说)作为答案,但是我欢迎 任何语言的任何形式的解决方案,除了我刚才禁止的!
我现在已经发布了我的 C # 解决方案 给你(403个字符)。更新: 我的新解决方案已经击败了老一显着在 294个字符,在一点可爱的正则表达式的帮助下!我怀疑这会很容易被一些语法更轻巧的语言(特别是函数式/动态的语言)打败,并且已经被证明是正确的,但是我很好奇是否有人能够在 C # 中打败它。
我已经看到了一些非常巧妙的解决方案。感谢所有发帖的人。虽然我还没有测试它们中的任何一个,但是我会相信人们,并假设他们至少可以处理所有给定的示例。
注意,可重入性(即线程安全性)是该函数的 没有要求,尽管这是一个额外的好处。
为方便比较,请以下列格式张贴所有答案:
注意用词
字符数: ? ? ?
完全模糊的功能:
(code here)
清晰/半模糊的功能:
(code here)
关于算法的任何注释/它所采用的聪明的快捷方式。