Оцените данное выражение омнификса.
Omnifix похож на инфиксную нотацию обычной математики, но с дополнительными копиями каждого символа, окружающего аргументы. Внешние символы заменяют скобки, и поэтому нет необходимости в дополнительных скобках.
Вы должны поддерживать сложение, вычитание, умножение, деление и положительные действительные числа (можно записать отрицательные -0-n-
) в разумных пределах для вашего языка.
Плюс и минус должны быть +
и -
, но вы можете использовать *
или ×
для раз и /
или ÷
для деления. Другие разумные символы будут разрешены по запросу.
Брауни указывает на пояснения и дополнительные функции (такие как дополнительные операции, отрицательные числа, строки и т. Д.) Даже если в вашем ответе нет этих функций, не стесняйтесь показать, как это возможно.
Пожалуйста, предоставьте ссылку, чтобы проверить ваше решение, если это возможно.
Примеры
Для ясности нижеприведенные пояснения используют высокий минус ( ¯
) для обозначения отрицательных чисел. Вы можете вернуть отрицательные числа, используя любой разумный формат.
-5-2-
→ 3
+2+×3×2×+
→ 8
( +2+×3×2×+
→ +2+6+
→ 8
)
-14--3-1--
→ 12
( -4--3-1--
→ -14-2-
→ 12
)
+2.1+×3.5×2.2×+
→ 9.8
( +2.1+×3.5×2.2×+
→ +2.1+7.7+
→ 9.8
)
×3×÷-0-6-÷2÷×
→ -9
( ×3×÷-0-6-÷2÷×
→ ×3×÷¯6÷2÷×
→ ×3ׯ3×
→ ¯9
)
÷4÷-3-÷1÷2÷-÷
→ 1.6
( ÷4÷-3-÷1÷2÷-÷
→ ÷4÷-3-0.5-÷
→ ÷4÷2.5÷
→ 1.6
)
The explanations below use high minus (`¯`) to indicate negative numbers.
Вы определенно любите APL.-
s можно спутать с-
s, а¯
s нельзя спутать с-
s.Ответы:
C # (.NET Core) ,
198 197188 байтПопробуйте онлайн!
Использует
*
и/
.Рекурсивная функция. Сначала он пытается проанализировать входную строку как
float
. Если происходит сбой, он вызывает себя рекурсивно, передавая в качестве аргументов первый и второй операнды, а затем выполняет выбранную операцию с результатами.источник
IndefOf(f, 1)
может бытьIndexOf(f,1)
float
s вместо этого, используйте коды полукокса, когда вы их , вероятно , может сократить их>
и<
в нескольких местах.i+1,s.Length-i-2
на++i,s.Length+~i
.Python 3,
159158152144136135132 байтаПопробуйте онлайн!
Не допускает отрицательных чисел (хотя
-0-5-
работает, конечно) и требует операторов Python.источник
while~-(l[i]in'+-*/'):i+=1;a=1
и*l,=input()
для 152 байтовif a:l[i]='(';i=t(t(i+1));l[i-1]=')'
сreturn-~i
135 байтами: PСетчатка ,
290287286 байтПопробуйте онлайн! Примечание: допускается только целочисленная арифметика, поэтому некоторые тестовые примеры были удалены. Принимает и возвращает отрицательные числа, используя
¯
префикс. Изменить: Сохранено34 байта благодаря @ Cowsquack. Объяснение:Мне нужен был способ обработки нуля, поэтому я использую
¦
префикс положительного числа. Числа затем конвертируются в одинарные.Но отрицательным числам нужен только
¯
префикс.Цитирование
+
s становится уродливым, поэтому я превращаю дополнения в вычитания.Если абсолютное значение LHS вычитания меньше, чем RHS, поменяйте их и отрицайте обе стороны.
Также, если LHS умножения или деления отрицателен, отрицайте обе стороны.
Также, если LHS умножения равно нулю, то результат равен нулю. Также два минуса составляют плюс.
Но минус и плюс (или наоборот) составляют минус.
Вычтите два числа одного знака. Повторяйте это до тех пор, пока не останется таких вычитаний.
Если все еще есть вычитание, знаки должны отличаться, так что сложите числа вместе. (Но делайте это только один раз, так как это может снова выявить вычитание двух чисел одного знака.)
Выполните умножение путем повторного сложения.
Выполните целочисленное деление. Один из вышеперечисленных шагов упростит выражение, поэтому выполняйте цикл до тех пор, пока не останется никаких операций.
Конвертировать обратно в десятичную.
источник
+`-(([¯¦])1*)(1*)-\2\3-
,[¯¦]
может стать¯|¦
([×÷])
;)PHP ,
116114109 байт-5 спасибо Мартину Эндеру
Используется
*
для умножения и/
деления. Отрицательные числа работают, несмотря на то, что я не предпринимал никаких конкретных попыток, чтобы это имело место.Попробуйте онлайн!
Неуправляемый и объясненный
Я также объясню регулярное выражение, потому что это немного волшебно:
Сначала мы хотим сопоставить любой из четырех операторов:
*+/-
Затем нам нужно сопоставить число
[\d.]+
или другое допустимое выражение омнификса(?R)
.Затем мы сопоставляем тот же оператор, который был в начале.
Затем мы делаем то же самое, что и в группе 3: сопоставляем число или выражение омнификса.
Наконец, снова сопоставьте начальный оператор.
Все, что соответствует этому, заменяется
($2)
. Это берет часть внутри окружающих операторов и помещает ее в скобки, так что это выглядит как обычная инфиксная запись.источник
QuadR ,
333227 байт-1 спасибо Корове Кря . -5 спасибо Эрику Аутгольферу .
с аргументом / флагом
≡
Попробуйте онлайн!
Это эквивалентно 40-байтовому решению Dyalog APL:
Попробуйте онлайн!
объяснение
(текст в скобках относится к Dyalog APL вместо QuadR)
(
...){2}\2
следующий рисунок дважды, и весь матч в два раза тоже:(.)
любой символ[
...]+
следует один или более из следующего набора символов:\d
д igits,¯
большой минус (отрицательный знак)\.
период(
⎕R
В R eplaced с :)(
{
…}
Результат применения следующей анонимной функции к пространству имен ⍵ :)⍵M
(⍵.Match
) текст M atch¯1↓
отбрасывает последний символ (символ+
-
×
или÷
)1↓
отбрасывает первый символ (символ),⍎
выполняемый как код APL(
⍕
stringify)≡
(⍣≡
) повторяйте замену до тех пор, пока больше не произойдет никаких измененийисточник
⍕
⎕R
не может работать с числовыми данными. Благодарю.Haskell , 132 символа
(134 байта, потому что
×
и÷
взять два байта в UTF-8)Попробуйте онлайн!
f
анализирует как можно большую часть входных данных и выдает результат, а также оставшуюся строку (которая пуста в тестовых примерах). Если это не соответствует правилам, удалите непарсируемую строку остатка с помощьюHaskell , 139 символов
источник
Perl,
6453 байтаВключить
+1
для-p
Случайно также реализует
,
(отбрасывает первый аргумент) и иногда.
(добавляет аргументы вместе)..
не работает очень надежно, хотя, поскольку он мешает десятичной запятой как на уровне анализа, так и на уровне оценкиисточник
Java 8,
205200 байтПорт @Charlie 's C # ответа .
-5 байт благодаря @ceilingcat .
Попробуйте онлайн.
источник