W tym wyzwaniem, można napisać tłumacza dla 2 Ohm (transkrypcji jako TwoMega ), język oparty luźno na brainfuck z nieskończoną-wymiarowej przestrzeni magazynowej.
Język
2 Ω zawiera trzy części stanu:
Tape , która jest nieskończona lista bitów, wszystkie inicjowany na 0. To ma skrajnie lewą element, ale nie skrajny prawy element.
Pamięci wskaźnik , który jest dodatnią liczbą całkowitą, która ma indeks elementu z taśmy. Wyższy wskaźnik pamięci odnosi się do komórki taśmy po prawej stronie; wskaźnik pamięci 0 oznacza lewy element. Wskaźnik pamięci jest inicjowany na 0.
Hypercube , który jest koncepcyjnie ∞ wymiarową „skrzynka” komórek, z których każda zawiera nieco zainicjowanym z wartością 0. szerokość hipersześcianu jest związana w każdym wymiarze tylko dwóch komórek, ale nieskończoność rozmiarów oznacza liczbę komórki to niepoliczalne .
indeks do hipersześcianu nieskończona listę bitów odnosi się do komórki w hipersześcianu (w taki sam sposób, jak lista skończonych bitów może być używane w odniesieniu do hipersześcianu skończonych wymiarach). Ponieważ taśma jest nieskończoną listą bitów, cała taśma zawsze odnosi się do elementu Hypercube; element ten nazywa się odnośnikiem .
2 Ω nadaje znaczenie 7 różnym znakom:
<
zmniejsza wskaźnik pamięci o 1. Zmniejszenie go poniżej 0 jest niezdefiniowanym zachowaniem, więc nie musisz go obsługiwać.>
zwiększa wskaźnik pamięci o 1.!
odwraca bit w stosunku do odnośnika..
wypisuje bit pod odnośnikiem.^
zamienia bit w komórce wskazanej przez wskaźnik pamięci na taśmie odwrotnością bitu w odnośniku.[x]
uruchamia kod,x
o ile bit przy odnośniku wynosi 1.
Wyzwanie
Twoim zadaniem jest napisanie programu, który pobiera ciąg znaków jako wejście i wykonuje to wejście jako program o wartości 2 Ω .
To jest golf-golf, więc wygrywa najkrótsza poprawna odpowiedź (mierzona w bajtach).
Notatki
- Możesz założyć, że program będzie się składał wyłącznie ze znaków
<>!.^[]
i że[]
będzie odpowiednio zagnieżdżony. - Twój tłumacz powinien być ograniczony tylko dostępną pamięcią w systemie. Powinno być możliwe uruchomienie przykładowych programów w rozsądnym czasie.
Przykładowe programy
Drukuj 1:
!.
Drukuj 010:
.!.!.
Drukuj 0 na zawsze:
![!.!]
Drukuj 0 na zawsze lub 1 na zawsze, jeśli !
jest poprzedzony:
[.]![!.!]
cat
programu: wydaje się, że nie ma instrukcji do wprowadzania danych.
.
- wypisuje jedno zero, a następnie istnieje; !^!.
- drukuje jeden, a następnie wychodzi. Więcej by było jednak dobrych. W tej chwili należy zrozumieć zgłoszenia, aby je zweryfikować (a zatem głosować za nimi!)
[0,0,0,0,0,0,0...]
(tj. Obecność a !
na początku programu).
[.]![!.!]
aby wydrukować wartość tej komórki na zawsze
1
s na taśmie jest zawsze skończona. W rzeczywistości istnieje dość prosty biject między liczbami naturalnymi a stanami taśmy (interpretuj zawartość taśmy jako wsteczną liczbę binarną), co pokazuje, że Hypercube jest w zasadzie nieskończoną tablicą 1D, do której dostęp uzyskuje się poprzez odwracanie bitów w wartość wskaźnika liczby całkowitej , zamiast in / decrementing jak w brainfuck.