Quylthulg est un langage de Chris Pressey qui tente de résoudre le problème de la notation infixe en utilisant ce qu'il appelle panfix :
comme postfix, panfix ne nécessite pas le déploiement de dispositifs arcanes tels que des parenthèses pour remplacer une priorité d'opérateur par défaut. En même temps, panfix permet de spécifier les termes dans le même ordre et la même manière que infix, une notation incontestablement naturelle et intuitive pour ceux qui s'y sont habitués.
Comment obtenez-vous la commodité de la notation infixe avec l’ambiguïté du préfixe ou du suffixe? Utilisez les trois, bien sûr!
=y=+*3*x*+1+=
Plus formellement, +
soit un opérateur, et a
et des b
expressions. Ensuite , (a+b)
est une expression de infix valide (parenthésée), la représentation panfix de cette expression est +a+b+
, où la juxtaposition représente la concaténation.
Votre objectif est de prendre une chaîne panfix et de la convertir en infixe entièrement entre parenthèses:
(y=((3*x)+1))
Par souci de simplicité, nous apporterons les modifications suivantes:
- Les opérateurs ne peuvent être composés que de deux caractères uniques (vous pouvez en choisir un, mais ici je vais utiliser
*
et+
). - Il n'y a qu'un seul littéral, qui consiste en un autre caractère distinct (vous pouvez en choisir un, mais ici je vais l'utiliser
_
). - L'entrée sera une expression panfix bien formée.
Pour la complexité , nous ferons le changement suivant:
- Les opérateurs peuvent être constitués de n'importe quel nombre positif de caractères, pas d'un seul.
Cela rend le défi plus difficile car vous ne pouvez pas nécessairement déterminer comment une sous-chaîne donnée de caractères d'opérateur est partitionnée sans regarder le reste de la chaîne.
Voici une implémentation de référence pour le défi, gracieuseté de @ user202729.
Cas de test
format: input -> output
+*+_*+_*+++_+*+_*+_*+++ -> ((_*+_)+(_+(_*+_)))
**++*+***++_+_++_+*++*+***_*++*+*****_**_*_*** -> ((((_+_)+_)*++*+***_)*(_*(_*_)))
***_**_***_* -> ((_**_)*_)
+_+_+ -> (_+_)
*+*+++**+***+++++_*+*+++**+***+++++_*+*+++**+***+++++ -> (_*+*+++**+***+++++_)
*++++*+*_*_*+*+++****+_++****+_++****++*+*+++_*+++ -> (((_*_)+*+(_++****+_))*+++_)
+**+_*+_*+*_*+*_*+*_+*_+**+ -> (((_*+_)*_)+(_*(_+*_)))
+**+++++_+++++_+++++*_*+*+_++++++_+++++_+++++++* -> (((_+++++_)*_)+*(_+(_+++++_)))
+*+*+_+*+_+*+*_*+*_*+*+_+*+_+*+*+ -> (((_+*+_)*_)+(_*(_+*+_)))
**_**_**_*_****_* -> ((_*(_*(_*_)))*_)
J'ai utilisé ce programme pour générer des chaînes d'infixes pour ce défi (la conversion en panfix était triviale, mais pas l'inversion).
**_**_**_*_****_*
. Les réponses que j'ai testées ont toutes échoué.
(_ + _)
?