Гольф фіолетовий перекладач
Purple - це esolang, який розроблений з двома основними цілями:
- Щоб мінімізувати баклажани , оскільки просто не вистачає мод, що змінюють одну інструкцію.
- Визнати можливість страшенно малих перекладачів гольфу. Мій перший пропуск у досить повнофункціонального інтерпретатора Python 2 - це лише 702 байти, і я впевнений, що досвідченіший гольфіст міг би злегка від цього поголитися.
Ваша мета - написати перекладача для цієї мови.
Інформація про Purple:
Фіолетова програма - це послідовність символів, розміщених у нескінченному, адресованому масиві пам'яті таким чином, що перший символ програми розміщується за нульовою адресою. Решта масиву (як до, так і після того, де зберігається програма Purple) ініціалізується до нуля.
У Фіолеті є три регістри, які називаються a і b і i , кожен з яких може містити підписане ціле число і ініціалізований до нуля. Я також є покажчиком інструкцій, і завжди вказує на поточну виконуючу команду Purple.
Кожен цикл перекладач буде читати послідовність з трьох суміжних символів, починаючи з місця пам'яті, зазначеного вказівником інструкції, і намагатиметься виконати цю послідовність як інструкцію Purple. Після цього покажчик інструкцій завжди збільшується на 3.
Синтаксично інструкція Purple складається з трьох символів (або їх кодувань) у рядку, як " xyz ".
Першим символом x може бути будь-який з наступних:
abABio
Ці символи мають таке значення:
a - Place the result in register a.
b - Place the result in register b.
A - Place the result in the location in memory referred to by register a.
B - Place the result in the location in memory referred to by register b.
i - Set the instruction pointer to the result.
o - Output the result to stdout.
Інші два байти y і z можуть бути будь-якими з наступних:
abABio1
Кожен із цих символів має таке значення:
a - Return the contents of register a.
b - Return the contents of register b.
A - Return the contents of the memory array at the address stored in register a.
B - Return the contents of the memory array at the address stored in register b.
i - Return the contents of register i (the instruction pointer).
o - Return the value of a single character read from stdin.
1 - Return the literal numeric value 1.
Після отримання інструкції фіолетовий інтерпретатор оцінить y, а потім z , відніме результат z від результату y , а потім виконає дію, вказану x на різницю.
Якщо послідовність з трьох символів (або їх кодування) не є дійсною фіолетовою інструкцією, перекладач негайно зупиняється, не допускаючи помилок.
Ваш перекладач повинен:
- Будьте повноцінною програмою, а не функцією.
- Ніколи не виводити на stderr, якщо тільки не буде прочитано EOF .
- Поведіть ідентично реалізацію посилань на всіх добре сформованих входах, які не передбачають дуже великої кількості, включаючи тестові програми, наведені нижче. (Ну, ідентично до часу - це може працювати повільніше, але не занадто багато!)
Ви можете надати програму інтерпретатору в будь-якій бажаній формі: прочитати її з файлу, вставити в програму як рядок або прочитати з stdin.
Тестові приклади:
Програма
ooo
при запуску з введенням
z!
повинен дати вихід
Y
Програма
bbboobiii
при запуску з введенням
It's a cat program.
(або будь-який інший вхід) повинен дати результат
It's a cat program.
(або будь-який вхід, який він отримав), а потім почніть спочатку і зробіть те ж саме знову .
Програма
Aoab11bi1bABoAaiba
при запуску з введенням
0
повинен дати вихід
0
а потім зупиняти, але коли працювати з введенням
1
слід продовжувати виводити
1
навіки.
Програма
b1bbb1oAbabaa1ab1Ab1Bi1b
повинен дати вихід
b1bbb1oAbabaa1ab1Ab1Bi1b
Програма
aA1aa1bb1oAbbi1bb1bbAb1Bi1b Purple is the awesomest! Why haven't you tried it yet?
!dlroW ,olleG
повинен дати вихід
Hello, World!
Оцінка:
Це код-гольф , тому виграє найкоротше джерело в байтах, потенційно модифіковане наступним бонусом.
Бонус:
- -10%, якщо ваш перекладач читає ім'я файлу або з stdin, або з аргументу командного рядка і завантажує програму з файлу.
uint32
символи та MAXINT для ints