Я призываю вас написать математический анализатор выражений, который учитывает PEMDAS (порядок операций: круглые скобки, возведение в степень, умножение, деление, сложение, вычитание) без использования регулярных выражений, ранее существовавшей функции "Eval()", библиотека разбора и т.д.
Я видел одну ранее существовавшую задачу оценщика SO (здесь), но это специально требовало оценки слева направо.
Примеры входов и выходов:
"-1^(-3*4/-6)" -> "1"
"-2^(2^(4-1))" -> "256"
"2*6/4^2*4/3" -> "1"
Я написал оценщика в С#, но хотел бы видеть, насколько он плохо сравнивается с умными программистами на выбранных им языках.
Связанный:
Разъяснения:
-
Пусть это функция, которая принимает строковый аргумент и возвращает результат строки.
-
Что касается того, почему нет регулярных выражений, ну, чтобы выровнять игровое поле. Я думаю, что для "самого компактного регулярного выражения" должна быть отдельная задача.
-
Использование StrToFloat() допустимо. "Разбор библиотеки" я хотел исключить такие вещи, как парсеры общего назначения, также для выравнивания игрового поля.
-
Поддержка плавает.
-
Поддержка paretheses, exponentiation и четырех арифметических операторов.
-
Дайте приоритет умножения и разделения.
-
Дайте сложение и вычитание равного приоритета.
-
Для простоты вы можете предположить, что все входы хорошо сформированы.
-
У меня нет предпочтения в отношении того, что ваша функция принимает такие значения, как ".1" или "1e3", как действительные числа, но принятие их заработало бы вашими коричневыми точками.;)
-
Для случаев с делением на нуль вы могли бы вернуть "NaN" (при условии, что вы хотите внедрить обработку ошибок).