Hier ist eine sehr einfache Sprachdefinition:
A Variable is any string that does not contain ^, <, >, !, or ?
The empty string is a valid variable identifier
The value of every variable starts at 0.
A Statement is one of (var is a Variable, P is a Program):
var^ -> changes var to be equal to 1 more than itself
var<P> -> while var > 0, changes var to be equal to 1 less than itself, then runs P
var! -> output value of var
var? -> ask for non-negative integer as input, increase var by that value
A Program is a concatenation of Statements, running a Program means running each Statement in order
Beispielprogramme (Beachten Sie, dass der leere String eine Variable ist, ich ihn jedoch aus Gründen der Übersichtlichkeit sparsam verwenden werde und einige Variablen im Programm auf Null gesetzt werden, wenn sie normalerweise standardmäßig 0 sind):
<>: sets the value of the empty string variable to 0
b<>b?b<a^>: asks for b, then adds the value stored in b to a, zeroing b in the process
b<>b?a<>b<a^>: asks for b, then sets a to the value of b, zeroing b in the process
a<>c<>b<a^c^>c<b^> : copies the value in b into a without zeroing it
b<>c<>a<c^c^c<b^>>b! : outputs a multiplied by 2
b^b<a<>a?a!b^> : outputs what you input, forever
Ihr Ziel ist es, den kleinsten Dolmetscher für diese Sprache zu schreiben.
Der Wert einer Variablen kann beliebig groß sein und sollte theoretisch nur durch den Gesamtspeicher begrenzt werden, auf den Ihre Sprache Zugriff hat. Sie müssen jedoch nur Werte bis zu 2 ^ 256 verarbeiten.
Ihr Programm sollte theoretisch in der Lage sein, beliebig lange Programme zu verarbeiten, Sie müssen jedoch nur Programme mit einer Länge von weniger als 2 ^ 32 Zeichen bearbeiten. Sie müssen auch verschachtelte Schleifen mit einer Tiefe von bis zu 2 ^ 32 verarbeiten.
Sie können davon ausgehen, dass es sich bei dem Programm um ein gültiges Programm handelt und dass Sie nur dann nicht negative Ganzzahlen erhalten, wenn Sie nach Eingaben fragen. Sie können auch davon ausgehen, dass nur ASCII-druckbare Zeichen in der Eingabezeichenfolge enthalten sind.
Die Geschwindigkeit des Programms, das Sie interpretieren, spielt keine Rolle, sie wird bereits bei einfachen Dingen wie der 5-stelligen Multiplikation ohne Optimierung schmerzhaft langsam sein.
Wenn Sie eine Sprache verwenden möchten, die keine Eingaben oder Ausgaben in der von der Sprache beschriebenen Weise akzeptiert, verwenden Sie eine Interpretation, die Sie ermöglichen möchten. Dies gilt aus irgendeinem Grund, aus dem Ihre Sprache ein erforderliches Verhalten nicht implementieren kann. Ich möchte, dass alle Sprachen miteinander konkurrieren können.
Kürzeste Sendung gewinnt. Es gelten Standardlücken.
quelle
Antworten:
Rubin, 182 Bytes
Versuchen Sie es wie folgt:
Wie es funktioniert
Die
r
Funktion tokenisiert eine Eingabezeichenfolge und führt jedes Token aus:Wir suchen nach
$2
passenden Variablennamen[^!?^<>]*
, gefolgt von beiden<...>
wo...
kein oder mehr Programme (\g
ist Rekursion), wobei in diesem Fall$4
ist nichtnil
!
,?
oder^
Zeichen, erfaßt durch$3
, wobei in diesem Fall$4
istnil
.Dann ist die Logik zum Ausführen eines Tokens recht einfach, wenn Sie es ein wenig einrücken:
quelle
JavaScript (ES6) 184
194 209Edit Simplified (Verwendung von Funktionsparametern für Ein- und Ausgabe schien eine gute Idee zu sein, war es aber nicht), 1 weiteres Byte gespeichert dank @ thПӍѲꝆΛҐӍΛ
Bearbeiten 2 Geändertes Parsen. Die Logik für Inkrement / Eingabe ist aus der Antwort von @ Lynn entlehnt
Weniger golfen
TEST Das Snippet beginnt mit der Auswertung von 2016 mit dem von @Neil veröffentlichten Programm. Sei geduldig...
quelle
eval
das Vermeiden mitreturn
keine Option?Perl, 251 Bytes
Leichter zu lesende Version:
Dies verschwendet eine Menge Bytes, um Schleifen als direkte Sprünge zu reparieren, aber das Zurücksuchen nach dem Schleifenstart hat meinen Sinn für Ästhetik verletzt.
quelle
Standard C ++, 400 Bytes
Dies kompiliert mit
g++ -g test.cpp -Wall -Wextra -pedantic -std=gnu++11
Ich könnte es vielleicht noch etwas kürzen. Wenn Sie einige Vorschläge haben, kommentieren Sie bitte.
quelle