Dans ce défi, vous écrirez un interprète pour 2 Ω (transcrit en TwoMega ), un langage basé vaguement sur le brainfuck avec un espace de stockage de dimension infinie.
La langue
2 Ω contient trois éléments d'état:
La bande , qui est une liste infinie de bits, tous initialisés à 0. Elle a un élément le plus à gauche, mais pas d'élément le plus à droite.
Le pointeur de mémoire , qui est un entier non négatif qui est un index d'un élément de la bande. Un pointeur de mémoire supérieur fait référence à une cellule de bande plus à droite; un pointeur de mémoire de 0 fait référence à l'élément le plus à gauche. Le pointeur de mémoire est initialisé à 0.
L' Hypercube , qui est une "boîte" de cellules conceptuellement ∞- dimensionnelle, dont chacune contient un bit initialisé à 0. La largeur de l'Hypercube est liée dans chaque dimension à seulement 2 cellules, mais l'infinité des dimensions signifie le nombre de les cellules sont innombrables .
Un index dans l'hypercube est une liste infinie de bits qui fait référence à une cellule de l'hypercube (de la même manière qu'une liste finie de bits pourrait être utilisée pour faire référence à un hypercube de dimension finie). Parce que la bande est une liste infinie de bits, la bande entière se réfère toujours à un élément de l'hypercube; cet élément est appelé référent .
2 Ω donne un sens à 7 caractères différents:
<
décrémente le pointeur de mémoire de 1. Le décrémenter en dessous de 0 est un comportement indéfini, vous n'avez donc pas besoin de le gérer.>
incrémente le pointeur mémoire de 1.!
retourne le bit au référent..
sort le bit au référent.^
remplace le bit de la cellule pointée par le pointeur de mémoire sur la bande par l' inverse du bit du référent.[x]
exécute le codex
tant que le bit au référent est 1.
Le défi
Votre tâche consiste à écrire un programme qui prend une chaîne en entrée et exécute cette entrée en tant que programme 2 Ω .
Il s'agit de code-golf , donc la réponse valide la plus courte (mesurée en octets) l'emporte.
Remarques
- Vous pouvez supposer que le programme se composera uniquement des caractères
<>!.^[]
et qu'il[]
sera correctement imbriqué. - Votre interprète ne doit être limité que par la mémoire disponible sur le système. Il doit pouvoir exécuter les exemples de programmes dans un délai raisonnable.
Exemples de programmes
Imprimer 1:
!.
Imprimer 010:
.!.!.
Imprimer 0 pour toujours:
![!.!]
Imprimez 0 pour toujours ou 1 pour toujours si !
est ajouté:
[.]![!.!]
cat
programme: il ne semble pas y avoir d'instructions pour la saisie.
.
- imprime un seul zéro puis existe; !^!.
- imprime un seul puis quitte. Plus serait bien cependant. Pour le moment, il faut comprendre les soumissions afin de les vérifier (et donc de les voter!)
[0,0,0,0,0,0,0...]
(c'est-à-dire la présence d'un !
au début du programme).
[.]![!.!]
pour imprimer la valeur de cette cellule pour toujours
1
s sur la bande est toujours fini. En fait, il existe une bijection assez simple entre les nombres naturels et les états de bande (interpréter le contenu de la bande comme un nombre binaire en arrière), ce qui montre que le Hypercube est fondamentalement un tableau 1D infini, accessible en retournant les bits dans une valeur de pointeur entier , au lieu d'in / décrémenter comme dans brainfuck.