Вызов
Вот вызов (моего собственного изобретения, хотя я не удивлюсь, если он ранее появился в другом месте в Интернете).
Напишите функцию, которая принимает один аргумент, который является строковое представление простого математическое выражение и оценивает это как значение с плавающей запятой. "простое выражение" может включать любой из следующее: положительное или отрицательное десятичные числа, +, -, *, /, (, ). Выражения используют (нормальный) инфиксная нотация. Операторы должны оцениваться в порядок, который они появляются, т.е. не так, как в 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...
Правила
Я предвкушаю какую-то форму "мошенничества" /хитрости здесь, поэтому, пожалуйста, предоставьте мне предостережение! Обманом я ссылаюсь на использование eval
или эквивалентной функции в динамических языках, таких как JavaScript или PHP, или же компиляция и выполнение кода "на лету". (Я думаю, что моя спецификация "no BODMAS" в значительной степени гарантировала это.) Кроме того, ограничений нет. Я предвижу несколько решений Regex здесь, но было бы неплохо увидеть больше, чем просто.
Теперь меня в основном интересует решение С#/.NET, но любой другой язык будет вполне приемлемым (в частности, F # и Python для функциональных/смешанных подходов). Я еще не решил, буду ли я принимать самое короткое или самое гениальное решение (по крайней мере для языка) в качестве ответа, но я бы приветствовал любую форму решения на любом языке, кроме что я только что запретил!
Мое решение
Теперь я разместил свое решение С# здесь (403 символа). Обновление: Мое новое решение значительно побило старое в 294 символах, с помощью немного симпатичное регулярное выражение! Я подозревал, что это будет легко избито некоторыми языками там с более легким синтаксисом (особенно функциональными/динамическими), и это было доказано правильно, но мне было бы любопытно, если кто-то может побить это на С# все еще.
Update
Я уже видел некоторые очень хитрые решения. Спасибо всем, кто разместил их. Хотя я еще не тестировал ни одного из них, я буду доверять людям и предположить, что они, по крайней мере, работают со всеми приведенными примерами.
Только для примечания, повторное вмешательство (то есть безопасность потоков) не является обязательным условием для этой функции, хотя это бонус.
Формат
Пожалуйста, разместите все ответы в следующем формате для удобства сравнения:
Язык
Количество символов:
Полностью запутанная функция:
(code here)
Функция Clear/semi-obfuscated:
(code here)
Любые заметки об алгоритме/умных сочетаниях, которые он принимает.