На мові езотеричного програмування Curly, програми складаються виключно з фігурних дужок {}
і крапки з комою ;
. Незважаючи на цей скромний набір інструментів, у Curly є літерали, які можуть представляти будь-яке невід’ємне ціле число. Формат трохи важко читати незнайомим, тому давайте напишемо якийсь код, щоб зробити перетворення для нас.
Формат чисел
Фігурні цифри структуровані за такими правилами:
- Додавання крапки з комою додає один до числа.
- Число, вкладене в фігурні дужки, множиться на чотири.
- Кучеряво-фігурні групи можуть бути вкладені, але не зв'язані. Підтяжки повинні відповідати належним чином.
- Крапки з комою поза набором фігурних дужок повинні надходити згодом, а не раніше.
- Щоб уникнути неоднозначності при розборі, число завжди повинно починатися з фігурної дужки.
Деякі приклади:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Зверніть увагу, що правило 5 означає, що цифри від 0 до 3 повинні починатися з порожньої пари фігурних дужок.)
І кілька недійсних прикладів:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Ось граматика BNF для фігурних чисел:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Числа на кшталт {;;;;}
(більше 3 крапки з комою підряд) або {{};}
(зайві порожні групи дужок) називаються неправильними фігурними числами. Вони підкоряються вищевказаній граматиці і можуть бути оцінені звичайним чином, але вони також здатні до коротших уявлень (для вищенаведених прикладів {{;}}
і {;}
відповідно).
Змагання
Напишіть програму або функцію, яка вводить / отримує рядок. Якщо рядок є невід’ємним десятковим цілим числом, виведіть / поверніть належне (тобто найкоротше можливе) фігурне подання для цього цілого числа. Якщо рядок є фігурним числом, виведіть / поверніть його десяткове подання.
Вхід може бути отриманий через STDIN, аргумент командного рядка або параметр функції. Це має бути рядок; тобто ви не можете записати функцію, яка приймає рядки для фігурних чисел, але цілі числа для десяткових чисел.
Вихід може бути надрукований в STDOUT або повернутий з функції. Функція може повернути ціле число, коли це доречно, або може повернути рядки у будь-яких ситуаціях.
Вашій програмі не доводиться обробляти неправильні дані (фігурні числа, які порушують правила форматування, числа з плаваючою комою, від’ємні цілі числа, випадковий текст), і не потрібно обробляти неправильні фігурні числа (але див. Нижче). Вхід складається з друкованих символів ASCII.
Оцінка балів
Виграє найкоротший код у байтах. Якщо ваша програма може зробити як в наступному:
- правильно обробляти неправильні фігурні номери та
- коли вам надано фігурне число, ігноруйте зайві символи, яких немає
{};
потім відніміть 10% від вашої оцінки. (Введення цілого числа ніколи не матиме сторонніх символів, навіть бонус.)
Тестові справи
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Для бонусу:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Примітка: Curly ще не реалізовано. Але якщо це питання добре, я можу розвинути його далі.