Quylthulg es un lenguaje de Chris Pressey que intenta resolver el problema de la notación infija usando lo que llama panfix :
Al igual que Postfix, Panfix no requiere el despliegue de artilugios arcanos como paréntesis para anular una precedencia de operador predeterminada. Al mismo tiempo, panfix permite que los términos se especifiquen en el mismo orden y forma que infix, una notación indudablemente natural e intuitiva para aquellos que se han acostumbrado a ello.
¿Cómo se obtiene la conveniencia de la notación de infijo junto con la inequívoca de prefijo o postfix? ¡Usa los tres, por supuesto!
=y=+*3*x*+1+=
Más formalmente, seamos +
un operador, a
y b
seamos expresiones. Entonces (a+b)
es una expresión infija válida (entre paréntesis), la representación panfix de esa expresión es +a+b+
, donde la yuxtaposición representa la concatenación.
Su objetivo es tomar una cadena de panfix y convertirla en un infijo completamente entre paréntesis:
(y=((3*x)+1))
Para simplificar, haremos los siguientes cambios:
- Los operadores solo pueden constar de dos caracteres únicos (puede elegir cualquiera, pero aquí usaré
*
y+
). - Solo hay un literal, que consiste en otro carácter distinto (puede elegir cualquiera, pero aquí lo usaré
_
). - La entrada será una expresión panfix bien formada.
Por complejidad , haremos el siguiente cambio:
- Los operadores pueden constar de cualquier número positivo de caracteres, no solo uno.
Esto hace que el desafío sea más complicado porque no se puede determinar necesariamente cómo se divide una subcadena determinada de caracteres del operador sin mirar el resto de la cadena.
Aquí hay una implementación de referencia para el desafío, cortesía de @ user202729.
Casos de prueba
format: input -> output
+*+_*+_*+++_+*+_*+_*+++ -> ((_*+_)+(_+(_*+_)))
**++*+***++_+_++_+*++*+***_*++*+*****_**_*_*** -> ((((_+_)+_)*++*+***_)*(_*(_*_)))
***_**_***_* -> ((_**_)*_)
+_+_+ -> (_+_)
*+*+++**+***+++++_*+*+++**+***+++++_*+*+++**+***+++++ -> (_*+*+++**+***+++++_)
*++++*+*_*_*+*+++****+_++****+_++****++*+*+++_*+++ -> (((_*_)+*+(_++****+_))*+++_)
+**+_*+_*+*_*+*_*+*_+*_+**+ -> (((_*+_)*_)+(_*(_+*_)))
+**+++++_+++++_+++++*_*+*+_++++++_+++++_+++++++* -> (((_+++++_)*_)+*(_+(_+++++_)))
+*+*+_+*+_+*+*_*+*_*+*+_+*+_+*+*+ -> (((_+*+_)*_)+(_*(_+*+_)))
**_**_**_*_****_* -> ((_*(_*(_*_)))*_)
Utilicé este programa para generar cadenas de infijo para este desafío (la conversión a panfix fue trivial, pero la inversión no lo es).
**_**_**_*_****_*
. Todas las respuestas que he probado han fallado en esta.
(_ + _)
?