Oto bardzo prosta definicja języka:
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
Przykładowe programy (zwróć uwagę, że pusty ciąg znaków jest zmienną, ale używam go oszczędnie dla zachowania przejrzystości, a niektóre zmienne są zerowane w programie, gdy zwykle mają domyślnie 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
Twoim celem jest napisanie najmniejszego tłumacza dla tego języka.
Wartość zmiennej może być dowolnie duża i powinna być ograniczona tylko całkowitą pamięcią, do której ma dostęp Twój język, teoretycznie, ale wymagana jest jedynie obsługa wartości do 2 ^ 256.
Twój program powinien teoretycznie obsługiwać dowolnie długie programy, ale będziesz musiał pracować tylko nad programami o długości poniżej 2 ^ 32 znaków. Musisz również obsługiwać zagnieżdżone pętle o głębokości do 2 ^ 32.
Możesz założyć, że program jest prawidłowym programem i że zawsze otrzymasz nieujemne liczby całkowite, gdy poprosisz o dane wejściowe. Możesz również założyć, że w ciągu wejściowym zawarte są tylko znaki drukowalne ASCII.
Szybkość interpretowanego programu nie ma znaczenia, będzie już boleśnie powolny dla rzeczy tak prostych jak 5-cyfrowe mnożenie, bez optymalizacji.
Jeśli chcesz użyć języka, który nie może racjonalnie zaakceptować danych wejściowych lub wygenerować danych wyjściowych w sposób opisany przez ten język, użyj dowolnej interpretacji, która ma to umożliwić. Dotyczy to każdego powodu, dla którego Twój język nie może wdrożyć niektórych wymaganych zachowań. Chcę, aby wszystkie języki mogły konkurować.
Najkrótszy program wygrywa. Obowiązują standardowe luki.