Arreglar las llaves, etc.

15

Su misión, si elige aceptarla, es agregar el número mínimo de paréntesis, llaves y corchetes para hacer que una cadena dada (que contiene solo paréntesis, llaves y corchetes) tenga la correspondencia correcta entre llaves. Los lazos de símbolos agregados deben romperse teniendo la distancia máxima entre llaves emparejadas. Debe devolver solo una respuesta correcta que coincida con estas dos reglas; Otros vínculos, en caso de que existan, pueden romperse de cualquier forma que lo considere conveniente.

Ejemplos:

input      output
                          // Empty String is a legal input
[          []             // Boring example
[()]       [()]           // Do nothing if there's nothing to be done
({{        ({{}})         // NOT (){}{} (0 + 0 + 0). Maximum distance is 4 + 2 + 0, ({{}})
[([{])]}   {[([{}])]}     // NOT [([])]{[([])]} or similar

Puede escribir un programa o función , recibe la entrada a través de STDIN como un argumento de cadena para su función, que devuelve la salida como una cadena o la imprime en STDOUT (o la alternativa más cercana). Opcionalmente, puede incluir una nueva línea final en la salida.

Puede suponer que la cadena de entrada consta solo de los siguientes 6 caracteres (o falta de ellos): [](){}(No es necesario admitir <>)

Este es el , el programa más corto gana. Las lagunas estándar están prohibidas, por supuesto .

durron597
fuente
¿Querías repetir el título directamente debajo del título real o repetir la etiqueta directamente encima de las etiquetas reales? Solo pregunto en caso de que copie pegado de Sandbox y olvidó eliminarlos.
Rainbolt
@Rainbolt El primero no (sandbox), el último sí
durron597
1
@AlexA. Puedo ver cómo son diferentes en formas menores, pero creo que son demasiado similares para ser consideradas preguntas separadas.
NinjaBearMonkey
Lo suficientemente justo. Ciertamente no está cortado y seco, y no buscaré cerrarlo si otros deciden no hacerlo.
NinjaBearMonkey
Lo consideraría lo suficientemente diferente. Votado para volver a abrir.
nderscore

Respuestas:

1

Python 2 - 198

Tenía la esperanza de obtener algunas de las comprensiones un poco más, pero no tengo mucho tiempo en este momento para probar realmente diferentes formas de hacer las cosas.

s="()[]{}";f=s.find
def F(S):
 r=m=""
 for c in S:
    i=f(c)^1
    if i%2:m=c+m;r+=c
    else:
     for d in m:
        if d==s[i]:break
        r+=s[f(d)^1]
     else:r=s[i]+r+c
     m=m[1:]
 for c in m:r+=s[f(c)^1]
 return r

El OP no incluyó un ejemplo como {[([{}])]}{[(con grupos adyacentes), pero si se requiere o no esta funcionalidad, esto genera el resultado correcto{[([{}])]}{[]}

KSab
fuente
¿Cómo es eso 198 bytes?
Zacharý
@ZacharyT, las pestañas ( \t) se formatean como 4 espacios en el desbordamiento de la pila, pero en realidad estoy alternando pestañas y espacios (puede hacer esto para niveles de sangría en Python 2, no 3), por lo que el primer nivel es el [space]segundo es el [tab]tercero es el [tab][space]cuarto [tab][tab]. Ingresar el código con espacios me da 227 desde aquí mothereff.in/byte-counter , y cuento 10 pestañas así que 227 - (3 * 10) = 197. Huh, supongo que en realidad conté de más por 1 camino atrás cuando publicado esto.
KSab
¡PELIGRO! Ese es un muy buen truco. (Ingrese al final de la línea). Puede combinar el for-loop inferior y la declaración return return r+[s[f(c)^1]for c in m]para guardar bytes.
Zacharý
1

Haskell, 513

La funcion h. La versión anterior no dio respuestas correctas para "({{)["y"({{)}}"

import Control.Monad

m '('=')'
m '['=']'
m '{'='}'
m ')'='('
m ']'='['
m '}'='{'

data B=B Char[B]|N[B]|Z B Char[B]
instance Eq B where(==)a b=q a==q b
instance Ord B where(<=)a b=q a<=q b

w(B o s)=o:(s>>=w)++[m o]
v(N k)=k>>=w
n(B _ k)=(sum$n<$>k)+1
q(N k)=sum$n<$>k

u(Z(Z g pc pk) c k)=Z g pc(pk++[B c k])
u(Z(N pk) c k)=N(pk++[B c k])
t(N k)=N k
t z=t$u z

f z c|elem c "([{"=[Z z c[]]
f z@(Z p o k) c|m c==o=[u z]|2>1=(u$Z(Z p o [])(m c)k):f(u z)c
f (N k)c=[Z(N[])(m c)k]

h s=v.minimum$t<$>foldM f(N [])s
Mate
fuente