Quylthulg è un linguaggio di Chris Pressey che tenta di risolvere il problema della notazione infografica usando quello che chiama panfix :
come postfix, panfix non richiede la distribuzione di congegni arcani come le parentesi per sovrascrivere una precedenza di operatore predefinita. Allo stesso tempo, panfix consente di specificare i termini nello stesso ordine e modo di infix, una notazione indiscutibilmente naturale e intuitiva per coloro che si sono abituati.
Come si ottiene la comodità della notazione infix insieme all'ambiguità di prefisso o postfisso? Usa tutti e tre, ovviamente!
=y=+*3*x*+1+=
Più formalmente, +siate un operatore ae bsiate espressioni. Quindi (a+b)è un'espressione infix valida (tra parentesi), la rappresentazione panfix di quell'espressione è +a+b+, dove giustapposizione rappresenta concatenazione.
Il tuo obiettivo è quello di prendere una stringa panfix e convertirla in infix completamente tra parentesi:
(y=((3*x)+1))
Per semplicità, apporteremo le seguenti modifiche:
- Gli operatori possono consistere solo di due caratteri unici (puoi sceglierne uno qualsiasi, ma qui userò
*e+). - C'è solo un letterale, che consiste in un altro personaggio distinto (puoi sceglierne uno qualsiasi, ma qui userò
_). - L'input sarà un'espressione panfix ben formata.
Per complessità , apporteremo la seguente modifica:
- Gli operatori possono essere composti da qualsiasi numero positivo di caratteri, non solo da uno.
Questo rende la sfida più complicata perché non è possibile determinare necessariamente come una determinata sottostringa di caratteri operatore sia partizionata senza guardare il resto della stringa.
Ecco un'implementazione di riferimento per la sfida, per gentile concessione di @ user202729.
Casi test
format: input -> output
+*+_*+_*+++_+*+_*+_*+++ -> ((_*+_)+(_+(_*+_)))
**++*+***++_+_++_+*++*+***_*++*+*****_**_*_*** -> ((((_+_)+_)*++*+***_)*(_*(_*_)))
***_**_***_* -> ((_**_)*_)
+_+_+ -> (_+_)
*+*+++**+***+++++_*+*+++**+***+++++_*+*+++**+***+++++ -> (_*+*+++**+***+++++_)
*++++*+*_*_*+*+++****+_++****+_++****++*+*+++_*+++ -> (((_*_)+*+(_++****+_))*+++_)
+**+_*+_*+*_*+*_*+*_+*_+**+ -> (((_*+_)*_)+(_*(_+*_)))
+**+++++_+++++_+++++*_*+*+_++++++_+++++_+++++++* -> (((_+++++_)*_)+*(_+(_+++++_)))
+*+*+_+*+_+*+*_*+*_*+*+_+*+_+*+*+ -> (((_+*+_)*_)+(_*(_+*+_)))
**_**_**_*_****_* -> ((_*(_*(_*_)))*_)
Ho usato questo programma per generare stringhe infix per questa sfida (la conversione in panfix era banale, ma non lo è l'inversione).
**_**_**_*_****_*. Le risposte che ho testato hanno fallito tutte.
(_ + _)?