Existem suportes disfarçados?

12

Alguém nos deu uma sequência, mas todos os caracteres parecidos com colchetes foram transformados em caracteres normais, e não sabemos quais, nem mesmo quantos eram. Tudo o que sabemos é que, se houvesse L1,L2,L3,...,LNdiferentes tipos de colchetes à esquerda e R1,R2,R3,...,RNdiferentes tipos correspondentes de colchetes à direita, todos sendo distintos (2N caracteres de colchete distinto), uma sequência seria válida se for uma das (+ é concatenação normal da sequência):

  • L1+X+R1,, L2+X+R2...,, LN+X+RNonde Xé uma sequência válida,

  • X+Y, onde Xe Ysão cadeias válidas,

  • Qualquer caractere único que não seja um colchete.

  • A cadeia vazia

Sabemos que eles começaram com uma sequência válida antes de alterar os colchetes e não os transformaram em caracteres que já existiam na sequência. Também havia pelo menos um par para cada suporte. Você pode reconstruir quais caracteres foram originalmente pares de colchetes esquerdo e direito (encontre as seguintes condições Lie Risiga-as)?

Saída dos pares de caracteres entre colchetes. Por exemplo, se (){}[]realmente houver caracteres entre colchetes, você pode enviar (){}[]ou {}[]()ou [](){}etc. Pode haver várias maneiras de fazer isso para uma sequência, basta retornar uma para que não haja atribuição de colchetes com mais pares (consulte exemplos). Observe que a cadeia de saída sempre deve ter um comprimento uniforme.

Exemplos:

abcc- cnão pode ser um colchete, pois não há outro caractere com duas ocorrências, mas abpode ser um par de colchetes, portanto, você produziria exatamente ab.

fffff - qualquer string com no máximo um caractere não pode ter colchetes; portanto, você retornaria a string vazia ou não produziria nada.

aedbedebdcecdec - essa sequência não pode ter colchetes porque há 1 a, 2 bs, 3 cs, 4 ds e 5 es, portanto, dois caracteres não ocorrem o mesmo número de vezes, o que é um requisito para ter colchetes.

abcd- possíveis atribuições são ab, cd, abcd, cdab, adbc, bcad, ac, ad, bce bd, (bem como a atribuição vazio, o que todos eles têm), mas você deve retornar uma das atribuições mais longas, então você deve retornar abcd, cdab, adbc, ou bcad.

aabbcc, abc- estes dois temos ab, ace bccomo pares válidos. Você deve retornar um desses pares, não importa qual.

abbac- aeb têm a mesma contagem de caracteres, mas na verdade não podem funcionar, pois um deles ocorre à esquerda e à direita de todas as ocorrências da outra. Não devolva nada.

aabcdb- cde absão os dois pares exatos de colchetes, portanto, produzam um cdabou outro abcd.

abcdacbd- apenas um par pode ser alcançada de uma vez, mas ab, ac, bd, cd, e adsão todos os possíveis pares você pode retornar. Não importa qual par você escolher, ele tem um caso em que um único outro personagem está dentro dele, que proíbe quaisquer outros pares, exceto no caso de ad, onde os outros pares bce cbnão são possíveis sozinho, quer, e por isso não pode ser possível com ad.

Este é o código golf, pelo que o código mais curto em bytes vence. A entrada é de STDIN, se possível, para o seu idioma. Se não for possível, indique o método de entrada na sua resposta.

Melão Fricativo
fonte
1
para entrada abcd, a saída adbctambém seria aceitável, certo?
Patrick Roberts
Sim, eu adicionei ao exemplo.
Fricative Melon

Respostas:

4

Ruby, 373 bytes

i=gets.chomp
b=[*(i.chars.group_by{|x|x}.group_by{|x,y|y.size}.map{|x|s=x[1].size
x[1][0...s-s%2].map{|x|x[0]}*''}*'').chars.each_slice(2)]
puts [*[*b.size.downto(1).map{|n|b.combination(n).map{|t|[t*'',(h=Hash[t]
s=[]
o=1
i.each_char{|c|s.push(c)if h.keys.include?c
(o=false if s.empty?||!h[s.pop].eql?(c))if h.values.include?c}
o ?s.empty?: o)]}}.find{|x|x[0][1]}][0]][0]

Isso usa uma versão em golf do analisador de pilha aqui .

Provavelmente pode ser mais simplificado, mas acho que meu cérebro não aguenta mais.

Todos os casos de teste: http://ideone.com/gcqDkK

Com espaço em branco: http://ideone.com/pLrsHg

Ungolfed (principalmente): http://ideone.com/oM5gKX

Desafio gelado
fonte