Порядок операций, PEMDAS, является основным правилом в математике, говорящим нам, какие операции порядка должны быть выполнены:
«Скобки, экспоненты, умножение и деление, а также сложение и вычитание»
Проблема в том, что PEMDAS не очень универсален! Что делать, если вы хотите сделать это в другом порядке? Мы не будем связываться с круглыми скобками, поэтому мы держим их там, где они есть (сначала).
Создайте программу, которая принимает два аргумента:
- Строка, указывающая, в каком порядке должны следовать операции. Вот некоторые примеры
"DAMES"
,"SAD, ME"
,"ME SAD"
,"MEADS"
. Да, с пробелами все в порядке, так как порядок легче запомнить.- Следующие предложения в чате: Поддержка пробелов и запятых теперь не является обязательной.
- Если одна из букв отсутствует или есть дополнительные буквы, которых не должно быть, вы можете считать введенные данные недействительными и обрабатывать их по своему усмотрению.
- Строка или выражение, содержащее выражение, которое должно быть оценено.
Возвращает результат выражения в виде десятичного числа или целого числа. Если ответ не является целым числом, он должен быть возвращен как десятичное число.
Правила:
- Можно объединить два входных аргумента в один, если это проще на вашем языке.
- Это не обязательно должна быть строка, но в ней должны быть буквы. Вы не можете заменить сложение на 1, деление на 2 и т. Д.
- Вы можете выбрать, какой вход является первым.
- Выражение вычисляется
справа налевослева направо. (Изменение правила. Принимаются любые постеры, подающие первые 12 часов с обратным ходом). - Операции использовать символы:
( ) ^ * / + -
. Например, вы не можете использовать¤
вместо+
добавления. - Пробелы во входном выражении недопустимы в качестве входных
- Унарный +/- недопустим в качестве ввода, если он непосредственно следует за + или -. Считать
3+-2
неверным ввод. Это можно обработать как угодно (не должно выдавать ошибку). Если+
или-
следует какой - либо другой оператор , чем плюс или минус, он рассматривается как обычно:3*-3 = -9
,sin(-2)=-0.909
- Программа должна строго следовать буквам, а значит
"EMDAS", 1-3+4 => -6
и"EMDSA", 1-3+4 => 2
.
Примеры:
Input: "EMDAS", "3+6*2/4-1" // -> 3+12/4-1 -> 3+3-1 -> 6-1 -> 5
Output: 5
Input: "DAMES", "3+6*2/4-1" // -> 3+6*0.5-1 -> 9*0.5-1 -> 4.5-1 -> 3.5
Output: 3.5
Input: "SAD, ME", "3+6*2/4-1" // -> 3+6*2/3 -> 9*2/3 -> 9*0.66667 -> 6
Output: 6
Input: "ME ADS", "3+5^4/2-3*2 // -> 3+5^4/2-6 -> 3+625/2-6 -> 628/2-6 -> 314-6 -> 308
Output: 308
Input: "AM EDS", "4*3-sin(0.5^2)*3+1" // -> 4*3-sin(0.5^2)*4 -> 12-sin(0.5^2)*4 -> 4*3-(4*sin(0.5^2)) -> 12-(4*sin(0.5^2)) -> 12-(4*sin(0.25)) -> 12-(4*0.24740) -> 12-0.98961 -> 11.01038
Output: 11.01038
Input: "DAMES", "4-5-6" // -> (4-5)-6 -> = -7
Output: -7 // NOT: -> 4-(5-6) -> 4-(-1) -> 5
Обратите внимание, что скобки добавлены, чтобы показать, что умножение 4*sin(0.5^2)
вычисляется до возведения в степень.
Это код гольф, поэтому выигрывает самый короткий код в байтах.
BODMAS
илиBIDMAS
в школе.B
= СкобкиO
илиI
= порядок или индексы.p
необходимо? Это не в примерахОтветы:
JavaScript (ES6) 349
353 387 400... возможно все еще играем в гольф
Этот старый мой парсер иногда пригодится - (уже использовался в двух других задачах)
Ungolfed
источник
(t=>t=='('?(z=1, Q.push('_'))
, вместе со всеми новыми строками.Math.pow(a,b)
чтобыa**b
R 3.3.2:
209196187177 байтовИдея состоит в том, чтобы «неправильно использовать» неарифметические операторы <, &, |, ~,? где мы знаем приоритет (см.
?Syntax
в R - но перед переопределением;)) и переопределяем их с помощью заданных арифметических операторов. Отображение осуществляется в соответствии с желаемым порядком операций.Пробелы и запятые на входе не поддерживаются.
Гольф версия
Развернулся и прокомментировал:
Примеры:
источник