Suponga que un día está buscando en su gran caja de cables y adaptadores de computadora no utilizados (USB a USB mini, VGA a DVI, etc.). Hay cables enredados en todas partes que hacen un desastre, y te preguntas si podrías simplificar las cosas al unir todos los cables en un solo hilo y luego enrollarlos.
La pregunta es, ¿es posible conectar todos sus cables y adaptadores en una línea larga como esta? Obviamente, no siempre es posible, por ejemplo, si solo tuviera dos cables con enchufes completamente diferentes, no podrían conectarse entre sí. Pero si tuviera un tercer cable que pueda conectarse a ambos, entonces podría unir todos sus cables.
No le importa qué tipo de enchufes hay en los extremos del cordón de todos los cables. No necesitan conectarse entre sí para formar un bucle. Solo desea saber si es posible hacer el cordón de cable completo y, si es así, cómo hacerlo.
Reto
Escriba un programa o función que tome una cadena multilínea donde cada línea represente uno de los cables que posee. Un cable está formado por uno o más guiones ( -
), con un enchufe en cada extremo. Un complemento siempre es uno de los 8 caracteres ()[]{}<>
.
Estos son algunos cables válidos:
>->
(--[
}-{
<-----]
(---)
Pero estos no son:
-->
(--
)--
[{
---
Al conectar cables, solo se pueden conectar entre sí enchufes con exactamente el mismo tipo de soporte.
Estas son algunas conexiones de cable válidas:
...---((---...
...---))---...
...---]]---...
...---{{---...
...---<<---...
Y estos no son válidos:
...---()---...
...---)(---...
...---{]---...
...---{[---...
...---><---...
...--->)---...
Si todos los cables de la entrada se pueden reorganizar y unir en una sola hebra larga, entonces envíe esa hebra a stdout en una línea (con una nueva línea final opcional). Cuando hay varias soluciones, puede elegir cualquiera de ellas para la salida. Si no es posible hacer un solo capítulo, no envíe nada (o envíe una cadena vacía con una nueva línea final opcional).
Por ejemplo, si la entrada es
[-->
{---]
>----{
la salida podría ser
[-->>----{{---]
donde todos los cables están unidos.
Sin embargo, si la entrada fuera
[-->
{---]
los cables no se pueden conectar, por lo que no habría salida.
Tenga en cuenta que los cables se pueden voltear tanto como sea necesario para hacer las conexiones. por ejemplo, [-->
y <--]
son efectivamente el mismo cable porque pueden hacer el mismo tipo de conexiones. Algunas salidas pueden depender de voltear los cables de entrada.
Por ejemplo
(-[
}--]
podría tener salida
(-[[--{
donde se voltea el segundo cable, o
}--]]-)
donde se voltea el primer cable.
(Tenga en cuenta que, en general, invertir toda la salida es válido porque es lo mismo que invertir inicialmente cada cable individualmente).
Las longitudes de los cables en la salida, por supuesto, deben coincidir con las longitudes de los cables de entrada correspondientes. Pero los cables pueden reordenarse y girarse tanto como desee para hacer que el cable esté completamente trenzado. La entrada siempre contendrá al menos un cable.
El código más corto en bytes gana.
Casos de prueba
Casos con salida:
[-->
{---]
>----{
gives
[-->>----{{---]
or
[---}}----<<--]
(-[
}--]
gives
(-[[--{
or
}--]]-)
(-)
gives
(-)
[--{
gives
[--{
or
}--]
[-]
]-[
gives
[-]]-[
or
]-[[-]
[----->
)------------[
{--<
}---)
could give
[----->>--}}---))------------[
or
>--}}---))------------[[----->
or
}---))------------[[----->>--}
or
{--<<-----]]------------((---{
etc.
>-->
>->
>--->
could give
>-->>->>--->
or
>--->>-->>->
or
>->>-->>--->
or
<--<<---<<-<
etc.
(-]
]->
>-}
}-)
)-[
[-<
<-{
{-(
could give
(-]]->>-}}-))-[[-<<-{{-(
or
{-((-]]->>-}}-))-[[-<<-{
or
<-{{-((-]]->>-}}-))-[[->
etc.
Casos sin salida:
[-->
{---]
[-]
[-]
(-]
]->
}-)
>->
>-->
]---]
[-------------------]
]-------------------[
[-----------------]
[-----------------]
{--[
]--}