99 (вимовляється "дев'яносто дев'ять") - це абсолютно нова мова програмування езотерики (не плутати з 99 , зверніть увагу на курсив). Ваше завдання в цьому виклику - написати перекладача на 99, який є максимально коротким. Виграє подання з найменшими байтами . Tiebreaker переходить до подання, розміщеного першим.
Оскільки це питання трохи глибше, ніж зазвичай, і я хочу бачити хороші відповіді, я буду нагороджувати улюбленою відповіддю у розмірі 250 реп. (Не обов'язково переможця).
99 Спец
99 - імперативна мова. Кожен рядок у програмі 99 - це один вислів , і під час виконання покажчик інструкції починається з верхнього рядка і проходить кожен наступний рядок у порядку, виконуючи їх по дорозі. Програма закінчується, коли виконується останній рядок. Оператори Goto можуть перенаправляти шлях вказівника інструкції.
Новий рядок, пробіл та 9
єдині три символи, які мають значення у програмі 99 . Усі інші символи повністю ігноруються. Крім того, пробіли у кожному рядку ігноруються, а кілька проміжків у рядку читаються як один пробіл. ("Новий рядок" відноситься до будь-якого загального кодування розриву рядків . Не має значення, який використовує ваш інтерпретатор.)
Отже ця програма:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
Ідентичний цій програмі:
9 99 9999
9 9
Змінні
У всіх змінних 99 є імена, які є одним або декількома 9
з'єднаними ( 9+
у регулярному вираженні). Так , наприклад, 9
, 99
і 9999999999
всі різні змінні. Природно, їх нескінченно багато (обмеження обмеження пам'яті).
Значення кожної змінної - це підписане ціле число довільної точності . За замовчуванням кожній змінній присвоюється власне числове представлення. Отже, якщо вона не була перепризначена, значення змінної 9
- це число 9, а значення змінної 99
- це число 99 тощо. Ви можете подумати про це як про обробку змінних як прості числа, поки вони не будуть явно призначені.
Я буду використовувати V
для позначення довільної назви змінної нижче.
Кожен екземпляр V
може бути замінений 9
, 99
, 999
, 9999
і т.д.
Заяви
У 99 є п'ять різних типів операторів . Кожен рядок програми 99 містить рівно один вислів.
Синтаксис, описаний тут, передбачає, що всі сторонні символи були видалені, всі пробіли були видалені, а всі послідовності декількох пробілів були замінені на одиничні пробіли.
1. Немає операції
Порожній рядок - неоперативний . Він нічого не робить (крім збільшення покажчика інструкції).
2. Вихід
V
Одна змінна V
в рядку друкує цю змінну для stdout.
Якщо V
має непарне число 9
's ( 9
, 999
тощо), то V
друкується ціле значення, поділене на 9 (у десятковій кількості).
Якщо V
має парне число 9
's ( 99
, 9999
і т.д.), то символ ASCII з кодом, V
розділеним на 9, mod 128 буде надруковано. (Це (V / 9) % 128
значення від 0 до 127.)
Приклад : Програма
9
9999
надрукував би 1W
. Перший рядок друкується, 1
оскільки 9/9 дорівнює 1. Другий рядок друкується, W
оскільки 9999/9 - це 1111, а 1111 мод 128 - 87, а 87 - код символів для W
.
Зверніть увагу, що розриви рядків не друкуються між вихідними маркерами. \n
потрібно чітко надрукувати для розриву рядка.
3. Введення
V
Єдина змінна V
на рядку з провідним простором приймає вхід від stdin і зберігає його в цій змінній.
Якщо V
має непарне число 9
's, то користувач може ввести будь-яке підписане ціле число і V
буде встановлено в 9 разів більше цього значення.
Якщо V
має парне число 9
's, то користувач може ввести будь-який символ ASCII і V
буде встановлений у 9 разів більше його символьного коду.
Приклад : дана програма -57
і A
як вхідна програма
9
9
99
99
виведе -57A
. Внутрішня змінна 9
мала б значення -513 і 99
мала б значення 585.
Ваш перекладач може припустити, що дані завжди синтаксично дійсні.
4. Призначення
Це твердження може бути довільним довгим. Це дві або більше змінних у рядку, розділених пробілами:
V1 V2 V3 V4 V5 ...
Це призначає суму всіх "s" з парними індексами, за вирахуванням суми "s" з непарними індексами (без урахування ). Призначення мають значення, а не посилання.V1
V
V
V1
Це може бути перекладено на більшості мов як .V1 = V2 - V3 + V4 - V5 + ...
Отже, якщо є лише дві змінні, це нормальне призначення:
V1 V2
→ V1 = V2
Якщо їх три, то це віднімання:
V1 V2 V3
→ V1 = V2 - V3
І знак +
/ -
продовжує перемикатися вперед і назад з кожною додатковою змінною:
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
Приклад : Ця програма виводить 1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5. Goto (стрибок, якщо все нульове)
Це твердження також може бути довільним довгим. Це дві або більше змінних на лінії, розділених пробілами, з провідним пробілом :
V1 V2 V3 V4 V5 ...
Якщо деякі значення, крім того, є ненульовими, то це поводиться так само, як не-оп. Покажчик інструкцій переміщується до наступного рядка, як завжди.V1
Якщо всі додаткові значення дорівнюють нулю, покажчик інструкції переміщується на номер рядка . Рядки індексуються нулем, тому, якщо дорівнює нулю, то вказівник переміщується до верхньої лінії. Програма припиняється (як правило, без помилок), якщо вона негативна або більша за максимально можливий індекс (кількість рядків мінус один).V1
V1
V1
V1
Зауважте, що тут не було поділено 9. І оскільки неможливо, щоб змінна була величиною, не кратною 9, можна переходити лише номери рядків, кратні 9.V1
Приклади:
Ця програма буде друкувати 1
назавжди:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
Ця програма
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
буде виводити числа 11 до 1 у порядку зменшення в оточенні G
's:
G11G10G9G8G7G6G5G4G3G2G1G
Додаткові відомості
Ідеальний перекладач буде працювати з командного рядка з ім'ям 99 програмного файлу як аргумент. Введення / виведення також буде виконано на льоту в командному рядку.
Однак ви можете просто написати функцію інтерпретатора, яка приймає в програмі як рядок, а також список вхідних жетонів (наприклад ["-57", "A"]
). Функція повинна друкувати або повертати вихідний рядок.
Трохи різні способи роботи перекладача та обробки вводу-виводу є прекрасними, якщо ці можливості неможливі для вашої мови.
Бонус: Напишіть щось класне в 99 році, і я з радістю викладу це на цій посаді як приклад.
- Ось паста з акуратної програми "99 пляшок пива" з відповіді Мака .
Сподіваюся, вам сподобався мій 99-й виклик! : D