Eres un gerente de proyecto. Un día, uno de sus programadores se volvió loco ( no es su culpa ) y tomó todas las expresiones en la base de código y agregó corchetes al azar, antes de abandonar en el acto, despotricando sobre su incompetencia ( tampoco es su culpa ). Sin embargo, esta sería una solución fácil, por alguna razón no está utilizando el control de revisión ( no es su culpa ). Y por alguna razón, ninguno de los otros programadores quiere pasar por cada expresión para arreglar los corchetes no coincidentes ( por cierto, eso no es tu culpa ). Programadores en estos días, piensas para ti mismo. Tendrás que hacerlo tú mismo. ¡El horror! Se suponía que tales tareas estarían debajo de ti ...
La entrada será una sola línea, que contendrá una serie de corchetes izquierdos ( ( [ {
) y corchetes derechos ( ) ] }
). También puede, pero no siempre, contener comentarios ( /* */
) y literales de cadena ( " "
o ' '
) y varios números, letras o símbolos.
Habrá al menos un paréntesis (fuera de un comentario o literal de cadena) que no tenga un opuesto de corrosión (fuera de un comentario o literal de cadena). Por ejemplo, un errante }
sin un {
previo. Otro ejemplo: un (
que no tiene un )
después. Su programa reemplazará con un espacio el número mínimo de paréntesis necesarios para que coincidan los paréntesis.
Ejemplos:
(4 + (2 + 3))]
==> (4 + (2 + 3))
(el corchete al final)
][][[]]
==> [][[]]
(el corchete al comienzo)
("Hel(o!"))
==> ("Hel(o!")
(el paréntesis al final)
( /* )]*/
==> /* )]*/
(el paréntesis al comienzo)
{()]
==> ()
(el corchete y el corchete)
- La entrada se puede tomar de la forma más conveniente (STDIN, argumento de línea de comando, lectura de un archivo, etc.)
- Si hay más de una forma de resolver la falta de coincidencia con el mismo número de eliminaciones, es aceptable.
- Solo habrá desajustes entre paréntesis. Los literales de cadena y los comentarios siempre se formarán correctamente.
- El título proviene de este hilo SO
- Nunca habrá citas en comentarios, citas en citas, comentarios en comentarios o comentarios en citas.
Este es el código de golf, por lo que gana el número mínimo de bytes. Haga preguntas en los comentarios si la especificación no es clara.
fuente
("foo (\") bar")
)?{{(})
debería ser{ }
o equivalente, ya que el escenario de apertura implica que el código estaba funcionando para empezar, y{(})
cuenta como paréntesis no coincidentes en cada lenguaje de programación que conozco (es decir, "causa estasis"). Pero, entonces, ya escribí una respuesta, así que soy parcial.Respuestas:
Ruby, 223 caracteres
Este resultó un poco largo.
Lo que hace es sacar primero las cadenas y los comentarios, para que no se cuenten (y los vuelve a colocar más tarde).
Luego, pasa por la cadena carácter por carácter. Cuando encuentra una llave de apertura, almacena su posición. Cuando encuentra una llave de cierre, emerge de su respectiva matriz de almacenamiento de llaves abiertas.
Si
pop
regresanil
(es decir, no había suficientes llaves de apertura), elimina la llave de cierre. Una vez hecho todo esto, elimina las llaves de apertura adicionales restantes (es decir, no había suficientes llaves de cierre).Al final del programa, vuelve a colocar todas las cadenas y comentarios y los genera.
Sin golf:
fuente
(("string"/*comment*/)"string"
? Si estoy leyendo (la versión no modificada) correctamente, reemplaza cadenas y comentarios con su índice en launparsed
matriz, lo que llevaría a una sustitución como((12)3
y luego buscaría un índice inexistente12
(o11
). Veo que la versión de golf solo usashift
, pero ¿podría no tener un problema similar?Python 3,
410322317Intenta cada posible conjunto de eliminaciones, comenzando con las más pequeñas, hasta que encuentre una donde los frenos estén equilibrados. (Con lo cual quiero decir que está completamente equilibrado:
{{(})
produce( )
, no{(})
).La primera versión usaba una función de generador recursivo, que era realmente genial pero también muy larga. Esta versión realiza una búsqueda simple de amplitud utilizando una cola. (Sí, es un algoritmo de tiempo factorial. ¿Cuál es el problema?: ^ D)
fuente
C - 406
Un intento en C sin usar expresiones regulares.
Para compilar y ejecutar (en una máquina Linux):
gcc -o brackets brackets.c
./brackets "[(])"
En casos indefinidos como [(]) devuelve el último par de paréntesis válido ()
fuente
Pitón 3, 320
Al igual que la solución de DLosc, esta investiga todas las eliminaciones posibles, pero utiliza una estrategia de exploración y recuperación recursiva que es mucho más rápida. Sé que la velocidad no es un criterio en el código de golf, y la búsqueda exhaustiva es en cualquier caso exponencial, pero esta puede manejar entradas como
({({({({({({({({(}}}}}}}}
en un par de segundos.fuente
O(n!!)
solución, noO(n!)
. (Mi golf es enO(n*2^n)
lugar deO(2^n)
, porque eno
realidad produce todos los patrones con hastar
eliminaciones, en lugar der
eliminaciones exactas . Fácil de arreglar, pero costaría unos pocos caracteres.)