У цьому виклику ви напишете інтерпретатора на 2 Ω (транскрипцію як TwoMega ), мовою, заснованої вільно на головному мовленні з нескінченномірним простором зберігання.
Мова
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 !на початку програми).
[.]![!.!]щоб назавжди надрукувати значення цієї клітинки
1s на стрічці завжди обмежена. Насправді між природними числами та станами стрічки існує досить проста біекція (інтерпретуйте вміст стрічки як бінарне число назад), що показує, що Гіперкуба - це в основному нескінченний 1D масив, доступ до якого здійснюється шляхом перегортання бітів у цілочисельне значення вказівника. , замість in / decrementing, як у brainfuck.