In der Präfixnotation steht der Operator vor den Argumenten, sodass Sie sich vorstellen können, dass der Operator next()rekursiv aufruft . In der Infixnotation bewegt sich der Operator zwischen den Argumenten, sodass Sie es sich einfach als Analysebaum vorstellen können. In der Postfix-Notation folgt der Operator den Argumenten, sodass Sie es sich einfach als stapelbasiert vorstellen können.
In Anyfix-Notation kann der Operator überall hingehen * . Wenn ein Operator angezeigt wird und nicht genügend Argumente vorhanden sind, wartet der Operator, bis genügend Argumente vorhanden sind. Für diese Herausforderung müssen Sie einen sehr einfachen Anyfix-Evaluator implementieren. (Beachten Sie, dass anyfix eine von mir aufgegebene Freizeitsprache ist, mit der Sie hier herumspielen oder hier nachsehen können. )
Sie müssen die folgenden Befehle unterstützen:
(Teil 1)
- Duplikat
- Negativ
(Teil 2)
- Zusatz
- Multiplikation
- Gleichheit: kehrt zurück
0oder1.
Sie können für diese Befehle fünf beliebige Symbole ohne Leerzeichen verwenden. Zu Demonstrationszwecken verwende ich "als Duplikat, ×als Multiplikation und +als Addition.
Für Literale müssen Sie nur nicht negative Ganzzahlen unterstützen, Ihr Interpreter muss jedoch in der Lage sein, alle Ganzzahlen (innerhalb des (angemessenen) Ganzzahlbereichs Ihrer Sprache) zu enthalten.
Lassen Sie uns ein Beispiel nehmen einen Blick: 10+5. Der Speicher sollte sich wie ein Stapel und nicht wie eine Warteschlange verhalten. Zuerst beginnt der Stapel um []und die Liste der in der Warteschlange befindlichen Operatoren beginnt um []. Dann wird das Literal 10ausgewertet, wodurch der Stapel entsteht [10]. Als nächstes wird der Operator +ausgewertet, für den zwei Argumente erforderlich sind. Es gibt jedoch nur ein Argument auf dem Stapel, sodass die Liste der in die Warteschlange gestellten Operatoren wird ['+']. Dann wird das Literal 5ausgewertet, wodurch der Stapel entsteht [10, 5]. Zu diesem Zeitpunkt kann der Operator '+'so ausgewertet werden, dass er den Stapel [15]und die Warteschlange erstellt [].
Das Endergebnis sollte [15]für + 10 5, 10 + 5und 10 5 +.
Lassen Sie sich ein schweres Beispiel einen Blick: 10+". Der Stapel und die Warteschlange beginnen mit []und []. 10wird zuerst ausgewertet, wodurch der Stapel entsteht [10]. Als nächstes +wird ausgewertet, was den Stack nicht ändert (weil es nicht genügend Argumente gibt) und die Queue macht ['+']. Dann "wird ausgewertet. Dies kann sofort so laufen, wie es ist, und macht den Stapel [10, 10]. +Jetzt kann ausgewertet werden, so dass der Stack [20]und die Warteschlange werden []. Das Endergebnis ist [20].
Was ist mit der Reihenfolge der Operationen?
Lassen Sie uns einen Blick darauf werfen ×+"10 10. Der Stapel und die Warteschlange beginnen wie folgt []:
×: Der Stapel ist unverändert und die Warteschlange wird['×'].+: Der Stapel ist unverändert und die Warteschlange wird['×', '+'].": Der Stapel ist unverändert und die Warteschlange wird['×', '+', '"'].10: Der Stapel wird[10]. Auch wenn×der erste Operator, der ausgewertet werden soll, da er zuerst angezeigt wird,"sofort ausgeführt werden kann und keiner der Operatoren zuvor kann, wird er ausgewertet. Der Stapel wird[10, 10]und die Warteschlange['×', '+'].×Jetzt kann ausgewertet werden, was den Stack[100]und die Queue macht['+'].10: Der Stack wird[100, 10], der+ausgewertet werden kann. Der Stapel wird[110]und die Warteschlange[].
Das Endergebnis ist [110].
Die in diesen Demonstrationen verwendeten Befehle stimmen mit denen der anyfix-Sprache überein. Das letzte Beispiel funktioniert jedoch aufgrund eines Fehlers in meinem Interpreter nicht. (Haftungsausschluss: Ihre Beiträge werden nicht im anyfix-Interpreter verwendet.)
Herausforderung
Wählen Sie einen Satz von 5 Nicht-Whitespace-Zeichen und erstellen Sie einen Anyfix-Interpreter gemäß den obigen Spezifikationen. Ihr Programm kann entweder das einzelne Array oder den darin enthaltenen Wert ausgeben. Es wird garantiert, dass der Stapel von Werten am Ende der Ausführung nur einen einzigen Wert enthält und dass die Warteschlange der Operatoren am Ende der Ausführung leer ist.
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes.
Testfälle
Für diese Testfälle ist Duplikat ", Negativ -, Addition +, Multiplikation ×und Gleichheit =.
Input -> Output
1+2×3 -> 9
1"+"+ -> 4
2"××" -> 16
3"×+" -> 18
3"+×" -> 36
123"= -> 1 ("= always gives 1)
1+2=3 -> 1
1"=2+ -> 3
1-2-+ -> -3
-1-2+ -> 3 (hehe, the `-1` becomes `+1` at the `-` rather than making the `2` a `-1`)
+×"10 10 -> 200 (after the 10 is duplicated (duplication is delayed), 10 + 10 is performed and then 20 * 10, giving 200)
Regeln
- Es gelten Standardlücken
- Sie können den offiziellen Anyfix-Dolmetscher nehmen und Golf spielen, wenn Sie möchten. Erwarten Sie, schrecklich zu verlieren.
Die Eingabe wird als Zeichenfolge und die Ausgabe als Array (eine einzelne Ganzzahl) aus der Zeichenfolgendarstellung von beiden angegeben. Sie können davon ausgehen, dass die Eingabe nur Leerzeichen, Ziffern und die von Ihnen gewählten 5 Zeichen enthält.
* nicht wirklich
0und 1?
×+"10 10in die Testfälle oder andere Beispiele einbeziehen, die 1) die Verwendung eines Leerzeichens und 2) die Verwendung des doppelten Operators verzögern (zwei Dinge, die ich völlig übersehen habe).