Ось дуже просте визначення мови:
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.
Швидкість програми, яку ви інтерпретуєте, не має значення, вона вже буде болісно повільною для речей, простих як 5-розрядне множення, без оптимізації.
Якщо ви хочете використовувати мову, яка не може розумно прийняти введення або вивести результат таким чином, як описаний цією мовою, використовуйте будь-яку інтерпретацію, яку ви хочете зробити можливою. Це стосується будь-якої причини, коли ваша мова не може реалізувати потрібну поведінку. Я хочу, щоб усі мови могли змагатися.
Найкоротша програма виграє. Застосовуються стандартні лазівки.