Considere uma sequência não vazia de parênteses corretamente balanceados:
(()(()())()((())))(())
Podemos imaginar que cada par de parênteses representa um anel em uma construção telescópica em colapso . Então, vamos estender o telescópio:
( )( )
()( )()( ) ()
()() ( )
()
Outra maneira de ver isso é que os parênteses na profundidade n são movidos para a linha n , mantendo sua posição horizontal.
Sua tarefa é pegar uma série de parênteses equilibrados e produzir a versão estendida.
Você pode escrever um programa ou função, obtendo entrada via STDIN (ou equivalente mais próximo), argumento da linha de comando ou parâmetro de função e produzindo saída via STDOUT (ou equivalente mais próximo), valor de retorno ou parâmetro de função (saída).
Você pode assumir que a sequência de entrada é válida, ou seja, consiste apenas de parênteses, que estão corretamente equilibrados.
Você pode imprimir espaços à direita em cada linha, mas não mais espaços à esquerda do que o necessário. No total, as linhas não devem exceder o dobro do comprimento da sequência de entrada. Opcionalmente, você pode imprimir uma única nova linha à direita.
Exemplos
Além do exemplo acima, aqui estão mais alguns casos de teste (entrada e saída são separadas por uma linha vazia).
()
()
(((())))
( )
( )
( )
()
()(())((()))(())()
()( )( )( )()
() ( ) ()
()
((()())()(()(())()))
( )
( )()( )
()() ()( )()
()
Desafios relacionados:
- Topographic Strings , que solicita que você produza o que é essencialmente o complemento da saída nesse desafio.
- Code Explanation Formatter , uma ampla generalização das idéias nesse desafio, publicada recentemente pela PhiNotPi. (De fato, a descrição original de PhiNotPi de sua ideia foi o que inspirou esse desafio.)
Classificação
Huh, isso teve muita participação, então aqui está um snippet de pilha para gerar um placar regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=49042;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
Respostas:
CJam,
171615 bytesO acima é um despejo xxd reversível, pois o código-fonte contém os caracteres não imprimíveis VT (0x0b) e CSI (0x9b).
Como esta resposta , ele usa seqüências de escape ANSI , mas também usa guias verticais e imprime os caracteres de controle diretamente para evitar o uso de printf .
Isso requer um terminal de texto de vídeo de suporte, que inclui a maioria dos emuladores de terminal não Windows.
Execução de teste
Temos que definir a variável de shell LANG e a codificação do emulador de terminal para ISO 8859-1. O primeiro é alcançado executando
Além disso, antes de executar o código real, desativaremos o prompt e limparemos a tela.
Isso garante que a saída seja mostrada corretamente.
Para restaurar o LANG e o prompt, execute o seguinte:
Como funciona
Nós inserimos uma guia vertical após cada um ( para mover o cursor para baixo e a sequência de bytes 9b 41 (
"\x9bA"
) antes de cada ) para mover o cursor para cima.fonte
código de máquina x86,
39.34333029 bytesmontagem x86 para DOS, com alguns truques:
Limitações :
cls
antes da execução é quase obrigatório;bh=0
e o sinalizador de direção é limpo no início, ambos não documentados; OTOH,bx
é explicitamente definido como zero em todas as variantes do DOS que eu vi (DosBox, MS-DOS 2, FreeDOS) e em todos os lugares que testei, os sinalizadores já estavam OK.fonte
cld
?add
/sub
.lop
paraloop
?nasm
desambigua entreloop
como um rótulo eloop
a instrução de montagem, então apenas escrevolop
como todo mundo faz.J,
3228 bytesEssa foi engraçada.
Explicação
É assim que esta solução funciona, incluindo uma explicação de como foi jogada no golfe.
fonte
:')
C, 150 bytes
Este foi louco divertido de golfe. Ainda não estou convencido de que acabei com isso.
Definimos uma única função
f
,, que leva a string como entrada e sai para stdout.Vamos analisar o código, linha por linha:
Vou responder a qualquer pergunta que você possa ter!
Experimente um programa de teste online !
fonte
f
,m
não seria redefinido para 0. Isso conta como "quebrar seu ambiente", proibido aqui .Retina + Bash, 27 bytes (14 + 10 + 3 = 27)
Isso faz uso de ANSI Escapes:
Equivalente a
sed -e "s/(/(\\\e[B/g;s/)/\\\e[A)/g"
. O\e[B
código de escape significa mover o cursor para baixo uma linha e o\e[A
meio mover o cursor para cima uma linha, portanto, esta solução simplesmente insere esses códigos antes e antes do início e do fim de cada par de parênteses aninhados. A entrada é passada pelo STDIN.Você terá que chamá-lo
printf $(Retina ...)
para ver a saída corretamente.Resultado
fonte
printf
seria ótimo. Caso contrário, acho que seria justo adicionar| printf
à contagem de bytes.printf $()
ouprintf $(Retina )
.\e
maisprintf
? Você pode simplesmente colocar os caracteres de controle no padrão de substituição.TI-BASIC,
69 60 5655 bytesIsto é para a família de calculadoras TI-83 + / 84 +, embora tenha sido escrita em uma edição 84+ C Silver Edition.
O programa aparece como maior no cálculo devido à inclusão de informações de tamanho + IVA. Além disso, existem mais de 56 caracteres aqui; o motivo é 56 bytes, porque todos os comandos com mais de um caractere são compactados em tokens com tamanho de um ou dois bytes.
Raspou outro byte graças a thomas-kwa ! (também dele foi o salto de 60 para 56.)
fonte
cos(piAns
truque para salvar outro byte.Python 2, 115 bytes
Ligue como
f("((()())()(()(())()))")
, e a saída será STDOUT.Explicação
Começamos com
n = 0
. Para cada caractere na linha de entrada:(
, acrescentamosn
espaços e aumentamosn
)
, diminuímosn
e acrescentamosn
espaçosO resultado é compactado e impresso. Observe que o
zip
zip do Python corresponde ao comprimento do elemento mais curto , por exemploNormalmente, usaria-se
itertools.zip_longest
(izip_longest
) se quisessemzip
preencher o comprimento do elemento mais longo .Mas no Python 2, esse comportamento pode ser simulado pelo mapeamento
None
:Python 3, 115 bytes
Sem fechar, apenas preenchendo adequadamente
ljust
. Este parece ter algum potencial de golfe.fonte
R,
151127 caracteresCom recuos e novas linhas:
Uso:
Ele lê a string como stdin, a divide como um vetor de caracteres únicos, calcula a soma acumulada de
(
e)
subtrai a primeira com a segunda (com um atraso), calculando assim o "nível" de cada parêntese. Em seguida, imprime em stdout, para cada nível, os parênteses correspondentes ou um espaço.Agradeço ao @MickyT por me ajudar a reduzi-lo consideravelmente!
fonte
for(i in n)cat(ifelse(D[i]-j," ",S[i]));cat("\n")
porX=S;X[which(D!=j)]=' ';cat(X,sep='',fill=T)
. Entãon
não é realmente necessário, mas você precisará alterar um pouco a parte do cumsum.D=c(C(S=="("),0)-c(0,C(S==")"));
trazê-lo para baixo para 135.which
aqui não é realmente necessário (D!=j
já sendo um vetor de booleanos que permite a indexação). Eu não sabia o argumentofill
decat
que é um truque bacana! Obrigado por me fazer abreviá-lo com 24 caracteres surpreendentes !!C,
58 53 52 5149 bytesUtiliza seqüências de escape ANSI para mover a posição do cursor.
Se não estiver usando o gcc ou outro compilador compatível
\e
, ele poderá ser substituído\x1B
por um total de 2 bytes extras.\e[A
move o cursor para cima uma linha e\e[B
move o cursor para baixo uma linha. Não é necessário usar\e[B
para mover uma linha para baixo, pois são dois bytes mais curtos para usar o caractere de tabulação vertical ASCII0xB
ou\v
.A sequência de entrada é assumida, a partir da pergunta, como composta apenas entre parênteses (balanceados), portanto, verificar a paridade do caractere com
&1
é suficiente para distinguir entre(
e)
.fonte
Pip, 53 bytes
Pip é uma linguagem de código-golfe da minha invenção. A primeira versão foi publicada no sábado, para que eu possa oficialmente dar uma volta! A solução abaixo não é tão competitiva quanto os idiomas de golfe, mas isso se deve em parte ao fato de ainda não ter implementado coisas como zip e max.
Espera a sequência de parênteses como um argumento da linha de comandos.
Versão "Ungolfed":
Explicação:
Ao contrário da maioria das linguagens de golfe, o Pip é imprescindível para os operadores de infix, portanto a sintaxe é um pouco mais próxima do C e de seus derivados. Também empresta idéias da programação funcional e baseada em array. Veja o repositório para mais documentação.
O programa primeiro gera uma lista de profundidades (armazenando-a
z
) mapeando uma função para a sequência de entradaa
. A variável globalv
rastreia o nível atual. (Variáveisa-g
no Pip são variáveis de função local, mash-z
são globais.v
É útil porque é pré-inicializado para -1.)Em seguida, usamos um
W
loop hile para gerar e imprimir cada linha, até a linha gerada consistir em todos os espaços.v
agora é usado para colunas ei
linhas. A{z@++v=i?as}
função, mapeada repetidamente para a sequência de entrada original, testa se a linha atuali
corresponde à linha em que o parêntese atual deve estar (como armazenado naz
lista). Nesse caso, use o parêntese (a
); caso contrário, uses
(pré-inicializado para o espaço). O resultado final é que, em cada iteração,o
é atribuída uma lista de caracteres equivalente à próxima linha da saída.Para testar se devemos continuar fazendo loop, verificamos se
o
todos os espaçosRM
'd estão vazios. Caso contrário, imprima-o (que por padrão concatena tudo junto como no CJam), redefina o número da coluna para -1 e aumente o número da linha.(Curiosidade: inicialmente, eu tinha uma solução de 51 bytes ... que não funcionou porque ocorreu um erro no intérprete.)
fonte
Pitão, 31 bytes
Experimente online.
-/<zk\(/<zhk\)
: Encontra o nível apropriado para a posição atual do caractere.?YqN-/<zk\(/<zhk\)d
: Um espaço se o nível apropriado não for o nível atual, caractere atual caso contrário.Js.e?YqN-/<zk\(/<zhk\)dz
: Gere a string, salve-a emJ
.I-JdJ
: SeJ
não houver todos os espaços, imprima-os.Vz
:z
Tempos de loop .fonte
GNU Bash + coreutils + travessão, 135
Entrada / saída via STDIN / STDOUT:
indent
faz a maior parte do trabalho pesado, mas precisa trabalhar com aparelho em vez de parênteses. O resto é modificação desta resposta para transpor a saída deindent
.fonte
Python 2, 92
Imprime linha por linha. Para um determinado número de linha
i
(na verdade, sua negação), passa pela sequência de entradas
e cria uma nova sequênciaz
que contém apenas os caracteres des
profundidadei
. Isso é feito incrementando ou decrementandoi
para rastrear a profundidade atual e adicionando os caracteres atuais quandoi
é0
ajustado para o tipo de parênteses e adicionando um espaço.Em seguida, imprime e retorna para a próxima
i
, a menos que a linha atual tenha todos os espaços. Observe que, como as parênteses são equilibradas, oi
loop posterior é o mesmo que no início.Python 3 seria o mesmo, exceto por um caractere
print(z)
.fonte
trapaça :(
Retina + TeX, N bytestrapaça :(Isso só funciona se você renderizar (?) A saída usando MathJax ou algum outro TeX, que está atualmente desativado para este SE :(
Cada linha deve estar em um arquivo diferente, mas você pode testá-lo usando
Retina -e "\(" -e "({" -e "\)" -e "})" -e "\{\(" -e "_{("
(ou o comando sed equivalentesed -e "s/(/({/g;s/)/})/g;s/{(/_{(/g"
). A entrada é passada pelo STDIN.Isso funciona colocando o conteúdo de cada par de parênteses entre chaves e depois inscrevendo todos os itens dentro deles.
Resultado
fonte
In total the lines must not be longer than twice the length of the input string
. Alterando a linha 2 para(\,{
e da linha 4 para}\,)
significa que a saída se encaixa nesta (embora a profundidade vertical ainda está errado: ()Java,
232226224222 bytesVersão Golfed:
Versão longa:
A string de entrada é analisada primeiro, procurando "(" e ")" para adicionar / subtrair um contador e armazenar seu valor, determinando a que distância os parênteses devem ir em uma matriz, além de acompanhar o quão profundo é o mais profundo. Então a matriz é analisada; os parênteses com valores menores são impressos primeiro e continuarão imprimindo linha por linha até atingir o máximo.
Provavelmente vou encontrar maneiras de jogar isso ainda mais tarde.
fonte
Javascript / ES6, 97 caracteres
Uso
Explicação
fonte
n<m?console.log(o):0
, você pode usar on<m&&console.log(o)
que salva 1 byte.CJam,
43 4136 bytesNão sou muito jogador de golfe (acho), mas aqui vai minha primeira tentativa:
Como funciona
Eu estou usando o fato muito útil de que
)
e(
no CJam significam incremento e decremento, respectivamente. Assim, eu simplesmente avalio os colchetes para obter a profundidade.Experimente online aqui
fonte
Oitava, 85 caracteres
É uma otimização da abordagem ingênua, o que é realmente bastante natural para o Matlab e o Octave:
A tabela
t
talvez ainda não exista, e podemos atribuir a qualquer elemento imediatamente, e é remodelada para a menor dimensão necessária para a existência desse elemento, o que é bastante conveniente.fonte
Perl,
918988848079 bytesfonte
Haskell, 154 bytes
mesma idéia que a outra solução Haskell, mas um pouco menor. - Uso:
fonte
J, 46
Não é tão bom quanto as outras "línguas do golfe", mas em minha defesa: J é péssimo com as cordas.
Toma a string como entrada para uma função. Provavelmente também há uma maneira melhor de fazê-lo em J.
Uso:
fonte
Ruby,
119115114Explicação:
fonte
Java,
233214 bytesRecuado:
Acho que o ciclo final pode ser encurtado, mas deixarei como um exercício para o leitor. ;-)
Antigo, 233 bytes de resposta:
Recuado:
fonte
for(x=0;x<l*l;x++)System.out.print((x%l==0?"\n":"")+m[x]);
parafor(x=0;x<l*l;)System.out.print((x%l==0?"\n":"")+m[x++]);
para -1 byte. Além disso, você pode salvar mais 2 bytes removendop=x=0
e apenas usandoint p=0,x=0,
na inicialização dos campos. No total, torna-se 211 bytes .C #, 195 bytes
Primeiro tente jogar golfe - grite se fiz algo errado.
Versão alternativa do C # usando SetCursorPosition e trabalhando da esquerda para a direita, recebendo a entrada como um argumento de linha de comando.
Eu pensei que seria divertido ajustar a posição de gravação com base no paren abrir / fechar e não nas linhas completas. Fechar paren move a posição para cima antes de escrever; paren aberto move-o para baixo após a gravação. A ação SetCursorPosition salva cinco bytes. Mover o cursor para a próxima linha após a saída levaria um pouco mais.
fonte
Lote,
356335 bytesEu sei que já existe uma solução em lote para esse desafio, mas essa é significativamente maior e parece ter uma abordagem diferente. Mais importante ainda, a outra solução em lote contém pelo menos um comando powershell; Esta solução não.
Há um caractere de backspace (
U+0008
) na penúltima linha após o ponto (linha 12, coluna 57). Isso não é visível no código postado aqui, mas está incluído na contagem de bytes.fonte
Lote, 424 bytes
Sem golfe:
Exemplo:
fonte
C,
118117 bytesOutra resposta em C, mas a minha é mais curta.
Versão não destruída:
E funciona!
fonte
putchar(c-d?32:*p)
é um caractere menor queputchar(c==d?*p:32)
.Haskell, 227 bytes
fonte
n#[]
vez dem n []
.Perl, 76 bytes
Não
use strict
aqui :)fonte
Lex, 94 bytes
Depende dos códigos do console Linux. Com o gcc, você pode cortar quatro bytes substituindo as duas instâncias
\33
por um caractere de escape real.Para compilar e executar:
fonte