¿Hay corchetes disfrazados?

12

Alguien nos ha dado una cadena, pero todos los caracteres parecidos a corchetes se han cambiado a los normales, y no sabemos cuál, o incluso cuántos, había. Todo lo que sabemos es que si L1,L2,L3,...,LNfueran diferentes tipos de corchetes izquierdos y R1,R2,R3,...,RNfueran diferentes tipos correspondientes de corchetes derechos, todos ellos distintos (2N caracteres de corchetes distintos), una cadena sería válida si es uno de (+ es la concatenación de cadena normal):

  • L1+X+R1, L2+X+R2, ..., LN+X+RN, donde Xes una cadena válida,

  • X+Y, donde Xy Yson cadenas válidas,

  • Cualquier carácter único que no sea un carácter de paréntesis.

  • La cadena vacía

Sabemos que comenzaron con una cadena válida antes de cambiar los corchetes, y no los cambiaron a ningún carácter que ya existiera en la cadena. También existía al menos un par para cada soporte. ¿Puedes reconstruir qué caracteres eran originalmente pares de paréntesis izquierdo y derecho (encuentra las siguientes condiciones Liy las Risiguientes)?

Salida de los pares de caracteres que fueron corchetes. Por ejemplo, si (){}[]en realidad fueron entre paréntesis caracteres, es posible que la salida (){}[]o {}[](), o [](){}, etc. Puede haber varias maneras de hacer esto para una cadena, solo tiene que devolver uno de tal manera que no hay una asignación de soporte con más pares (ver ejemplos). Tenga en cuenta que la cadena de salida siempre debe tener una longitud par.

Ejemplos:

abcc- cno puede ser un paréntesis, ya que no hay otro carácter con dos ocurrencias, pero abpuede ser un par de paréntesis, por lo que se generará exactamente ab.

fffff - cualquier cadena con un carácter como máximo no puede tener corchetes, por lo que devolvería la cadena vacía o no generaría nada.

aedbedebdcecdec - esta cadena no puede tener corchetes porque hay 1 a, 2 bs, 3 cs, 4 ds y 5 es, por lo que no hay dos caracteres el mismo número de veces, lo cual es un requisito para tener corchetes.

abcd- asignaciones posibles son ab, cd, abcd, cdab, adbc, bcad, ac, ad, bcy bd, (así como la asignación de vacío, que todos ellos tienen), pero debe devolver una de las tareas más largas, por lo que debe regresar abcd, cdab, adbc, o bcad.

aabbcc, abc- estos dos tienen ab, acy bccomo pares válidos. Debe devolver uno de estos pares, no importa cuál.

abbac- ayb tienen el mismo número de caracteres, pero en realidad no pueden funcionar, ya que uno de ellos ocurre tanto a la izquierda como a la derecha de todos los sucesos del otro. No devuelvas nada.

aabcdb- cdy abson los dos pares de paréntesis exactos, por lo tanto, imprima cdabo abcd.

abcdacbd- sólo un par se puede lograr a la vez, pero ab, ac, bd, cd, y adson todos los pares posibles que puede devolver. No importa qué par elijas, tiene una instancia en la que hay un único personaje dentro de él, lo que prohíbe cualquier otro par, excepto en el caso de adque los otros pares bcy cbtampoco sean posibles solos, por lo que no puede ser posible con ad.

Este es el código de golf, por lo que gana el código más corto en bytes. La entrada es de STDIN si es posible para su idioma. Si no es posible, indique el método de entrada en su respuesta.

Melón Fricativo
fuente
1
para la entrada abcd, la salida adbctambién sería aceptable, ¿verdad?
Patrick Roberts el
Sí, lo he agregado al ejemplo.
Melón fricativo

Respuestas:

4

Rubí, 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]

Esto usa una versión de golf del analizador de pila aquí .

Probablemente se pueda simplificar aún más, pero no creo que mi cerebro pueda soportar más.

Todos los casos de prueba: http://ideone.com/gcqDkK

Con espacios en blanco: http://ideone.com/pLrsHg

Sin golf (principalmente): http://ideone.com/oM5gKX

Desafío helado
fuente