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
0
oder1
.
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 10
ausgewertet, 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 5
ausgewertet, 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 + 5
und 10 5 +
.
Lassen Sie sich ein schweres Beispiel einen Blick: 10+"
. Der Stapel und die Warteschlange beginnen mit []
und []
. 10
wird 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
quelle
0
und1
?×+"10 10
in 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).Antworten:
JavaScript (ES6),
204203200 BytesGibt eine ganze Zahl zurück.
Zeichen verwendet:
+
: zusätzlich*
: Multiplikation#
: Gleichberechtigungd
: duplizieren-
: negativTestfälle
Code-Snippet anzeigen
Formatiert und kommentiert
quelle
-1+-2
. Gibt 3 statt -3 zurück.-
sofort angewendet werden muss-1
.-
mit dem gehen würde,2
da es nach einem anderen Betreiber kommt. Vielleicht kann @HyperNeutrino klären. Der negative Operator kann in einigen Situationen mehrdeutig sein.JavaScript (ES6),
162152143150 BytesLeicht ungolfed:
Erläuterung
Ich benutze
*
für die Multiplikation undR
für das Duplizieren. Die anderen Operatoren sind die gleichen wie in der Frage.N
wird zum Array der Zahlen (einschließlich der Duplikate).Das
replace
behandelt den Fall, in dem das negative Vorzeichen nach der Zahl steht. Zum Beispiel ändert es sich1-
zu- 1
und-1-
zu- -1
.Innerhalb der
eval
,s.match
schafft die Anordnung von binären Operatoren. Beachten Sie, dass dies immer ein Element weniger als hatN
.Das Ergebnis der Funktion ist
eval
die Abbildung der Zahlen und Operatoren.Hier ist, was
eval
für jeden der Testfälle bearbeitet wird:Der Komma-Operator in einem JavaScript-Ausdruck gibt das Ergebnis seines letzten Ausdrucks zurück, sodass
map
automatisch ein verwendbarer Ausdruck zurückgegeben wird.Das
+
Vorzeichen wird vor demeval
Wechseltrue
zu1
undfalse
nach benötigt0
.Die Verwendung
R
sowohl des Variablen- als auch des Duplikat-Operators vereinfacht diemap
Unterausdrücke des Operators erheblich .Testfälle:
Code-Snippet anzeigen
quelle
replace
Arbeiten wie beabsichtigt sind. Dies kehrt3
für-1+--2
und ich denke,1
wäre korrekt (die1
Änderungen unterschreiben dreimal, bevor es ein zweites Argument für die+
verfügbaren gibt, was dazu führt-1 + 2
).JavaScript,
321311 BytesProbieren Sie es online!
Die fünf Zeichen sind die gleichen wie in der Frage, mit Ausnahme der
*
Multiplikation.Das Skript wird mit RegPack komprimiert . Das ursprüngliche Skript wird
_
nach der Auswertung in der Variablen gespeichert .quelle
-1+-2
. Gibt 3 statt -3 zurück.-3
statt3
?-1 + -2
ist-3
, aber sollte es als--1 + 2
stattdessen analysiert werden?3
. Bevor es2
überhaupt auf den Stack geht, wird der zweite-
ausgewertet, und deshalb haben wir1 2 +
den ja3
. Ah, und wahrscheinlich müssen Sie auch Ihre Antwort bearbeiten.Haskell , 251 Bytes
Probieren Sie es online! Verwendet die folgenden Zeichen:
a
zur Addition,m
zur Multiplikation,q
zur Gleichheit,D
zum Duplizieren undN
zur Negation. (Ich wolltee
Gleichheit verwenden, stieß aber auf das Problem,lex
das2e3
als Zahl analysiert wird .) Beispiel:(#([],[])) "2a3 4m"
Erträge20
.quelle
6502 Maschinencode (C64), 697 Bytes
Online-Demo
Verwendung
sys49152
, geben Sie dann den Ausdruck anyfix ein und drücken Sie die Eingabetaste.*
, alle anderen wie vorgeschlagen.Hier ist der lesbare Assembler-Quellcode im Ca65-Stil .
quelle
VB.NET (.NET 4.5)
615576 Bytes-39 Bytes dank Felix Palmen durch den Wechsel
\r\n
zu\n
Benötigt
Imports System.Collections.Generic
(in Byteanzahl enthalten)Der Einstiegspunkt ist Function
A
, die eine Zeichenfolge als Eingabe annimmt und a zurückgibtStack(Of Long)
.Symbole:
+
*
=
-
d
Überblick:
Funktion
A
nimmt die Eingabe und tokenisiert sie. Es verwendet aLong?
, um eine laufende Summe für mehrstellige Ganzzahlen zu erstellen, dieNothing
erstellen. Dies bedeutet, dass derzeit keine Ganzzahl gelesen wird.Subroutine
E
nimmt den Stapel von ganzen Zahlen und die Warteschlange von Operatoren und wertet die Anyfix-Notation aus. Es ruft sich rekursiv auf, bis keine Aktionen mehr vorhanden sind.Ich deklariere globale Parameter auf einmal, um Bytes sowohl bei der Deklaration als auch bei der Parameterübergabe zu sparen.
Der Rückgabewert von
A
wird festgelegt, indem der übereinstimmenden Variablen ein Wert zugewiesen wirdA
.VB
True
ist äquivalent zu-1
, so dass die Operation das Ergebnis negieren muss, um den korrekten Wert zu erhalten.Probieren Sie es online!
quelle
Imports
, bekomme ich nur576
eine Byteanzahl von - hättest du falsch gezählt?\r\n
stattdessen mit gezählt\n
, also ist das der Punkt , an dem die Diskrepanz besteht.