Ich habe Esolangs durchsucht und diese Sprache gefunden: https://github.com/catseye/Quylthulg .
Eine interessante Sache an dieser Sprache ist, dass sie kein Präfix, Postfix oder Infix verwendet. Sie verwendet alle drei und nennt es "Panfix" -Notation.
Hier ist ein Beispiel. Zur Darstellung von normaler Infix 1+2
in panfix, wird es: +1+2+
. Beachten Sie, wie sich der Operator vor, zwischen und nach den Operanden befindet. Ein anderes Beispiel ist (1+2)*3
. Das wird *+1+2+*3*
. Beachten Sie noch einmal, wie *
es an allen drei Stellen in Bezug auf die Operanden +1+2+
und ist 3
.
Die Herausforderung
Wie Sie vielleicht erraten haben, besteht Ihre Aufgabe in dieser Herausforderung darin, einen Ausdruck von infix nach panfix zu konvertieren.
Einige Klarstellungen:
- Sie müssen sich nur mit den vier Grundoperationen befassen:
+-*/
- Sie müssen sich nicht mit den unären Versionen davon befassen, sondern nur mit Binärdateien
- Sie müssen mit Klammern umgehen
- Nehmen Sie die normalen Prioritätsregeln von
*/
damals an+-
und lassen Sie für alle Assoziativität übrig. - Die Zahlen sind nichtnegative Ganzzahlen
- Optional können Sie sowohl in der Eingabe als auch in der Ausgabe Leerzeichen einfügen
Testfälle
1+2 -> +1+2+
1+2+3 -> ++1+2++3+
(1+2)*3 -> *+1+2+*3*
10/2*5 -> */10/2/*5*
(5+3)*((9+18)/4-1) -> *+5+3+*-/+9+18+/4/-1-*
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes !
quelle
S.split``
sollte es sein[...S]
, obwohl es tatsächlich hilfreich sein kann, im Voraus zu passen/\d+|./g
und stattdessen daran zu arbeiten.Mathematica,
203195 BytesDies ist wahrscheinlich weniger effizient, scheint aber den Job zu erledigen.
Dies ist eine anonyme Funktion, die einen tatsächlichen Ausdruck verwendet und eine Zeichenfolge mit Panfix-Notation zurückgibt. Mathematica sortiert die Priorität der Operatoren zum Zeitpunkt der Analyse und nicht zum Zeitpunkt der Auswertung, sodass die Verschachtelung automatisch korrekt sein sollte. Zumindest die Testfälle funktionieren wie erwartet.
Erklärung: Es ist einfach genug, den gesamten Ausdruck als Baum zu interpretieren:
Zu diesem Zeitpunkt sind die Operatoren (jeder Knoten, der kein Blatt ist) keine Operatoren mehr, sondern wurden in Zeichenfolgen wie konvertiert
"+"
. Die ganzen Zahlen werden auch in Strings umgewandelt. Dann konvertiert eine wiederholte Ersetzungsregel jeden Knoten, der genau zwei Blätter hat, in den Panfixparent-leaf1-parent-leaf2-parent
. Nach einigen Iterationen wird der Baum auf eine einzelne Zeichenfolge reduziert.Der Hauptverlust bei der Byteanzahl ist, dass Mathematica interpretiert
Und das passiert auch beim Parsen.
Golfed down ein bisschen, da das Muster
a_/b_
auch als interpretiert wirda_ * (b_)^(-1)
. Auch einige kleinere Optimierungen an anderer Stelle.quelle
Prolog, 87 Bytes
Dies ist eine Funktion (meistens, weil das Schreiben eines vollständigen Programms in Prolog ein alptraumhaftes Level an Boilerplate hat; normalerweise wird, selbst wenn Sie ein Programm kompilieren , beim Ausführen eine REPL erzeugt), die aufgerufen wird
p
. Es nimmt Eingaben von stdin und Ausgaben von stdout entgegen. Beachten Sie, dass Sie einen Punkt an die Eingabe anhängen müssen. Dies ist eine unglückliche Folge der Funktionsweise der Prolog-Eingaberoutinen (sie verwenden Punkte in der Eingabe ähnlich wie andere Sprachen Zeilenumbrüche). das könnte oder könnte nicht die Antwort disqualifizieren.Erläuterung
Arithmetische Operatoren werden in Prolog normalerweise als Tupelkonstruktoren interpretiert . Sie befolgen jedoch dieselben Vorrangregeln wie die eigentlichen arithmetischen Operatoren, auf denen sie basieren. Sie können Tupel mit Infixschreibweise und bilden
+
und-
als binden weniger dicht*
und/
mit Vorrang innerhalb einer Gruppe links nach rechts gemacht. Genau das verlangt die Frage; Auf diese Weise können wir ein ganzes verschachteltes Tupel von der Eingabe lesen, und es hat bereits die richtige Struktur. Das ist wasp
tut.Als nächstes müssen wir es in Panfix-Notation konvertieren.
x
wandelt die Eingabe in eine panfixed Liste von Konstrukteuren und ganze Zahlen sind , und können fast direkt als ein englischer Satz lesen: „x
derT
ist: WennT
ein Tupel mit KonstruktorO
und ArgumenteA
,B
und dannO
,x
vonA
,O
,x
derB
,O
, sonstT
“. Schließlich müssen wir nur noch die Liste ohne Trennzeichen drucken (dh jedes Element der Liste mitmaplist
aufrufenwrite
).Ich habe SWI-Prolog verwendet, um dies zu testen, da meine Version von GNU Prolog noch nicht
maplist
vorhanden ist (anscheinend wurde sie einer neueren Version hinzugefügt), sie sollte jedoch im Allgemeinen zwischen Prolog-Implementierungen ziemlich portabel sein.quelle