Aqui está um exemplo de entrada, para que eu possa explicar qual é o problema:
((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))
Pense nessa linha de texto como um mapa topográfico de algumas montanhas. Cada conjunto de parênteses ilustra uma unidade de altitude.
Se "visualizarmos" isso de lado, para vermos as montanhas verticalmente, veremos:
4 5 cherries woohoo
1 2 3 moo lik e
i
Dado um desses mapas topográficos, produza o mapa, mas em uma escala vertical, como a produção acima. Separe os diferentes itens no mapa com o número de caracteres para o próximo item. Por exemplo, existem 4 espaços na saída entre moo
e i
. Da mesma forma, existem 4 caracteres na entrada entre moo
e i
.
O código que faz isso na menor quantidade de caracteres vence.
code-golf
string
balanced-string
beary605
fonte
fonte
((1 2))))))))))3
deve ser inválida se alturas negativas forem proibidas.Respostas:
J,
87797270675756 caracteresRecebe entrada do teclado. Exemplo:
Explicação:
Esta explicação é baseada na primeira versão do meu programa:
x=.1!:1[1
pegue a entrada do teclado e coloque-ax
para mais tarde(('('&([:+/=)-')'&([:+/=))\,.i.@#)
cria uma lista de todos os indeces na string (i.@#
) e costura (,.
) junto com o resultado do(('('&([:+/=)-')'&([:+/=))\
verbo.(('('&([:+/=)-')'&([:+/=))\
este verbo é aplicado a todos os prefixos do string (assim por diante entradahello
seria aplicável parah
,he
,hel
,hell
, ehello
. É um garfo , que conta o número de suportes abertos('('&([:+/=)
e, em seguida, subtrai o número de suportes de perto')'&([:+/=)
. Isso me dá lista de indeces na string e no nível em que o caractere nesse índice deve estar na saída.Em entradas simples, isso me dá o seguinte:((' '$~{.@]),[{~{:@])"1
este é um verbo que pega a lista que acabei de gerar e também a saída de('( ) 'charsub x)
(que apenas substitui uma string para substituir todos os colchetes por espaçosx
). Ele pega o final de cada item da lista{:@]
e o usa como um índice na string para obter o caractere[{~{:@]
. Em seguida, o prefixa,
com o número de espaços, conforme indicado pelo cabeçalho de cada item na lista(' '$~{.@])
. No exemplo anterior, isso me dá:Transponho a matriz
|:
e a inverto|.
para obter a saída desejada.fonte
GolfScript
69Demonstração online aqui .
Explicação:
fonte
APL (59)
Eu assumi que a 'base' precisa ser utilizável também. (ou seja,
(a(b))c(d)
é válido). Se isso não for necessário, dois caracteres podem ser salvos.Explicação:
T←⍞
: armazena uma linha de entrada em T'()'∘=¨T
: para cada caractere em T, veja se é um parêntese de abertura ou fechamento. Isso fornece uma lista de listas de booleanos.1 ¯1∘ר
: multiplique o segundo elemento em cada uma dessas listas por -1 (para que um parêntese de abertura seja 1, um parêntese de fechamento seja -1 e qualquer outro caractere seja 0).+/¨
: pegue a soma de cada lista interna. Agora temos o valor y para cada personagem.P←
: loja em P.R←1++\P
: pegue um total de P, dando a altura para cada personagem. Adicione um a cada caractere para que caracteres fora dos parênteses fiquem na primeira linha.(⍴T)∘⍴¨⍳⌈/R
: para cada valor y possível, faça uma lista contanto que T, consistindo apenas nesse valor. (ou seja, 1111 ..., 2222 ...., etc.)R∘=¨
: para cada elemento nesta lista, veja se é igual a R. (para cada nível, agora temos uma lista de zeros e zeros correspondentes a se um caractere deve ou não aparecer nesse nível).⍵×P=0
: para cada uma dessas listas, defina como zero se P não for zero nesse local. Isso elimina os caracteres com um delta-y diferente de zero, de modo que elimina os parênteses.⊃,/T\¨⍨
: para cada profundidade, selecione T os caracteres que devem aparecer.⊖↑
: crie uma matriz e coloque-a com o lado direito para cima.fonte
Tcl, 50
Tipo de trapaça, mas bem ..
Eu uso seqüências de escape ascii para obter a diferença de linha,
^[[A
significa mover o cursor 1 linha para cima,^[[B
é mover o cursor 1 linha para baixo.fonte
APL, 41 caracteres / bytes *
Testado em Dyalog, com um ambiente
⎕IO←1
e⎕ML←3
. É uma função que pega a entrada necessária e retorna a saída. Dada a redação da pergunta, acredito que seja aceitável. Caso contrário, aqui está uma versão que lê de stdin e grava em stdout, por 4 caracteres a mais:Explicação :
Exemplos:
*: O APL pode ser salvo em uma variedade de conjuntos de caracteres de byte herdados que mapeiam os símbolos do APL para os 128 bytes superiores. Portanto, para fins de golfe, um programa que usa apenas caracteres ASCII e símbolos APL pode ser pontuado como chars = bytes.
fonte
⍨
símbolo. Parece uma combinação dos caracteres¨
e~
?~
e¨
, embora seja um personagem diferente de ambos. É um operador chamado Comutar . Na sua forma dyadic ele inverte os argumentos da função diádica é aplicada a:(5-2)=(2-⍨5)
. Como um operador monádico verifica-se uma função dyadic em monádico, duplicando o argumento direita:(2*2)=(*⍨2)
. É usado principalmente para escrever um fluxo ininterrupto de funções da direita para a esquerda, sem ter que colocar parênteses em torno de grandes expressões e pular os olhos em torno delas. Em golfe é porque útil3*⍨1-2
é um carvão animal inferior a(1-2)*3
:-)~
em J então.J, 56 caracteres
Outra solução J 56 personagens ... Eu conto profundidade, traduzindo
(
em ⁻1,)
em 1 e todos os outros personagens em 0, e em seguida, tomando a soma de execução deste:[: +/\ 1 _1 0 {~ '()'&i.
. O resto é amplamente semelhante à solução de @ Gareth.fonte
Python, 161 caracteres
fonte
Python, 130
fonte
Rubi 1.9 (129)
Lê de stdin.
fonte
//
para o''
que mantém a contagem de caracteres igual e evita o erro no marcador.C, 132 caracteres
A descrição falhou ao especificar quanta entrada a submissão tinha que aceitar para ser aceita, então estabeleci limites que eram mais consistentes com minhas necessidades de golfe (enquanto ainda trabalhava com uma entrada de exemplo). Permita-me aproveitar esta oportunidade para lembrar às pessoas que geralmente é uma boa idéia especificar máximos mínimos nas descrições dos seus desafios.
Existem dois loops principais no código. O primeiro loop gera todos os caracteres que não estão entre parênteses na linha de saída apropriada e o segundo loop imprime cada linha.
fonte
C, 149 caracteres
executar com arg citado, egaout "((1 2) (3 (4 5) meses)) (i (lik (cerejas) e (woohoo)))"
fonte
Oitava, 128
Muito parecido com a minha última resposta ...
Teste
Entrada:
"((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))"
Saída:
fonte
C #, 229 bytes
Se não houver restrição no espaço vertical inicial, você poderá usar isso (recuado para maior clareza.) Inicializará o cursor uma linha abaixo para cada
(
encontrado antes da impressão e, em seguida, moverá o cursor para cima e para baixo à medida que os colchetes forem lidos.fonte
PowerShell ,
120119 bytesExperimente online!
Efeitos colaterais: Chars
&
e'
altera a altura como(
e)
, mas é exibida. Compare resultados para:Menos golfe:
fonte
VB.net (para S&G)
Não é o código mais bonito.
fonte