Quylthulg - это язык Криса Пресси, который пытается решить проблему инфиксной нотации, используя то, что он называет panfix :
подобно postfix, panfix не требует развертывания тайных изобретений, таких как скобки, чтобы переопределить приоритет оператора по умолчанию. В то же время panfix позволяет указывать термины в том же порядке и порядке, что и infix, что, несомненно, является естественным и интуитивно понятным обозначением для тех, кто привык к нему.
Как вы получаете удобство инфиксной нотации наряду с однозначностью префикса или постфикса? Используйте все три, конечно!
=y=+*3*x*+1+=
Более формально, пусть +
будет оператором и a
и b
будет выражением. потом(a+b)
допустимое (заключенное в скобки) инфиксное выражение, панффиксное представление этого выражения +a+b+
, где сопоставление представляет конкатенацию.
Ваша цель - взять строку Panfix и преобразовать ее в полностью заключенный в скобки инфикс:
(y=((3*x)+1))
Для простоты мы внесем следующие изменения:
- Операторы могут состоять только из двух уникальных символов (вы можете выбрать любой, но здесь я буду использовать
*
и+
). - Существует только один литерал, который состоит из другого отдельного символа (вы можете выбрать любой, но здесь я буду использовать
_
). - На входе будет правильно сформированное выражение panfix.
Для сложности сделаем следующее изменение:
- Операторы могут состоять из любого положительного числа символов, а не только одного.
Это усложняет задачу, поскольку вы не можете точно определить, как данная подстрока символов оператора разделена, не глядя на остальную часть строки.
Вот эталонная реализация для вызова, любезно предоставленная @ user202729.
Тестовые случаи
format: input -> output
+*+_*+_*+++_+*+_*+_*+++ -> ((_*+_)+(_+(_*+_)))
**++*+***++_+_++_+*++*+***_*++*+*****_**_*_*** -> ((((_+_)+_)*++*+***_)*(_*(_*_)))
***_**_***_* -> ((_**_)*_)
+_+_+ -> (_+_)
*+*+++**+***+++++_*+*+++**+***+++++_*+*+++**+***+++++ -> (_*+*+++**+***+++++_)
*++++*+*_*_*+*+++****+_++****+_++****++*+*+++_*+++ -> (((_*_)+*+(_++****+_))*+++_)
+**+_*+_*+*_*+*_*+*_+*_+**+ -> (((_*+_)*_)+(_*(_+*_)))
+**+++++_+++++_+++++*_*+*+_++++++_+++++_+++++++* -> (((_+++++_)*_)+*(_+(_+++++_)))
+*+*+_+*+_+*+*_*+*_*+*+_+*+_+*+*+ -> (((_+*+_)*_)+(_*(_+*+_)))
**_**_**_*_****_* -> ((_*(_*(_*_)))*_)
Я использовал эту программу для генерации инфиксных строк для этой задачи (преобразование в panfix было тривиальным, но обратное - нет).
**_**_**_*_****_*
. Все ответы, которые я проверил, провалились.
(_ + _)
?