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" з непарними індексами (без урахування ). Призначення мають значення, а не посилання.V1VVV1
Це може бути перекладено на більшості мов як .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 V1V1V1
Зауважте, що тут не було поділено 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