Задний план
(На основе истинной, душераздирающей истории)
В свое время я часто играл с Лиспом и похожими языками. Я написал с ними, запустил их, интерпретировал их, разработал их, и заставил машины писать для них для меня ... И если есть одна вещь, которая беспокоит меня, это видеть Lisp, который не соответствует моему определенному стилю форматирования.
К сожалению, некоторые текстовые редакторы ( кашель XCode кашель ) имеют тенденцию лишать мои красивые вкладки и пробелы всякий раз, когда код копируется и вставляется ... Возьмите этот красиво разнесенный синтаксис, похожий на Lisp:
(A
(B
(C)
(D))
(E))
(Где ABCDE
произвольные функции)
НЕКОТОРЫЕ текстовые редакторы разделывают этот прекрасный код на следующий конец:
(A
(B
(C)
(D))
(E))
Какой беспорядок! Это не читается!
Помоги мне, здесь?
Соревнование
Ваша задача в этой задаче состоит в том, чтобы взять ряд функций, разделенных символами новой строки, в формате, описанном ниже, и вернуть более красивое расположение, которое подчеркивает читабельность и элегантность.
Вход
Мы определяем функцию аргументов F
arity N
как конструкцию, подобную следующей:
(F (G1 ...) (G2 ...) (G3 ...) ... (GN ...))
где G1, G2, ..., GN
все функции сами по себе. Арностью 0
функция A
просто (A)
, в то время как арностью 2
функция B
имеет вид(B (...) (...))
Ваш код должен принимать входные данные как последовательность функций с одной новой строкой перед каждой круглой скобкой (кроме первой функции). В приведенном выше примере допустим ввод.
Вы можете предположить:
- Скобки сбалансированы.
- Функция никогда не должна иметь отступ более 250 раз.
- КАЖДАЯ функция заключена в круглые скобки:
()
- Имя функции будет содержать только печатные символы ASCII.
- Имя функции никогда не будет содержать скобок или пробелов.
- На входе есть необязательный завершающий символ новой строки.
Выход
Ваш код должен выводить тот же набор функций, где единственные сделанные изменения - это добавление пробелов или табуляции перед ведущими скобками функций. Вывод должен соответствовать следующим правилам:
- Первая заданная функция (и более поздние функции верхнего уровня) не должны иметь предшествующих пробелов
- Аргументом горизонтального положения функции является ровно одна вкладка справа от горизонтального положения этой функции.
- Вкладка определяется реализацией, но должна содержать не менее 3 пробелов.
- Вы можете при желании вывести не более двух пробелов после каждой строки.
правила
- Это код-гольф: выигрывает самый короткий код!
- Стандартные лазейки запрещены.
Примеры
Входные данные:
(A
(B
(C)
(D))
(E))
Выход:
(A
(B
(C)
(D))
(E))
Входные данные:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Выход:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Входные данные:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
Выход:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
источник
()
?Ответы:
Pyth,
24201918 байтУвеличивает счетчик для каждой строки, подсчитывает общее количество закрывающих скобок, встреченных до сих пор, и вычитает его из счетчика. Затем мы делаем отступ по
counter
вкладкам.источник
*4
это жесткое и избыточное предпочтение.FN.z+*ZC9N~Z-1/N\)
позволяет использовать ширину отступа вашего редактора и сохраняет один байт.\<tab>
илиC9
.Common Lisp -
486414 байт (версия Rube Goldberg)Подходить
Вместо того, чтобы поступать, как все, и считать скобки вручную, давайте вызовем считыватель Lisp и сделаем это правильно :-)
(
,)
или в виде строк.read
функцию для создания фактических списков.p
каждый из этих списков, которые рекурсивно записывают их в стандартный вывод с требуемым форматом. В частности, строки печатаются без кавычек.Как следствие этого подхода:
пример
Чтение из файла, используя эту обертку:
Вот результат:
(похоже, здесь вкладки конвертируются в пробелы)
Довольно напечатанный (версия для гольфа)
В отличие от более безопасной исходной версии, мы ожидаем, что ввод будет действительным.
источник
Retina ,
8983 байтаГде
<tab>
обозначает фактический символ табуляции (0x09) и<empty>
обозначает пустую строку. Сделав эти замены, вы можете запустить приведенный выше код с-s
флагом. Однако я не считаю этот флаг, потому что вы также можете просто поместить каждую строку в свой собственный исходный файл, и в этом случае 7 новых строк будут заменены на 7 штрафных байтов для дополнительных исходных файлов.Это полная программа, принимающая данные на STDIN и печатающая результат в STDOUT.
объяснение
Каждая пара строк определяет подстановку регулярных выражений. Основная идея состоит в том, чтобы использовать группы балансировки .NET для подсчета текущей глубины до заданной
(
, а затем вставлять столько вкладок до этого(
.Сначала мы подготовим вход. Мы не можем действительно записать условное количество вкладок, если мы не можем найти их где-нибудь во входной строке, чтобы захватить их. Итак, мы начнем с дублирования всего ввода, разделенного вкладкой. Обратите внимание, что метод
s`
just активирует однострочный (или «точка-все») модификатор, который гарантирует, что он.
также соответствует символу новой строки.Теперь мы превращаем каждый символ после этой вкладки в вкладку. Это дает нам достаточное количество вкладок в конце строки, без изменения исходной строки.
Это мясо решения.
m
Иs
активировать режим многострочных (так что^
соответствует началу строки) и режим однострочного.+
Говорит Retina, чтобы повторять эту замену , пока на выходе не перестает изменяться (в данном случае это означает, что до тех пор , шаблон больше не совпадает со строкой).Сам шаблон соответствует префиксу ввода вплоть до необработанного
(
(то есть a(
, который не имеет никаких вкладок перед ним, но должен). В то же время он определяет глубину префикса с балансировочными группами, так что высота стека2
будет соответствовать текущей глубине и, следовательно, количеству вкладок, которые нам нужно добавить. Вот эта часть:Это либо соответствует
(
, толкая его на2
стек, либо совпадает с a)
, извлекая последний захват из2
стека, либо совпадает с чем-то другим и оставляет стек без изменений. Поскольку круглые скобки гарантированно сбалансированы, нам не нужно беспокоиться о попытке выскочить из пустого стека.После того, как мы прошли через строку, подобную этой, и нашли необработанную,
(
чтобы остановиться на ней, упреждающий элемент затем переходит к концу строки и захватывает вкладки в группу3
, выталкивая их из2
стека, пока он не опустеет:Используя
+
там, мы гарантируем, что шаблон соответствует чему угодно, только если в соответствие должна быть вставлена хотя бы одна вкладка - это позволяет избежать бесконечного цикла при наличии нескольких функций корневого уровня.Наконец, мы просто избавляемся от этих вспомогательных вкладок в конце строки, чтобы очистить результат.
источник
C:
9594 символаЭто еще не очень удачно, и из-за того, что я не уверен, приемлемы ли вкладки, я использую их здесь.
Ungolfed:
Изменить: Сделано так, что он выходит на EOF.
источник
if(c<11)
вместоif(c==10)
?Юлия,
10399979488 байтЭто определяет безымянную функцию, которая принимает строку и печатает версию с отступом. Чтобы назвать его, дайте ему имя, например
f=p->...
. Обратите внимание, что входные данные должны быть допустимой строкой Julia, поэтому знаки доллара ($
) должны быть экранированы.Ungolfed + объяснение:
Пример, притворяющийся каждым набором четырех пробелов, является вкладкой:
Любые предложения приветствуются!
источник
Хаскелл,
8381очень бесплатное решение.
источник
h=
.Perl, 41
40
символы+1
для-p
.Бежать с:
источник
Python 2 -
8878 байтДовольно простое (и не очень короткое) решение:
источник
'\t'
вместо' '
одного байта и сохранить; 2) нет необходимости присваиватьinput.split()
переменной, так как она используется только один раз (то же самое дляc
, а также -d
просто переместитеprint
оператор); 3) приоритет оператора означает, что круглые скобкиl*c
не нужны. Кроме того, похоже, чтоf
он ни для чего не используется - это пережиток предыдущей версии?raw_input
вместоinput
(и не забывайте скобки после него!).CJam, 20 байтов
Попробуйте онлайн в интерпретаторе CJam .
Как это работает
источник