fundo
(Baseado em uma história verdadeira e comovente)
No meu tempo, eu brinquei com o Lisp e idiomas semelhantes com frequência. Eu escrevi com eles, os executei, os interpretei, os projetei e fiz máquinas escreverem com eles para mim ... E se há uma coisa que me incomoda, é ver o Lisp que não está de acordo com o meu estilo de formatação específico.
Infelizmente, alguns editores de texto ( tosse XCode tosse ) tendem a tirar minhas lindas abas e espaços sempre que o código é copiado e colado ... Pegue esta sintaxe do Lisp, muito bem espaçada:
(A
(B
(C)
(D))
(E))
(Onde ABCDEestão as funções arbitrárias)
ALGUNS editores de texto restringem esse código adorável para o seguinte fim:
(A
(B
(C)
(D))
(E))
Que bagunça! Isso não é legível!
Me ajuda aqui?
O desafio
Seu objetivo neste desafio é pegar uma série de funções separadas por novas linhas em um formato descrito abaixo e retornar um arranjo mais bonito que destaque legibilidade e elegância.
A entrada
Definimos uma função Fdos Nargumentos arity como uma construção semelhante à seguinte:
(F (G1 ...) (G2 ...) (G3 ...) ... (GN ...))
onde G1, G2, ..., GNestão todas as funções em si mesmas. Uma 0função de aridade Aé simplesmente (A), enquanto uma 2função de aridade Bé da forma(B (...) (...))
Seu código deve receber entrada como uma série de funções com uma única nova linha antes dos parênteses principais de cada função (exceto a primeira função). O exemplo acima é uma entrada válida.
Você pode assumir:
- Os parênteses estão equilibrados.
- Uma função nunca precisará ser recuada mais de 250 vezes.
- TODAS as funções estão entre parênteses:
() - O nome de uma função conterá apenas caracteres ASCII imprimíveis.
- O nome de uma função nunca conterá parênteses ou espaços.
- Há uma nova linha à direita opcional na entrada.
A saída
Seu código deve produzir o mesmo conjunto de funções, onde as únicas alterações feitas são as adições de espaços ou tabulações antes dos parênteses principais de funções. A saída deve obedecer às seguintes regras:
- A primeira função (e as funções posteriores de nível superior) fornecidas não deve ter espaços anteriores
- Um argumento para a localização horizontal de uma função é exatamente uma guia à direita da localização horizontal dessa função.
- Uma guia é definida pela implementação, mas deve ter pelo menos três espaços.
- Opcionalmente, você pode imprimir no máximo dois espaços após cada linha.
Regras
- Este é o código-golfe: o código mais curto vence!
- As brechas padrão não são permitidas.
Exemplos
Entrada:
(A
(B
(C)
(D))
(E))
Saída:
(A
(B
(C)
(D))
(E))
Entrada:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Saída:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Entrada:
(-: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)))))
Saída:
(-: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)))))
()?