На эзотерическом языке программирования 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 точек с запятой подряд) или {{};}
(ненужные пустые группы скобок) называются неправильными фигурными числами. Они подчиняются вышеуказанной грамматике и могут быть оценены обычным способом, но они также способны к более коротким представлениям (для приведенных выше примеров {{;}}
и {;}
соответственно).
Соревнование
Напишите программу или функцию, которая вводит / получает строку. Если строка является неотрицательным десятичным целым числом, выведите / верните правильное (т.е. самое короткое из возможных) представление Curly для этого целого числа. Если строка является фигурным числом, выведите / верните ее десятичное представление.
Ввод может быть получен через STDIN, аргумент командной строки или параметр функции. Это должна быть строка; то есть вы не можете написать функцию, которая принимает строки для фигурных чисел, но целые числа для десятичных чисел.
Вывод может быть распечатан на STDOUT или возвращен из функции. Функция может возвращать целое число, когда это уместно, или она может возвращать строки во всех ситуациях.
Ваша программа не должна обрабатывать неправильный ввод (числа Curly, нарушающие правила форматирования, числа с плавающей запятой, отрицательные целые числа, произвольный текст), и не требуется обрабатывать неправильные числа Curly (но см. Ниже). Ввод будет состоять только из печатных символов 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 еще не реализован. Но если этот вопрос хорошо, я могу развивать его дальше.