Фон
Вас недавно наняла небольшая бухгалтерская фирма. Мир бухгалтерского учета несколько чужд для вас, поэтому вы не уверены, что следуете всем профессиональным правилам. В частности, вы не знаете, когда вам следует округлять все эти числа и в каком направлении, поэтому большую часть времени вы просто набираете его и надеетесь на лучшее.
вход
Ваш ввод представляет собой одну строку, которая представляет простой расчет. Он содержит некоторое количество неотрицательных целых чисел, разделенных символами +-*/
. Строка читается слева направо, и нормальные правила приоритета игнорируются, поэтому "23+1*3/4"
означает «начать с 23, добавить 1, умножить на 3 и разделить на 4», в результате получится 18. Ввод не будет содержать чисел, начинающихся с 0
(кроме 0
себя), ни деление на ноль.
Выход
На каждом этапе вычислений вы можете либо округлить результат вверх или вниз до ближайшего целого числа, либо оставить его как есть. Наконец, вы округляете вверх или вниз, чтобы получить целочисленный результат. Ваш вывод - это список целых чисел, которые могут возникнуть в результате такого расчета, отсортированный и без дубликатов.
правила
Вы можете написать либо полную программу, либо функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Тестовые случаи
"42" -> [42]
"2+0+4-0" -> [6]
"23+1*3/4" -> [18]
"5/2" -> [2,3]
"5/2+7/3*6-1" -> [17,18,19,23]
"23/2/2*30-170/3" -> [-7,-6,-2,-1,0,1,3,4]
"1/3*2*2*2*2*2*2" -> [0,16,20,21,22,24,32,64]
"1/3*9" -> [0,3,9]
1/3*9
, который может не сработать, если вы используете числа с плавающей запятой.Ответы:
J, 84 байта
Начиная со списка из 1 элемента, функция сохраняет все возможные промежуточные числа в списке путем выравнивания следующего выражения и добавления округленных копий вверх и вниз.
Будет ли гольф дальше и добавим объяснения завтра.Не могу найти очевидных способов играть в гольф больше.Проходит все тесты.
Использование:
Попробуй это здесь.
источник
x
в конце списка.Python 2, 220 символов
Он хранит список всех возможных чисел и на каждом шаге генерирует три числа для каждого числа в списке, даже если есть дубликаты. Таким образом, сложность во время выполнения является экспоненциальной. Тем не менее, это работает мгновенно для этих небольших примеров. Dupes удаляются в конце.
Оно использует
fractions.Fraction
для точного деления, избегая неточностей с плавающей запятой.Добавьте 5 символов (
r=map(X,g)
->r=set(map(X,g))
), чтобы значительно повысить производительность.источник
\D
предопределенный класс символов для сопоставления с нецифровымиr"(\D)"
или"(\\D)"
. Кроме того, если вы используете Python 3, вы можете заменить индексирование наF
присвоение со звездочкой, например:,A,B,*F=F
использоватьA
иB
вместоF[0]
иF[1]
, и избавиться отF=F[2:]
."\D"
все равно работает и короче. Это недопустимая escape-последовательность, поэтому Python просто включает\
иD
дословно. Хороший совет Python3, на самом деле, я проверю его, хотя мне придется заменить обратные галочки наrepr()
и превратитьmap
результат в список. Помеченное назначение - это то, что я хотел бы, чтобы Python 2 имел ..Python,
421370354 байтаИзвините, пожалуйста, потерпите меня. Я действительно новичок в python (я просто искал язык, который поддерживает fractiosn) и использовал все несколько хитростей, которые я знал, для сокращения кода, но это все еще чудовище, учитывая, что есть решение на python почти вдвое меньшего размера. Я многому научился и думал, что все равно отправлю это =)
Новая версия благодаря @ kirbyfan64sos и @Zgarb
Старая версия
источник
if
s (d={'+': operator.add, '-': operator.sub, ...}; d[op](a, b)
). Кроме того,[floor(k) for k in n]
могут быть сокращены доmap(floor, n)
, иn.add
звонки могут статьn.extend([floor(f), ceil(f), f])
.F
только один раз, так что вы можете сделатьfrom fractions import*
и сохранить несколько байтов. То же самое сmath
. Уберите места вокруг=
, они не нужны. Кроме того, вы должны назначить входs
вместо жесткого кодирования.s=input()
а неs = "1/3*9"
удаляйте свои комментарии и т. Д.Математика, 134
источник
MATLAB, 283 символа
Ungolfed:
При написании этого я понял, что есть еще более короткий способ сделать это, и я добавлю его, как только закончу писать.
источник
VBA, 347 байт
источник