Я просматривал esolangs и случайно наткнулся на этот язык: https://github.com/catseye/Quylthulg .
Что интересно в этом языке, так это то, что он не использует префикс, постфикс или инфикс, он использует все три из них , называя это обозначением «panfix».
Вот пример. Чтобы представить нормальный инфикс 1+2
в panfix, она становится: +1+2+
. Обратите внимание, как оператор находится до, между и после операндов. Еще один пример (1+2)*3
. Это становится *+1+2+*3*
. Еще раз обратите внимание, как *
во всех трех местах относительно операндов +1+2+
и 3
.
Соревнование
Как вы уже догадались, ваша задача в этом вызове - преобразовать выражение из инфикса в панфикс.
Несколько уточнений:
- Вам нужно только разобраться с четырьмя основными операциями:
+-*/
- Вам не придется иметь дело с унарными версиями, только двоичными
- Вы должны иметь дело с круглыми скобками
- Предположим, нормальные правила предшествования
*/
тогда+-
и оставил ассоциативность для всех из них. - Числа будут неотрицательными целыми числами
- Вы можете опционально иметь пробелы как на входе, так и на выходе.
Тестовые случаи
1+2 -> +1+2+
1+2+3 -> ++1+2++3+
(1+2)*3 -> *+1+2+*3*
10/2*5 -> */10/2/*5*
(5+3)*((9+18)/4-1) -> *+5+3+*-/+9+18+/4/-1-*
Это код-гольф , поэтому выигрывает самый короткий код в байтах !
источник
S.split``
должно быть[...S]
, хотя на самом деле это может помочь на/\d+|./g
начальном этапе и вместо этого работать над этим.Mathematica,
203195 байтовЭто, вероятно, менее чем эффективно, но, кажется, делает работу.
Это анонимная функция, которая принимает фактическое выражение и возвращает строку с обозначением Panfix. Mathematica сортирует приоритет операторов во время разбора, а не во время оценки, поэтому вложение должно быть автоматически корректным. По крайней мере, тестовые случаи работают как положено.
Объяснение: Достаточно просто интерпретировать все выражение как дерево, например так:
На этом этапе операторы (каждый узел, который не является листом) больше не являются операторами, они фактически были преобразованы в такие строки, как
"+"
. Целые числа также приводятся к строкам. Затем правило повторной замены преобразует каждый узел, имеющий ровно два листа, в исправлениеparent-leaf1-parent-leaf2-parent
. После нескольких итераций дерево сводится к одной строке.Основная потеря в количестве байтов заключается в том, что Mathematica интерпретирует
И это происходит также во время разбора.
Гольф немного вниз, так как картина
a_/b_
также интерпретируется какa_ * (b_)^(-1)
. Также некоторые незначительные оптимизации в другом месте.источник
Пролог, 87 байт
Это функция (в основном потому, что написание полной программы имеет ночные кошмарные уровни в Prolog; обычно, даже если вы компилируете программу, она запускает REPL при запуске), вызывается
p
. Он принимает входные данные от стандартного ввода и выводит на стандартный вывод. Обратите внимание, что вам нужно добавить точку к входу, что является печальным следствием того, как работают подпрограммы ввода Пролога (они используют точки во входе почти так же, как другие языки используют переводы строки); это может или не может дисквалифицировать ответ.объяснение
Арифметические операторы в Прологе обычно интерпретируются как конструкторы кортежей . Однако они подчиняются тем же правилам приоритета, что и фактические арифметические операторы, на которых они основаны; Вы можете формировать кортежи с инфиксной нотацией
+
и-
связывать их менее плотно, чем*
и/
, с приоритетом внутри группы слева направо. Это именно то, что вопрос требует; таким образом, мы можем прочитать весь вложенный кортеж из входных данных, и он уже имеет правильную структуру. Вот чтоp
делает.Далее нам нужно преобразовать его в обозначение Panfix.
x
преобразует входные данные в panfixed список конструкторов и целых чисел, и может быть прочитана как английское предложение почти прямо: «x
изT
: еслиT
это кортеж с конструкторомO
и аргументамиA
,B
, тоO
,x
оA
,O
,x
оB
,O
, иначеT
». Наконец, мы просто должны напечатать список без каких-либо разделителей (т.е. использоватьmaplist
для вызоваwrite
каждого элемента списка).Я использовал SWI-Prolog для тестирования этого, потому что моей версии GNU Prolog еще
maplist
нет (по-видимому, она была добавлена в более новую версию), но она должна быть достаточно переносимой между реализациями Prolog.источник