Supposons qu'un jour vous fouilliez dans votre grande boîte de cordons et d'adaptateurs informatiques inutilisés (USB vers USB mini, VGA vers DVI, etc.). Il y a partout des cordons emmêlés qui font tout un gâchis, et vous vous demandez si vous pourriez simplifier les choses en attachant tous les cordons ensemble dans un long brin, puis en les enroulant simplement.
La question est, est-il possible de connecter tous vos cordons et adaptateurs sur une longue ligne comme celle-ci? Ce n'est évidemment pas toujours possible, par exemple si vous n'aviez que deux cordons avec des fiches complètement différentes, ils ne pourraient pas être connectés ensemble. Mais si vous aviez un troisième cordon qui peut se connecter aux deux, vous pouvez alors lier tous vos cordons ensemble.
Vous ne vous souciez pas du type de fiches aux extrémités du brin tout cordon. Ils n'ont pas besoin de se connecter les uns aux autres pour former une boucle. Vous voulez seulement savoir si la fabrication du toron tout cordon est possible, et si c'est le cas, comment le faire.
Défi
Écrivez un programme ou une fonction qui prend une chaîne multiligne où chaque ligne représente l'un des cordons que vous possédez. Un cordon est composé d'un ou plusieurs tirets ( -
), avec une fiche à chaque extrémité. Une prise est toujours l'un des 8 caractères ()[]{}<>
.
Voici donc quelques cordons valides:
>->
(--[
}-{
<-----]
(---)
Mais ce ne sont pas:
-->
(--
)--
[{
---
Lors de la connexion des cordons, seules les fiches ayant exactement le même type de support peuvent être connectées ensemble.
Voici donc quelques connexions de cordon valides:
...---((---...
...---))---...
...---]]---...
...---{{---...
...---<<---...
Et ceux-ci ne sont pas valides:
...---()---...
...---)(---...
...---{]---...
...---{[---...
...---><---...
...--->)---...
Si tous les cordons de l'entrée peuvent être réarrangés et attachés ensemble dans un long brin, alors sortez ce brin vers la sortie standard sur une ligne (avec un retour à la ligne de fin facultatif). Lorsqu'il existe plusieurs solutions, vous pouvez choisir l'une d'entre elles pour la sortie. S'il n'est pas possible de créer un seul brin, alors ne rien produire (ou sortir une chaîne vide avec un retour à la ligne facultatif).
Par exemple, si l'entrée est
[-->
{---]
>----{
la sortie pourrait être
[-->>----{{---]
où tous les cordons sont attachés ensemble.
Cependant, si l'entrée était
[-->
{---]
les cordons ne peuvent pas être connectés, il n'y aurait donc pas de sortie.
Notez que les cordons peuvent être retournés autant de fois que nécessaire pour effectuer les connexions. par exemple [-->
et <--]
sont effectivement le même cordon car ils peuvent faire le même type de connexions. Certaines sorties peuvent dépendre du retournement des cordons d'entrée.
Par exemple
(-[
}--]
pourrait avoir une sortie
(-[[--{
où le deuxième cordon est retourné, ou
}--]]-)
où le premier cordon est retourné.
(Notez qu'en général, le retournement de la sortie entière est valide car c'est la même chose que le retournement initial de chaque cordon individuellement.)
Les longueurs des cordons dans la sortie doivent bien sûr correspondre aux longueurs des cordons d'entrée correspondants. Mais les cordons peuvent être réorganisés et retournés autant que vous le souhaitez pour faire le brin tout cordon. L'entrée contiendra toujours au moins un cordon.
Le code le plus court en octets gagne.
Cas de test
Cas avec sortie:
[-->
{---]
>----{
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.
Cas sans sortie:
[-->
{---]
[-]
[-]
(-]
]->
}-)
>->
>-->
]---]
[-------------------]
]-------------------[
[-----------------]
[-----------------]
{--[
]--}