No son unas cuantas preguntas en este sitio sobre el equilibrio entre paréntesis, corchetes y comprobar si están equilibrados. ¡Propongo que es hora de usar esos soportes equilibrados para algo!
En matemáticas y programación, los corchetes son como burbujas, aislando todo lo que está dentro de todo lo que está afuera para que lo que esté adentro pueda hacer sus cosas en paz y lo que esté afuera solo vea un objeto. Sin embargo, una serie de paréntesis es unidimensional, mientras que las burbujas generalmente son al menos bidimensionales. Eso significa que las burbujas son libres de moverse entre sí, siempre y cuando nunca se toquen o crucen entre el interior y el exterior de cualquier otra burbuja.
Reto
La entrada es una cadena de corchetes coincidentes de un solo tipo, ya sea redondo ()
, cuadrado []
, rizado {}
o en ángulo <>
. Depende de usted qué tipo desea que acepte su programa, y se acepta un programa que solo acepta un solo tipo de paréntesis. (Bonificación imaginaria si su programa puede manejar cualquiera de ellos, puntos de bonificación imaginarios masivos si puede manejarlos a todos en la misma entrada.) La entrada no puede contener nada entre los corchetes, aunque se permiten espacios en blanco finales.
La salida es todas las posibles reorganizaciones (en orden arbitrario, e incluyendo la entrada original) de esos corchetes que producen la misma configuración de burbujas, sin dos cadenas idénticas. Eso significa que con una entrada de ()()
, la salida también es justa ()()
, aunque técnicamente son dos burbujas que podrían intercambiar lugares. Para el bono imaginario masivo, una entrada de {}[]()
, por supuesto, dará lugar a una salida de 6 elementos / cadenas / líneas diferentes.
Dos configuraciones de burbujas son "iguales" si puede hacer una en la otra moviendo las burbujas, sin permitir que ninguna burbuja se cruce desde el interior de otra burbuja hacia afuera, o desde afuera hacia adentro. Si compara los paréntesis anidados con los árboles (cada par coincidente es un nodo, y cada par coincidente dentro es un subnodo, y cada par coincidente dentro hay un subnodo de esos nuevamente, y así sucesivamente) donde se ordenan los subnodos de cualquier nodo dado , entonces una única configuración de burbujas es un árbol donde los nodos están desordenados.
Cualquier formato de salida razonable servirá, como devolver una lista de cadenas o una lista de caracteres individuales o una sola cadena con algún tipo de espacio en blanco, o imprimir stdout
o stderr
con algún tipo de carácter de espacio en blanco visible (más comúnmente nueva línea o espacio) entre cada reorganización
Espacios finales para cada reorganización y elementos de nueva línea / lista vacía anteriores y posteriores antes y después de que se permita la salida real. Debe usar el mismo tipo de corchetes en su salida que acepta en su entrada. Aparte de los corchetes, las nuevas líneas y los espacios como se especifica aquí, y cualquier separador que use, no se debe imprimir nada (incluidos los caracteres invisibles / de ancho cero).
El puntaje es el número de bytes en el código; La cuenta más baja para cada idioma gana. Puede observar si obtiene un bono imaginario, ya sea regular o masivo, pero no afecta su puntaje. Las bonificaciones reales son demasiado difíciles de equilibrar correctamente.
Ejemplos de entrada-salida
Ejemplo 1:
Entrada:
()(())
Salida:
()(())
(())()
Ejemplo 2
Entrada:
(()())()()
Salida:
(()())()()
()(()())()
()()(()())
Ejemplo 3
Entrada:
(()(()))()
Salida:
((())())()
()((())())
(()(()))()
()(()(()))
((()))
en el ejemplo 1? o()()()
? Parece que le faltan permutaciones para cada entrada.Respuestas:
CJam , 18 bytes
Pruébalo en línea!
-2 gracias a Business Cat .
Recibe la entrada como una cadena que contiene solo
[]
. Devuelve una lista de permutaciones (las listas vacías son lo mismo que las cadenas vacías en CJam, por lo que en lugar de las[]
que obtendrá""
).fuente
[][]
justa""
? - ¿Debería incluirse la entrada en un conjunto adicional de[]
? Si es así, ¿por qué hay un conjunto adicional de[]
alrededor de cuál (¿tal vez?) Es la salida para el ejemplo mencionado anteriormente? Además, la pregunta dice "Debería usar el mismo tipo de corchetes en su salida que acepta en su entrada. Además de los corchetes, las nuevas líneas y los espacios como se especifica aquí, y cualquier separador que use, no se debe imprimir nada", así que ' No estoy seguro de una combinación de[]
y""
es aceptable.[][]
un par adicional de[]
. Para los demás, no estoy realmente seguro de que sean inválidos._{{B}%e!}&
lugar de_!!{{B}%e!}*
&
Cortocircuito o algo así?&
ejecuta el bloque solo si el otro valor es verdaderoHaskell ,
227210208205 bytesPruébalo en línea!
Este fue duro!
Golfé un poco
Guardado dos bytes gracias a Laikoni
Ahorre dos bytes gracias a Bruce Forte
No estoy seguro de que esto funcione en todos los casos. Algunas explicaciones:
a!x
agregue la Cadenax
a la última lista de Cadena ena
(a es de tipo[[String]]
)snd$foldl(\(a,r)x->if x=='('then(a+1,last$(r++[[]]):[r!x|a>0])else(a-1,last$r:[r!x|a>1])
usa el condicional más corto para expresar la idea simple: dividir una cadena en la raíz)(
s. Por ejemplo,"(()(()))()"
da["()(())", ""]
.Necesitamos procesar cada parte de la división, luego reunir y unir todas las cadenas para obtener la salida correcta:
h
procesa una lista de partes: se aplicav
a la primera parte y combina el resultado con el proceso de las partes restantes.v
agrega los resultados para cada permutación de las partes y elimina los duplicados.Para agregar una vista más amplia: básicamente tiene un árbol (no binario) con nodos vacíos. Deja son
()
. Debe producir todas las permutaciones de las ramas para cada nodo, pero no puede tomar una rama de un nodo y colocarla en otro nodo. Hice una especie de primera búsqueda en profundidad.fuente
init a
.Python 2,
353350331 bytesRecibe una cadena de
()
como entrada e imprime el resultado.Pruébalo aquí!
Evité usar
itertools.permutations
con la ayuda de la respuesta de Paolo a esta pregunta .¡Gracias a Business Cat por encontrar 3 bytes, y gracias al Sr. Xcoder por sus increíbles 19 bytes!
Explicación
()
par en la cadena de entrada.()
par.fuente
print
y en puntos comoi+1 if
(podría seri+1if
). También en un punto que tieney[0:i]
, puede omitir el 0.JavaScript (Firefox 30-57), 222 bytes
Toma
[]
cuerdas. Explicación:fuente
Mathematica, 337 bytes
No para obtener puntos de código de golf, sino para mostrar el uso
Permutations
yDistribute
en este problema. Sin embargo, puede haber mejores enfoques.(
seq
: secuenciaalt
,: alternativas)Tome la entrada como una cadena, usando llaves
{
y}
. Salida de una cadena de varias líneas.fuente