Вступление
В детстве наступает момент, когда вы думаете, что освоили сложение и умножение, тогда кто-то приходит и сообщает вам, что:
a * b + c = (a * b) + c! = a * (b + c),
и что это не был простой или линейный процесс, как вас учили ранее. Вы узнаете, что существует нечто, называемое порядком операций . Это очень важный способ сохранения некоторого уровня согласованности и выражений, без использования скобок.
Общая сюжетная линия
Однажды вы просыпаетесь от звука паники на улицах. Экстремистская группировка под названием « 2560 » (сокращение от «Организация против порядка действий», с грубым извращением) использовала свои злые методы, чтобы взять под контроль все ядерное оружие в мире. Они держат в заложниках всю планету, и у них есть простое требование: отменить принятый порядок операций или уничтожить лицо (скобки должны сохранять их приоритет). Новая система называется PSADME (круглые скобки, вычитание / сложение, деление / умножение, экспоненты), а выражения оцениваются справа налево:
a - b - c = a - (b - c) = a + c - b
Проходят дни, и переход идет. В то время как математики и физики все заняты переписыванием своих уравнений, перед специалистами по компьютерам стоит задача изменить способ интерпретации математических выражений компьютерами. Вы принадлежите к секретной группе по программированию мятежников, которая стремится причинить как можно больше мучений новым глобальным повелителям - и, случайно, вас 2560 случайным образом выбирают и поручают создать программу расчета эталонов.
Ваша миссия
Напишите программу (или функцию), которая принимает (числовое) математическое выражение в качестве входных данных, вычисляет выражение с использованием PSADME в качестве порядка операций и выводит результат. Выражения должны оцениваться справа налево, поэтому
Для простоты все предоставленные числа будут целыми числами, а вычисления приведут к целочисленным результатам.
Правила и оценки
- Программа должна принимать ввод длиной до 128 символов - если ваш язык / платформа имеет меньшую максимальную длину ввода, это является приемлемым оправданием.
- Стандартные лазейки запрещены.
- Код победителя будет выбран 18 ноября (4 недели с этой даты).
- Не стесняйтесь размещать код, который не будет считаться достойным игры в гольф. Это о веселье. Если у вас есть интересный способ сделать это, но вы не можете играть в гольф самостоятельно (или по характеру вашего метода), вы можете опубликовать его в любом случае.
Как обычно, выигрышный код - это код с наименьшим количеством байтов, с некоторыми бонусами за развлекательную ценность:
- -5 для избежания любого использования символов в предоставленном выражении: + , - , ( , ) , ^ , * , /
- -5 для выполнения расчетов требуется более 5 минут (но не более 10 минут) для расчета на стандартном компьютере, без очевидного метода (с использованием часов или ненужных циклов); Цель состоит в том, чтобы убедить новых повелителей, что вы не пытаетесь нарушить их расчеты.
- - (5 + N) для прямого оскорбительного сообщения (длиной N, не включая начальные / конечные пробелы) о членах The 2560, которое должно быть написано наглядно в вашем коде, с некоторыми нелепыми объяснениями того, почему это должно быть там. Если он удален, код не должен работать правильно. Да, бесплатные баллы за развлекательную ценность.
Примеры и объяснения
[program] 2 - 2 - 2
2
2 - (2 - 2) = 2
[program] (2 + 2 * 3 + 3) / 3 + 3
4
(4 * 6) / (3 + 3) = 4
[program] 3 + 2 + 1 ^ 3
216
(3 + 2 + 1) ^ 3 = 216
[program] -5^2
25
(-5) ^ 2 = 25
[program] 32 / 8 * 3 - 1
2
32 / (8 * (3 - 1)) = 32/16 = 2
1 - 3 + 4 = 1 - 7
? Справа налево это можно предположить, но это добавляет сложение к вычитанию, в отличие от PSADME, нет?P(SA)(DM)E
.Ответы:
Haskell, 134 байта
Переопределение математических операторов с новыми фиксированными значениями и приоритетами. Сейчас:
источник
perl -e'$_="import qualified Prelude as Pl 6^r 8+r 8-r 7*r 7/";s/(. \d(.))/\ninfix\1\n(\2)=(P.\2)/g;s~\./~.div~;print'>a.hs;ghci a.hs
К сожалению, из-за опечатки в сгенерированном коде не было пробела между цифрой и символом, но все равно он работал нормально. Это означает, что ваш код может потерять 5 байтов и превосходит мое «улучшение».sed
для генерации и оценки кода оболочки. Вероятно, хороший мета вопрос.GNU sed -r с расширением exec, 398
Не особенно коротко, но выполняет свою работу.
Sed подходит для анализа приоритета, но не выполняет арифметику. Поэтому мы используем расширение GNU sed exec для
s
команды, чтобы передать необходимую арифметику оболочке.На данный момент предполагаются все операторы, за исключением
^
имеют ровно один пробел впереди и сзади.Тестовый вывод:
источник
JavaScript (ES6) 287
300редактироватьИсправлена ошибка (только опечатка, 6 должно было быть 4) - Добавлено полное объяснение в конце фрагмента
Редактировать 2 Обнаружено некоторое улучшение работы над другой проблемой
Еще одно портирование того же парсера с минимальной разницей. (сравните с этим )
источник