На эзотерическом языке программирования 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 еще не реализован. Но если этот вопрос хорошо, я могу развивать его дальше.
Ответы:
Pyth,
3532 байта - 10% = 28,8Попробуйте онлайн: демонстрация или тестовый набор
редактировать: как оказалось, я случайно могу также обрабатывать неправильные вьющиеся числа. Не было запланировано вообще. ;-)
Объяснение:
В коде есть два выражения. Первый преобразует число в фигурное число, а второй преобразует фигурное число в обычное число.
.x
дескрипторы, чье выражение печатается. Он попытается напечатать первое выражение. Если на входе есть какие-либо нецифровые символы, первое выражение завершается неудачно (через исключение)..x
ловит исключение и печатает второе.источник
.[Z2
необходимо.CJam,
51474441 байтПопробуйте онлайн: пример прогона | тестирование
Как это работает
источник
Python 2, 167 байт - 10% = 150,3
В этой реализации
c
есть функция, которая удовлетворяет требованиям. Возвращает строку, если в качестве входных данных указано неотрицательное целое число, или целое число, если в качестве входных данных указано фигурное числоисточник
Python 266 байтов - 10% =
1268,1326,7239,4 байтаМальчик я не код гольфист еще = /, но 10% помогли мне оттуда много , когда мой счет был еще более 1000!
У меня есть полностью выделенная (и подробная) версия этого кода здесь. Он распознает действительность фигурных чисел и предоставит зацикленный интерфейс для ввода чисел для тестирования.
(Комментарии только для пояснения)
Смотрите этот код в действии
Спасибо Эрику Константопулосу за значительное сокращение байтов! Вы могли бы сказать ... он действительно взял ... байт ... из моего кода ... * себя пять *
источник
print
операторов и комментариев, имена переменных слишком длинные, и некоторые пробелы могут быть устранены. Я также рекомендую прочитать Советы по игре в гольф в Пироне .value
в иv
т. д.), 3) делать умные вещи в гольф : это точка, где вам нужно взглянуть на ссылку Денниса. Мне любопытно посмотреть, сколько вы можете сократить это!CJam,
87 байт,80,1 балла (89 байт - бонус 10%)Обновите версию, которая дает право на бонус при увеличении на 2 байта:
Попробуйте онлайн
Впервые я использовал рекурсию в CJam! Все это может выглядеть довольно долго, но два совершенно разных преобразования суммируются.
Я использовал совершенно отдельный случай для преобразования чисел меньше 4 в фигурные. Возможно, этого можно избежать, но сложить обработку специального случая в рекурсивную функцию было бы не совсем тривиально. И добавление дополнительного
{}
в качестве шага постобработки не выглядело немного лучше, хотя я должен повторить попытку, если он будет немного короче.источник
C #, 173 - 10% = 155,7
171,0, 177,3Это не делает проверки и только ищет
;
и}
символы. Предполагается, что все{
символы предшествуют любым;
персонажам. Самое сложное, что я обнаружил, - не вставлять{}
в середину фигурного числа.Разрывы строк и отступы для ясности:
источник
Java 326 байтов - 10% = 294 байта
Это полная программа, написанная на Java,
Я уверен, что это может быть намного короче, но у меня не может быть много времени, чтобы оптимизировать это
источник
public
предшествующего классаpublic static void main(String[]c){
сstatic{
GNU sed,
330326 - 10% = 293,4(Я добавил один для использования,
-r
прежде чем требовать бонус 10%; я надеюсь, что это правильно)Полная версия показывает, что большинство из перечисленного выше является преобразованием между десятичным и унарным:
источник
Perl,
183177Это может быть не самый короткий ответ Perl, но я думаю, что это достаточно интересно, чтобы публиковать (ввод
$_
, вывод в качестве возвращаемого значения):sub f{if(/}/){s/[{}]/00/g;oct'0b'.s/00(;+)/sprintf'%02b',length$1/ger}else{$_=sprintf'%064b',$_;s/../oct"0b$&"/ge;s/^0+(?!$)//;$_='{'x length.$_;s/\d/'}'.';'x$&/ge;s/\Q{{}/{/r}}
Мы видим, что Curly является просто четвертичной (base-4) нотацией. Нам немного мешает отсутствие в Perl встроенной поддержки четвертичного кода, но, к счастью, каждый кватернит состоит из двух битов в двоичном коде, и мы можем читать и записывать двоичный код. Итак, у нас есть следующее:
Расширенная версия
источник
JavaScript (ES6), 95 (105-10%)
Тест бегущего фрагмента ниже
источник
Рубин
126,9129,6 (144 - 10%)Использует рекурсию для преобразования десятичной формы в фигурную. Снятие флажка для игнорирования символов за пределами
/[;{}]/
увеличивает счет0.4
на данный момент.источник
Perl 5, 154 (
185170 байт - 10% + 1 штраф)Regex & Eval разрешить кудри.
Генерация керли делается по-другому.
Тест
Тестовый файл содержит также бонусные случаи
источник
Сетчатка ,
6964 байтаПопробуйте Test Suite
объяснение
Разложить внутренние скобки только на
;
s. Цикл, пока нет больше брекетов.Преобразовать между десятичной и унарной
;
Найдите самый длинный пробег
;
, кратный 4, и вложите в фигурные скобки, пока не закончится цикл 4+.Если полученное вьющееся число начинается с
;
или является пустой строкой, добавьте{}
перед.источник
Python 2 , 157 байт -10% = 141,3
Попробуйте онлайн!
Более удачный ответ Python 2, который обрабатывает бонусные случаи. Не хотел, чтобы это были комментарии, так что вот оно.
Он работает изнутри на фигурных числах, добавляя 4 ^ (число конечных фигурных скобок, оставшихся в строке) к сумме для каждой найденной точки с запятой. Если строка является числом, то она рекурсивно создает фигурное число так же, как предоставленная грамматика.
источник