Suportes normais ( ()
, []
, <>
e {}
) são agradáveis e inequívoca, no entanto alguém pensou que seria uma boa idéia usar caracteres não suporte como suportes. Esses caracteres |
e "
são ambíguos. Por exemplo,
""""
Corresponde a
(())
ou
()()
É impossível dizer.
As coisas começam a ficar interessantes quando você mistura tipos de colchetes ambíguos, por exemplo
"|""||""|"
Pode ser um dos seguintes
([(([]))]),([()[]()]),([()][()])
Tarefa
Sua tarefa é pegar uma sequência de caracteres ambíguos e gerar todas as sequências equilibradas possíveis que o autor poderia ter pretendido.
Mais concretamente, você produz todas as cordas balanceadas que podem ser feitas substituindo |
por um [
ou outro ]
e "
por um (
ou outro )
. Você não deve emitir nenhuma string balanceada duas vezes.
IO
Como entrada, você deve usar uma string composta por |
e "
. Se você gostaria de selecionar outros de dois personagens distintos |
e "
para servir como substitutos você pode fazê-lo. Você deve produzir um contêiner de cadeias equilibradas. Você pode optar por substituir []
e ()
na saída com outros dois pares de suporte ( ()
, []
, <>
ou {}
) que você deseja. Seu formato de saída deve ser consistente entre as execuções.
Pontuação
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
Casos de teste
"" -> ["()"]
"|"| -> []
||| -> []
"""" -> ["(())","()()"]
""|| -> ["()[]"]
"|"||"|" -> ["([([])])"]
"|""||""|" -> ["([(([]))])","([()[]()])","([()][()])"]
fonte
Respostas:
Python 2 , 135 bytes
Experimente online!
Espera entrada como em
2002
vez de"||"
, e entre aspas.Repete todas as 2 N atribuições possíveis de "aberto" e "fechado" para a sequência, criando sequências
c
como:Se
eval
-ing esta sequência de caracteres lança uma exceção, é incomparável. Caso contrário, imprimimosc[::2]
, dando:fonte
Retina ,
595655 bytesExperimente online! Infelizmente, o teste para dois conjuntos de colchetes correspondentes excede a capacidade de golfe de um único regex .NET, portanto, ele economiza 15 bytes para verificação manual. Editar: Salvo
34 bytes graças a @ H.PWiz. Explicação:Encontre ae
"
faça duas cópias da linha, uma com a<
e outra com a>
. Faça isso de"
cada vez, para que cada"
dobre o número de linhas.Da mesma forma com
'
,{
e}
. Então, mantenha substituindo até que todos os"
s e'
todas as cópias tenham sido substituídos.Faça uma duplicata dos colchetes, separados por um
_
.Na duplicata, exclua repetidamente os colchetes correspondentes, até não sobrar nenhum; nesse caso, exclua
_
também.Exclua todas as linhas que ainda possuem a
_
.Retina ,
747170 bytesExperimente online! Explicação: Os dois primeiros estágios são os descritos acima. O terceiro estágio imprime diretamente o resultado da correspondência de dois conjuntos de colchetes correspondentes. Isso usa grupos de balanceamento do .NET. Em cada estágio da partida, o regex tenta combinar um caractere, depois procura um par de colchetes correspondentes e depois verifica se a parte superior da pilha corresponde ao colchete aberto. Se isso puder ser feito, significa que o suporte se equilibra e o suporte aberto é retirado da pilha. Caso contrário, a suposição é que estamos em um colchete aberto que precisa ser empurrado para a pilha. Se essas suposições não se mantiverem, a pilha não ficará vazia no final e a partida falhará.
Abordagem alternativa, também
7471 bytes:Aqui, olhamos à frente para
<
...>
ou{
...}
, depois olhamos para trás para empurrar o suporte de fechamento para a pilha. Caso contrário, precisamos corresponder e colocar o colchete de fechamento que capturamos anteriormente. Nesta versão, o regex pode até não chegar ao final da string, mas algumas strings como as<<<>
que passam pela rede se não verificássemos uma pilha vazia.fonte
|
a entradaCasca , 19 bytes
Experimente online! Usa os caracteres
ds
na entrada e os pares de colchetes correspondentesde
est
na saída.Explicação
A idéia é gerar todos os suportes possíveis da entrada e manter aqueles que se reduzem à cadeia vazia quando removemos repetidamente os colchetes adjacentes. A
¨÷₂¨
é uma sequência compactada que se expande para a"dest"
qual foi escolhida porque possui uma forma compactada curta e consiste em pares de caracteres com pontos de código adjacentes. Assim, o programa é equivalente ao seguinte.fonte
Perl,
565553 bytesInclui
+1
paran
usa
[
para[]
e{
para{}
Gera todas as possibilidades de 2 ^ N e usa perl
eval
para verificar se uma string como '+ [+ {}]' é um código válido e, se assim for, remove o+
e imprime o resultadofonte
APL (Dyalog Classic) ,
5553 bytesExperimente online!
fonte
Limpo ,
203186179 bytesExperimente online!
Usa apenas correspondência e compreensão de padrões.
fonte
Perl, 56 bytes
Inclui
+
paran
Usa entrada
[
para saída[
ou]
Usa entrada
{
para saída{
ou}
Usa uma expressão regular perl estendida para combinar chaves, acompanhando as escolhas feitas durante o retorno. Isso pode ser muito mais eficiente do que gerar todos os candidatos 2 ^ N, já que ele já rejeita muitas atribuições impossíveis enquanto está no meio da string de entrada
fonte
Kotlin ,
240236234 bytesEmbelezado
Teste
Editar% s
true
->1>0
e== 0
->< 1
fonte
C (gcc) , 315 bytes
Experimente online!
C (gcc) , 334 bytes (versão antiga)
Experimente online!
Explicação (versão antiga)
Experimente online!
fonte
*s++
em alguns lugares.char S[n],*s=S
ainda é mais curto do quechars*s=calloc(n,1)