Задний план
(На основе истинной, душераздирающей истории)
В свое время я часто играл с Лиспом и похожими языками. Я написал с ними, запустил их, интерпретировал их, разработал их, и заставил машины писать для них для меня ... И если есть одна вещь, которая беспокоит меня, это видеть 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)))))
()
?