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