In dieser Herausforderung schreiben Sie einen Interpreter für 2 Ω (transkribiert als TwoMega ), eine Sprache, die lose auf Brainfuck mit einem unendlich dimensionalen Speicherplatz basiert .
Die Sprache
2 Ω enthält drei Zustandselemente:
Das Band , eine unendliche Liste von Bits, wurde alle auf 0 initialisiert. Es hat ein Element ganz links, aber kein Element ganz rechts.
Der Speicherzeiger , eine nicht negative Ganzzahl, die ein Index eines Elements im Band ist. Ein höherer Speicherzeiger bezieht sich auf eine Bandzelle weiter rechts; Ein Speicherzeiger von 0 bezieht sich auf das Element ganz links. Der Speicherzeiger wird auf 0 initialisiert.
Der Hypercube , eine konzeptionell ∞- dimensionale "Box" von Zellen, von denen jede ein auf 0 initialisiertes Bit enthält. Die Breite des Hypercubes ist in jeder Dimension an nur 2 Zellen gebunden, aber die Unendlichkeit der Dimensionen bedeutet die Anzahl von Zellen ist unzählig .
Ein Index in den Hypercube ist eine unendliche Liste von Bits, die sich auf eine Zelle im Hypercube bezieht (genauso wie eine endliche Liste von Bits verwendet werden könnte, um auf einen Hypercube mit endlicher Dimension zu verweisen). Da das Band eine unendliche Liste von Bits ist, bezieht sich das gesamte Band immer auf ein Element des Hypercube. Dieses Element wird als Referent bezeichnet .
2 Ω gibt 7 verschiedenen Zeichen Bedeutung:
<
Dekrementiert den Speicherzeiger um 1. Das Dekrementieren unter 0 ist ein undefiniertes Verhalten, sodass Sie nicht damit umgehen müssen.>
erhöht den Speicherzeiger um 1.!
dreht das Bit beim Referenten um..
gibt das Bit am Referenten aus.^
Ersetzt das Bit an der Zelle, auf die der Speicherzeiger auf dem Band zeigt, durch die Umkehrung des Bits am Referenten.[x]
führt den Codex
aus, solange das Bit am Referenten 1 ist.
Die Herausforderung
Ihre Aufgabe ist es, ein Programm zu schreiben, das eine Zeichenfolge als Eingabe verwendet und diese Eingabe als 2 Ω- Programm ausführt .
Dies ist Code-Golf , daher gewinnt die kürzeste gültige Antwort (gemessen in Bytes).
Anmerkungen
- Sie können davon ausgehen, dass das Programm nur aus den Zeichen besteht
<>!.^[]
und[]
ordnungsgemäß verschachtelt ist. - Ihr Interpreter sollte nur durch den verfügbaren Speicher im System begrenzt sein. Es sollte in der Lage sein, die Beispielprogramme in angemessener Zeit auszuführen.
Beispielprogramme
Druck 1:
!.
Drucken 010:
.!.!.
0 für immer drucken:
![!.!]
Drucken Sie 0 für immer oder 1 für immer, wenn !
vorangestellt wird:
[.]![!.!]
cat
Programm zu schreiben : Es scheint keine Anweisung für die Eingabe zu geben.
.
- druckt eine einzelne Null und existiert dann; !^!.
- druckt einen einzelnen und wird dann beendet. Mehr wäre aber gut. Im Moment muss man die Einsendungen verstehen, um sie zu verifizieren (und sie daher zu verbessern!)
[0,0,0,0,0,0,0...]
(dh das Vorhandensein von a !
zu Beginn des Programms).
[.]![!.!]
, um den Wert dieser Zelle für immer zu drucken
1
s auf dem Band immer begrenzt ist. Tatsächlich gibt es eine ziemlich einfache Bijektion zwischen den natürlichen Zahlen und den Bandzuständen (interpretieren Sie den Bandinhalt als rückwärts gerichtete Binärzahl), was zeigt, dass der Hypercube im Grunde ein unendliches 1D-Array ist, auf das durch Umdrehen von Bits in einem ganzzahligen Zeigerwert zugegriffen wird , anstatt wie beim Brainfuck in / dekrementieren.