Скажи, у меня есть выражение:
9 * 8 + 1 - 4
Это выражение может интерпретироваться шестью различными способами, в зависимости от приоритета оператора:
(((9 * 8) + 1) - 4) = 69 (* + -)
((9 * 8) + (1 - 4)) = 69 (* - +)
((9 * (8 + 1)) - 4) = 77 (+ * -)
(9 * ((8 + 1) - 4)) = 45 (+ - *)
((9 * 8) + (1 - 4)) = 69 (- * +)
(9 * (8 + (1 - 4))) = 45 (- + *)
Скажем, я разработчик, и мне не хочется запоминать таблицы приоритетов и т. Д., Поэтому я просто угадаю.
В этом случае наибольшая погрешность будет 45-77, что составляет разницу в 32. Это означает, что мое предположение будет отклонено максимум на 32.
Соревнование
Принимая во внимание выражение , состоящее из чисел и +
, -
, *
, /
(целочисленное деление) и %
, выходной абсолютная разность наибольшего и наименьшего возможного значения для этого выражения, на основе приоритета операторов.
Характеристики
- Входное выражение не будет содержать скобок, и каждый оператор является левоассоциативным.
- Входное выражение будет содержать только неотрицательные целые числа. Однако подвыражения могут быть оценены как отрицательные (например
1 - 4
). - Вы можете взять выражение в любом разумном формате. Например:
"9 * 8 + 1 - 4"
"9*8+1-4"
[9, "*", 8, "+", 1, "-", 4]
[9, 8, 1, 4], ["*", "+", "-"]
- Вход будет содержать не менее 1 и не более 10 операторов.
- Любое выражение, которое содержит деление или по модулю на 0, должно игнорироваться.
- Вы можете предположить, что по модулю не будут даны отрицательные операнды.
Тестовые случаи
9 * 8 + 1 - 4 32
1 + 3 * 4 3
1 + 1 0
8 - 6 + 1 * 0 8
60 / 8 % 8 * 6 % 4 * 5 63
code-golf
number
arithmetic
expression-building
Esolanging Fruit
источник
источник
%
два разных приоритета во втором примере.%
работает оператор на отрицательных числах? Путь как C или Python или что-то еще?Ответы:
Python 2 ,
171156 байтПопробуйте онлайн!
Как это устроено
Мы окружаем каждый оператор разным количеством пар скобок, обращенных наружу, для имитации различных приоритетов (всеми возможными способами), и оборачиваем достаточно пар скобок, обращенных внутрь, вокруг всей строки, чтобы получить выражение, которое мы можем
eval
. Например, с+
↦)+(
*
↦))*((
-
↦)))-(((
мы получили
9 * 8 + 1 - 4
↦(((9 ))*(( 8 )+( 1 )))-((( 4)))
=77
.источник
or
внешнюю часть,sum
чтобы удалить слой квадратных скобок:sum([...],[])or[eval(a)]
вместоsum([...]or[[eval(a)]],[])
sum
может быть пустым, а его аргумент не пуст - однако, на самом деле это нормально, потому чтоeval
в этом случае должно произойти сбой. Благодарю.Желе , 126 байт
"Приоритет оператора? Скобки? Тьфу, кому это нужно?" - проблемы использования Jelly для задачи приоритета оператора.
Попробуйте онлайн!
Ввод принимается в виде строки, например, «1 + 2_3 × 4: 5% 6». Заметьте, что умножение использует «×» вместо «*», деление использует «:» вместо «/», а вычитание использует «_» вместо «-».
Как это работает Программа разделена на три части: генерация всех выражений с различным приоритетом оператора, их оценка и возвращение разницы между максимумом и минимумом.
Все выражения генерируются с кодом:
Ссылки оцениваются с помощью этого (я мог бы улучшить с другой структурой):
Разница между максимумом и минимумом вычисляется с помощью кода в ссылке (5):
источник
Python 2 ,
235234233226 байт-1 байт (и исправление) благодаря Anders Kaseorg !
-7 байт благодаря Step Hen !
Попробуйте онлайн!
источник
a
кортеж вместо списка, и даже сохраните 1 байт, выполнив это (a=()
,a+=eval(*l),
).Haskell 582 байта
Это пошло не так хорошо, как я надеялся ...
Попробуйте онлайн!
Попытка сыграть в гольф на длинной программе просто заставляет меня писать плохой код :(
Я пытался использовать алгоритм Андерса в Haskell, но он вышел из-под контроля
Функция e подобна частному случаю eval. (#) берет список строк, представляющих целые числа и строку операторов, и возвращает разницу между максимальным и минимальным возможными значениями. например
источник
#
в##
, вы можете переименоватьe
в(#)
, например , так:(n#s)(x:a)=...
r=read;j=zipWith;o=map
а затем заменить эти функции с псевдонимами букв.Pyth, 45 байт
Я уверен, что можно сделать гораздо больше оптимизаций, но пока мне это нравится.
Принимает входной сигнал , как это:
[9, 8, 1, 4], ["*", "+", "-"]
.Попробуйте онлайн!
источник
Mathematica,
186164159 байт\[Function]
занимает 3 байта.Некоторые альтернативы (остается неизменным)
#2-#&@MinMax[...]
заменитьMax@#-Min@#&[...]
Head@#2
заменить#2[[0]]
Попробуйте онлайн на http://sandbox.open.wolframcloud.com : введите
( .... )[{60, "/", 8, "%", 8, "*", 6, "%", 4, "*", 5}]
с....
заменой кода выше для тестового примера60 / 8 % 8 * 6 % 4 * 5
. Нажмите,Shift + enter
чтобы оценить.источник
Javascript, 280 байт
Примечание . Целочисленное деление округляется с использованием функции floor, что означает, что отрицательные числа округляются от нуля.
Это решение основано на этом ответе .
Пример кода:
источник
a/b|0
останавливает проверку ошибок «делить / по модулю 0», ноMath.floor(a/b)
сработалоHaskell , 254 байта
Попробуйте онлайн!
Ввод представляет собой целую строку, например 4 + 5 * 2. Он генерирует все перестановки операций и для каждой перестановки рекурсивно разбивает строку. Фильтрует деления на 0 с помощью монады списка.
источник
(%)
является оператором модуля. Это остаток от операции деления между левым аргументом и правым аргументом.Python 2 ,
262,256,254 байтаПопробуйте онлайн!
источник
in [
вin[
(пространство не требуется)PHP , 316 байт
Попробуйте онлайн!
источник
Python 3 , 284 байта
Изменить: кажется, что-то не так с оценкой последнего примера. Я посмотрю на это завтра.
Еще один ответ Python. Не мог обойти всех остальных, но я потратил слишком много времени на это, чтобы не терпеть.
Попробуйте онлайн!
источник
while(p)
может статьwhile p
на один байт сохраненным.Clojure (+ комбинаторика),
342377 + 41 = 418 байт+35 байт из-за ошибки.
Попробуйте онлайн!
Для работы этой функции, вы должны
use
вclojure.math.combinatorics
библиотеке (41 байт):Нюансы:
Эта функция является анонимной, что означает, что вы должны сделать это, чтобы использовать ее:
Кроме того, я использую слово
quot
вместо/
(поскольку Clojure делает дробное деление по умолчанию) иmod
вместо%
.Нежелтая программа:
источник
use
заявлениеThe characters used to import the library will likely be counted
codegolf.meta.stackexchange.com/questions/10225/…require
должны быть включены в код и его длина должна быть добавлена к числу байтов.JavaScript (ES6), 210 байт
Ввод как массив чисел и операторов
Меньше гольфа
Контрольная работа
источник