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