Suponha que um dia você esteja vasculhando sua grande caixa de cabos e adaptadores de computador não utilizados (USB para USB mini, VGA para DVI etc.). Em todos os lugares, há cabos emaranhados que bagunçam bastante, e você quer saber se poderia simplificar as coisas, conectando todos os cabos em um único fio longo e depois enrolando-o.
A questão é: é possível conectar todos os seus cabos e adaptadores em uma linha longa como esta? Obviamente, nem sempre é possível, por exemplo, se você tivesse apenas dois cabos com plugues completamente diferentes, eles não poderiam ser conectados. Mas se você tiver um terceiro cabo que possa se conectar aos dois, poderá amarrar todos os seus cabos.
Você não se importa com o tipo de plugue nas extremidades do fio. Eles não precisam se conectar para formar um loop. Você só quer saber se é possível fazer o fio todo, e se for, como fazê-lo.
Desafio
Escreva um programa ou função que utilize uma cadeia de linhas múltiplas, onde cada linha representa um dos cabos que você possui. Um cabo é composto de um ou mais traços ( -
), com um plugue em cada extremidade. Um plug é sempre um dos 8 caracteres ()[]{}<>
.
Portanto, estes são alguns cabos válidos:
>->
(--[
}-{
<-----]
(---)
Mas estes não são:
-->
(--
)--
[{
---
Ao conectar cabos, apenas plugues do mesmo tipo de suporte podem ser conectados juntos.
Portanto, estas são algumas conexões de cabo válidas:
...---((---...
...---))---...
...---]]---...
...---{{---...
...---<<---...
E estes são inválidos:
...---()---...
...---)(---...
...---{]---...
...---{[---...
...---><---...
...--->)---...
Se todos os cabos da entrada puderem ser reorganizados e conectados juntos em um fio longo, faça a saída desse fio para o padrão de saída em uma linha (com uma nova linha à direita opcional). Quando existem várias soluções, você pode escolher qualquer uma delas para a saída. Se não for possível criar um único fio, não produza nada (ou produza um texto vazio com uma nova linha à direita opcional).
Por exemplo, se a entrada for
[-->
{---]
>----{
a saída pode ser
[-->>----{{---]
onde todos os cabos estão amarrados juntos.
No entanto, se a entrada fosse
[-->
{---]
os cabos não podem ser conectados, portanto não haverá saída.
Observe que os cabos podem ser girados o tempo necessário para fazer as conexões. por exemplo, [-->
e <--]
são efetivamente o mesmo cabo, porque eles podem fazer o mesmo tipo de conexões. Algumas saídas podem depender da inversão dos cabos de entrada.
Por exemplo
(-[
}--]
poderia ter saída
(-[[--{
onde o segundo cabo é invertido, ou
}--]]-)
onde o primeiro cabo é invertido.
(Observe que, em geral, o lançamento de toda a saída é válido, pois é o mesmo que o lançamento inicial de cada cabo individualmente.)
É claro que os comprimentos dos cabos na saída devem corresponder aos comprimentos dos cabos de entrada correspondentes. Mas os cabos podem ser reordenados e girados o quanto você quiser, a fim de formar o fio todo. A entrada sempre conterá pelo menos um cabo.
O código mais curto em bytes vence.
Casos de teste
Casos com saída:
[-->
{---]
>----{
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 sem saída:
[-->
{---]
[-]
[-]
(-]
]->
}-)
>->
>-->
]---]
[-------------------]
]-------------------[
[-----------------]
[-----------------]
{--[
]--}