Quylthulg to język autorstwa Chrisa Presseya, który próbuje rozwiązać problem notacji infix za pomocą tak zwanej panfix :
podobnie jak postfix, panfix nie wymaga wdrożenia tajemnych elementów, takich jak nawiasy, aby zastąpić domyślny priorytet operatora. Jednocześnie panfix pozwala na określenie terminów w tej samej kolejności i sposobie, co infix, co jest niewątpliwie naturalnym i intuicyjnym zapisem dla tych, którzy się przyzwyczaili.
Jak uzyskać wygodę notowania infix wraz z jednoznacznością przedrostka lub postfiksa? Oczywiście użyj wszystkich trzech!
=y=+*3*x*+1+=
Bardziej formalnie, bądźmy +
operatorem a
i b
wyrażeniami. Następnie (a+b)
jest poprawnym (nawiasowanym) wyrażeniem infiksowym, reprezentacja tego wyrażenia w panoramie to +a+b+
, gdzie zestawienie reprezentuje konkatenację.
Twoim celem jest pobranie ciągu panfix i przekonwertowanie go na w pełni nawiasową infix:
(y=((3*x)+1))
Dla uproszczenia wprowadzimy następujące zmiany:
- Operatory mogą składać się tylko z dwóch unikalnych postaci (możesz wybrać dowolną, ale tutaj użyję
*
i+
). - Jest tylko jeden literał, który składa się z innej wyraźnej postaci (możesz wybrać dowolną, ale tutaj użyję
_
). - Dane wejściowe będą poprawnie sformułowanym wyrażeniem panoramicznym.
Dla złożoności wprowadzimy następującą zmianę:
- Operatory mogą składać się z dowolnej dodatniej liczby znaków, a nie tylko jednej.
To sprawia, że wyzwanie jest trudniejsze, ponieważ niekoniecznie można określić, w jaki sposób dany podciąg znaków operatora jest dzielony na partycje, nie patrząc na resztę ciągu.
Oto referencyjna implementacja wyzwania, dzięki uprzejmości @ user202729.
Przypadki testowe
format: input -> output
+*+_*+_*+++_+*+_*+_*+++ -> ((_*+_)+(_+(_*+_)))
**++*+***++_+_++_+*++*+***_*++*+*****_**_*_*** -> ((((_+_)+_)*++*+***_)*(_*(_*_)))
***_**_***_* -> ((_**_)*_)
+_+_+ -> (_+_)
*+*+++**+***+++++_*+*+++**+***+++++_*+*+++**+***+++++ -> (_*+*+++**+***+++++_)
*++++*+*_*_*+*+++****+_++****+_++****++*+*+++_*+++ -> (((_*_)+*+(_++****+_))*+++_)
+**+_*+_*+*_*+*_*+*_+*_+**+ -> (((_*+_)*_)+(_*(_+*_)))
+**+++++_+++++_+++++*_*+*+_++++++_+++++_+++++++* -> (((_+++++_)*_)+*(_+(_+++++_)))
+*+*+_+*+_+*+*_*+*_*+*+_+*+_+*+*+ -> (((_+*+_)*_)+(_*(_+*+_)))
**_**_**_*_****_* -> ((_*(_*(_*_)))*_)
Użyłem tego programu, aby wygenerować ciągi znaków poprawki dla tego wyzwania (konwersja do panfixu była trywialna, ale cofanie nie jest).
**_**_**_*_****_*
. Wszystkie odpowiedzi, które przetestowałem, zawiodły.
(_ + _)
?