Quylthulg é uma linguagem de Chris Pressey que tenta resolver o problema da notação infix usando o que chama de panfix :
como o postfix, o panfix não exige a implantação de artifícios arcanos, como parênteses, para substituir uma precedência padrão do operador. Ao mesmo tempo, o panfix permite que os termos sejam especificados na mesma ordem e maneira que o infixo, uma notação inquestionavelmente natural e intuitiva para aqueles que se acostumaram a ele.
Como você obtém a conveniência da notação infix, juntamente com a ambiguidade de prefixo ou postfix? Use todos os três, é claro!
=y=+*3*x*+1+=
Mais formalmente, vamos +
ser um operador e a
e b
ser expressões. Então (a+b)
é uma expressão de infixo válida (entre parênteses), a representação panfix dessa expressão é +a+b+
, onde a justaposição representa concatenação.
Seu objetivo é pegar uma string panfix e convertê-la em infix totalmente entre parênteses:
(y=((3*x)+1))
Para simplificar, faremos as seguintes alterações:
- Os operadores podem consistir apenas em dois caracteres únicos (você pode escolher qualquer um, mas aqui vou usar
*
e+
). - Existe apenas um literal, que consiste em outro caractere distinto (você pode escolher qualquer, mas aqui vou usar
_
). - A entrada será uma expressão panfix bem formada.
Por complexidade , faremos as seguintes alterações:
- Os operadores podem consistir em qualquer número positivo de caracteres, não apenas um.
Isso torna o desafio mais complicado, porque você não pode determinar necessariamente como uma determinada substring de caracteres do operador é particionada sem observar o restante da string.
Aqui está uma implementação de referência para o desafio, cortesia de @ user202729.
Casos de teste
format: input -> output
+*+_*+_*+++_+*+_*+_*+++ -> ((_*+_)+(_+(_*+_)))
**++*+***++_+_++_+*++*+***_*++*+*****_**_*_*** -> ((((_+_)+_)*++*+***_)*(_*(_*_)))
***_**_***_* -> ((_**_)*_)
+_+_+ -> (_+_)
*+*+++**+***+++++_*+*+++**+***+++++_*+*+++**+***+++++ -> (_*+*+++**+***+++++_)
*++++*+*_*_*+*+++****+_++****+_++****++*+*+++_*+++ -> (((_*_)+*+(_++****+_))*+++_)
+**+_*+_*+*_*+*_*+*_+*_+**+ -> (((_*+_)*_)+(_*(_+*_)))
+**+++++_+++++_+++++*_*+*+_++++++_+++++_+++++++* -> (((_+++++_)*_)+*(_+(_+++++_)))
+*+*+_+*+_+*+*_*+*_*+*+_+*+_+*+*+ -> (((_+*+_)*_)+(_*(_+*+_)))
**_**_**_*_****_* -> ((_*(_*(_*_)))*_)
Eu usei esse programa para gerar strings infix para esse desafio (a conversão para panfix era trivial, mas a reversão não é).
**_**_**_*_****_*
. As respostas que eu testei falharam nesta.
(_ + _)
?