Não são algumas perguntas sobre este site sobre o equilíbrio entre parênteses, e verificar se os suportes estão equilibradas. Proponho que agora é hora de usar esses colchetes equilibrados para alguma coisa!
Em matemática e programação, os colchetes são como bolhas, isolando tudo de dentro, forma tudo de fora, para que tudo o que está dentro possa fazer suas coisas em paz e o que estiver fora veja apenas um objeto. No entanto, uma série de colchetes é unidimensional, enquanto as bolhas geralmente são pelo menos bidimensionais. Isso significa que as bolhas são livres para se movimentar, desde que nunca se toquem ou se cruzem entre o interior e o exterior de quaisquer outras bolhas.
Desafio
A entrada é uma sequência de colchetes correspondentes de um único tipo, redondo ()
, quadrado []
, ondulado {}
ou angular <>
. Depende de você o tipo que você deseja que seu programa aceite, e um programa que aceita apenas um único tipo de colchete é aceito. (Bônus imaginário se o seu programa puder lidar com qualquer um deles, pontos de bônus imaginários maciços se ele puder lidar com todos eles na mesma entrada.) A entrada não pode conter nada entre os colchetes, embora espaços em branco à direita sejam permitidos.
A saída é todas as reorganizações possíveis (em ordem arbitrária e incluindo a entrada original) daqueles colchetes que produzem a mesma configuração de bolhas, sem duas seqüências idênticas. Isso significa que, com uma entrada de ()()
, a saída também é justa ()()
, apesar de serem tecnicamente duas bolhas que poderiam trocar de lugar. Para o bônus imaginário maciço, {}[]()
é claro que uma entrada de vontade leva a uma saída de 6 elementos / strings / linhas diferentes.
Duas configurações de bolhas são "iguais" se você puder se transformar uma na outra movendo as bolhas, sem deixar nenhuma bolha passar de dentro de outra bolha para fora dela ou de fora para dentro. Se você comparar parênteses aninhados a árvores (cada par correspondido é um nó e todo par correspondido dentro de um subnó, e cada par correspondido dentro de um subnó desses novamente, e assim por diante) em que os subnós de qualquer nó são ordenados , uma única configuração de bolhas é uma árvore na qual os nós não são ordenados.
Qualquer formato de saída razoável funcionará, como retornar uma lista de cadeias de caracteres ou uma lista de caracteres únicos ou uma única string com algum tipo de espaço em branco ou imprimir em stdout
ou stderr
com alguma forma de caractere visível do espaço em branco (geralmente nova linha ou espaço) entre cada reorganização.
Espaços finais para cada reorganização e linhas novas / elementos à esquerda e à lista vazias anteriores e anteriores à saída real são permitidas. Você deve usar o mesmo tipo de colchetes na saída que aceita na entrada. Além dos colchetes, das novas linhas e dos espaços especificados aqui, e do separador usado, nada deve ser impresso (incluindo caracteres invisíveis / largura zero).
A pontuação é o número de bytes no código; a contagem mais baixa para cada idioma vence. Você pode observar se recebe um bônus imaginário, regular ou massivo, mas isso não afeta sua pontuação. Os bônus reais são muito difíceis de equilibrar corretamente.
Exemplos de entrada e saída
Exemplo 1:
Entrada:
()(())
Saída:
()(())
(())()
Exemplo 2:
Entrada:
(()())()()
Saída:
(()())()()
()(()())()
()()(()())
Exemplo 3:
Entrada:
(()(()))()
Saída:
((())())()
()((())())
(()(()))()
()(()(()))
((()))
no exemplo 1? ou()()()
? Parece que faltam permutações para cada entrada.Respostas:
CJam , 18 bytes
Experimente online!
-2 graças ao Business Cat .
Recebe entrada como uma string contendo apenas
[]
. Retorna uma lista de permutações (listas vazias são iguais às cadeias vazias no CJam, portanto, em vez de[]
você obter""
).fonte
[][]
justa""
? - A entrada deve ser incluída em um conjunto extra de[]
? Se sim, por que existe um conjunto extra de em[]
torno do que (talvez?) É a saída para o exemplo mencionado acima? Além disso, a pergunta diz: "Você deve usar o mesmo tipo de colchetes na saída que aceita na entrada. Além dos colchetes, das novas linhas e dos espaços especificados aqui, e do separador usado, nada deve ser impresso", então eu ' Não tenho certeza de que uma mistura de[]
e""
é aceitável.[][]
um par extra de[]
. Para os outros, não tenho certeza se são inválidos._{{B}%e!}&
vez de_!!{{B}%e!}*
&
Curto-circuito ou algo assim?&
executa o bloco apenas se o outro valor for verdade #Haskell ,
227210208205 bytesExperimente online!
Este foi difícil!
Jogou um pouco de golfe
Economizou dois bytes graças a Laikoni
Economize dois bytes graças a Bruce Forte
Não tenho certeza se isso funciona em todos os casos. Algumas explicações:
a!x
adicione a Stringx
à última lista de String ema
(a é do tipo[[String]]
)snd$foldl(\(a,r)x->if x=='('then(a+1,last$(r++[[]]):[r!x|a>0])else(a-1,last$r:[r!x|a>1])
usa a condicional mais curta para expressar a idéia simples: divida uma String na raiz)(
s. Por exemplo,"(()(()))()"
dá["()(())", ""]
.Precisamos processar cada parte da divisão e, em seguida, reunir e juntar todas as strings para obter a saída correta:
h
processa uma lista de partes: aplica-sev
à primeira parte e combina o resultado ao processo das partes restantes.v
agrega os resultados para cada permutação das partes e remove as duplicatas.Para adicionar uma visão mais ampla: você tem basicamente uma árvore (não uma binária) com nós vazios. Deixe são
()
. É necessário produzir todas as permutações dos ramos para cada nó, mas você não pode pegar um ramo de um nó e colocá-lo em outro nó. Eu fiz uma espécie de profundidade primeira pesquisa.fonte
init a
.Python 2,
353350331 bytesRecebe a string
()
como entrada e imprime o resultado.Experimente aqui!
Evitei usar
itertools.permutations
com a ajuda da resposta de Paolo a esta pergunta .Obrigado ao Business Cat por encontrar 3 bytes e obrigado ao Sr. Xcoder por incríveis 19 bytes!
Explicação
()
par na sequência de entrada.()
par.fonte
print
e em locais comoi+1 if
(poderia seri+1if
). Também em um ponto que você temy[0:i]
, você pode omitir a 0.JavaScript (Firefox 30-57), 222 bytes
Toma
[]
seqüências de caracteres. Explicação:fonte
Mathematica, 337 bytes
Não para obter pontos de código-golfe, mas para mostrar o uso
Permutations
eDistribute
neste problema. Pode haver abordagens melhores, no entanto.(
seq
: sequência,:alt
alternativas)Tome entrada como uma string, usando colchetes
{
e}
. Saída de uma seqüência de linhas múltiplas.fonte