Quylthulg ist eine Sprache von Chris Pressey, die versucht, das Problem der Infix-Notation mit dem zu lösen, was sie panfix nennt :
Ähnlich wie bei Postfix erfordert Panfix nicht die Bereitstellung geheimer Funktionen wie Klammern, um die Standardpriorität eines Operators zu überschreiben. Gleichzeitig ermöglicht panfix die Angabe von Begriffen in der gleichen Reihenfolge und Weise wie bei infix, was für diejenigen, die sich daran gewöhnt haben, eine zweifellos natürliche und intuitive Notation ist.
Wie erhalten Sie die Bequemlichkeit der Infixnotation zusammen mit der Eindeutigkeit von Präfix oder Postfix? Verwenden Sie natürlich alle drei!
=y=+*3*x*+1+=
Seien Sie formal gesehen +
ein Operator a
und b
Ausdrücke. (a+b)
Ist dann ein gültiger (in Klammern stehender) Infix-Ausdruck, ist die panfix-Darstellung dieses Ausdrucks +a+b+
, wobei Nebeneinanderstellung Verkettung darstellt.
Ihr Ziel ist es, einen Panfix-String zu nehmen und in ein Infix in Klammern umzuwandeln:
(y=((3*x)+1))
Der Einfachheit halber nehmen wir die folgenden Änderungen vor:
- Operatoren können nur aus zwei eindeutigen Zeichen bestehen (Sie können ein beliebiges Zeichen auswählen, aber hier verwende ich
*
und+
). - Es gibt nur ein Literal, das aus einem anderen eindeutigen Zeichen besteht (Sie können ein beliebiges auswählen, aber hier werde ich es verwenden
_
). - Die Eingabe ist ein wohlgeformter Panfix-Ausdruck.
Aus Gründen der Komplexität nehmen wir die folgenden Änderungen vor:
- Operatoren können aus einer beliebigen positiven Anzahl von Zeichen bestehen, nicht nur aus einem.
Dies macht die Herausforderung schwieriger, da Sie nicht unbedingt bestimmen können, wie eine bestimmte Teilzeichenfolge von Operatorzeichen partitioniert ist, ohne den Rest der Zeichenfolge zu betrachten.
Hier ist eine Referenzimplementierung für die Herausforderung mit freundlicher Genehmigung von @ user202729.
Testfälle
format: input -> output
+*+_*+_*+++_+*+_*+_*+++ -> ((_*+_)+(_+(_*+_)))
**++*+***++_+_++_+*++*+***_*++*+*****_**_*_*** -> ((((_+_)+_)*++*+***_)*(_*(_*_)))
***_**_***_* -> ((_**_)*_)
+_+_+ -> (_+_)
*+*+++**+***+++++_*+*+++**+***+++++_*+*+++**+***+++++ -> (_*+*+++**+***+++++_)
*++++*+*_*_*+*+++****+_++****+_++****++*+*+++_*+++ -> (((_*_)+*+(_++****+_))*+++_)
+**+_*+_*+*_*+*_*+*_+*_+**+ -> (((_*+_)*_)+(_*(_+*_)))
+**+++++_+++++_+++++*_*+*+_++++++_+++++_+++++++* -> (((_+++++_)*_)+*(_+(_+++++_)))
+*+*+_+*+_+*+*_*+*_*+*+_+*+_+*+*+ -> (((_+*+_)*_)+(_*(_+*+_)))
**_**_**_*_****_* -> ((_*(_*(_*_)))*_)
Ich habe dieses Programm verwendet , um Infix-Strings für diese Herausforderung zu generieren (das Konvertieren in Panfix war trivial, das Umkehren jedoch nicht).
**_**_**_*_****_*
. Die Antworten, die ich getestet habe, sind alle fehlgeschlagen.
(_ + _)
.