Вот очень простое определение языка:
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
Примеры программ (обратите внимание, что пустая строка является переменной, но я буду использовать ее экономно для ясности, а некоторые переменные обнуляются в программе, когда они обычно равны 0 по умолчанию):
<>: 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
Ваша цель - написать самого маленького переводчика для этого языка.
Значение переменной может быть произвольно большим и должно быть ограничено только общим объемом памяти, к которому у вашего языка есть доступ, теоретически, но вы должны обрабатывать только значения до 2 ^ 256.
Ваша программа должна быть в состоянии обрабатывать произвольно длинные программы, теоретически, но вам нужно будет работать только с программами длиной до 2 ^ 32 символов. Вы также должны обрабатывать вложенные циклы глубиной до 2 ^ 32.
Вы можете предположить, что эта программа является допустимой, и что вы всегда получите неотрицательные целые числа только тогда, когда попросите ввести. Вы также можете предположить, что во входную строку включены только печатные символы ASCII.
Скорость интерпретируемой вами программы не имеет значения, она уже будет мучительно медленной для таких простых вещей, как пятизначное умножение без оптимизации.
Если вы хотите использовать язык, который не может разумно принимать ввод или производить вывод способом, описанным языком, используйте любую интерпретацию, которую вы хотите сделать возможной. Это относится к любой причине, по которой ваш язык не может реализовать требуемое поведение. Я хочу, чтобы все языки могли конкурировать.
Кратчайшая программа выигрывает. Применяются стандартные лазейки.