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 ABCDE
estã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 F
dos N
argumentos arity como uma construção semelhante à seguinte:
(F (G1 ...) (G2 ...) (G3 ...) ... (GN ...))
onde G1, G2, ..., GN
estão todas as funções em si mesmas. Uma 0
função de aridade A
é simplesmente (A)
, enquanto uma 2
funçã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)))))
()
?