В этих проблемах, вы будете писать интерпретатор для 2 Ом (транскрибируется в TwoMega ), язык , основанный на свободно Brainfuck с бесконечномерным пространством для хранения.
Язык
2 Ω содержит три части состояния:
Лента , которая представляет собой бесконечный список битов, все инициализируются в 0. Это имеет крайний левый элемент, но не крайний правый элемент.
Указатель памяти , которая представляет собой неотрицательное целое число , которое является индексом элемента в ленте. Более высокий указатель памяти относится к ячейке ленты дальше справа; указатель памяти 0 ссылается на самый левый элемент. Указатель памяти инициализируется в 0.
Гиперкуба , который является концептуально ∞ - мерным «окном» ячеек, каждый из которых содержит бит , инициализированное в 0. ширина Гиперкуба связана в каждом измерении только 2 клеток, но бесконечность размеров означает число клетки неисчислимы .
Индекс в гиперкуб бесконечного список бит, относится к клетке , в гиперкуба (таким же образом , что конечный список бит может быть использован для обозначения гиперкуба конечной размерности). Поскольку лента представляет собой бесконечный список битов, вся лента всегда ссылается на элемент гиперкуба; этот элемент называется референтом .
2 Ω дает значение 7 различным символам:
<
уменьшает указатель памяти на 1. Уменьшение его ниже 0 - неопределенное поведение, поэтому вам не нужно обрабатывать его.>
увеличивает указатель памяти на 1!
переворачивает бит у референта..
выводит бит на референте.^
заменяет бит в ячейке, на которую указывает указатель памяти на ленте, на инверсию бита в референте.[x]
выполняет кодx
до тех пор, пока бит у референта равен 1.
Соревнование
Ваша задача - написать программу, которая принимает строку в качестве входных данных и выполняет эти входные данные как 2- омную программу.
Это Код-гольфТаким образом, самый короткий действительный ответ (измеряется в байтах) выигрывает.
Ноты
- Вы можете предположить, что программа будет состоять только из символов
<>!.^[]
и[]
будет правильно вложена. - Ваш переводчик должен быть ограничен только доступной памятью в системе. Он должен быть в состоянии запустить примеры программ в разумные сроки.
Примеры программ
Печать 1:
!.
Печать 010:
.!.!.
Печать 0 навсегда:
![!.!]
Выведите 0 навсегда или 1 навсегда, если !
добавлено:
[.]![!.!]
cat
программу: там, похоже, нет инструкции для ввода данных.
.
- печатает один ноль и затем существует; !^!.
- печатает один, а затем выходит. Больше было бы хорошо, хотя. В настоящее время нужно понять представления, чтобы проверить их (и, следовательно, выразить им свое мнение!)
[0,0,0,0,0,0,0...]
(т. Е. Наличие a !
в начале программы).
[.]![!.!]
чтобы напечатать значение этой ячейки навсегда
1
s на ленте всегда конечное. На самом деле существует довольно простая биекция между натуральными числами и состояниями ленты (интерпретировать содержимое ленты как обратное двоичное число), что показывает, что гиперкуб является в основном бесконечным одномерным массивом, доступ к которому осуществляется путем переключения битов в целочисленное значение указателя вместо того, чтобы в / уменьшать как в мозге