Giả sử một ngày nào đó bạn đang đào bới hộp lớn các dây và bộ điều hợp máy tính không sử dụng (USB sang USB mini, VGA sang DVI, v.v.). Có những dây bị rối ở khắp mọi nơi làm cho khá lộn xộn, và bạn tự hỏi liệu bạn có thể đơn giản hóa mọi thứ bằng cách gắn tất cả các dây với nhau trong một sợi dài, và sau đó chỉ cần cuộn nó lại.
Câu hỏi là, có thể kết nối tất cả các dây và bộ điều hợp của bạn trong một hàng dài như thế này không? Rõ ràng không phải lúc nào cũng có thể, ví dụ nếu bạn chỉ có hai dây với các phích cắm hoàn toàn khác nhau, chúng không thể được kết nối với nhau. Nhưng nếu bạn có một sợi dây thứ ba có thể kết nối với cả hai, thì bạn có thể xâu chuỗi tất cả các dây của bạn lại với nhau.
Bạn không quan tâm đến loại phích cắm nào ở hai đầu của sợi dây. Họ không cần phải cắm vào nhau để tạo thành một vòng lặp. Bạn chỉ muốn biết nếu làm cho tất cả các sợi dây là có thể, và nếu có, làm thế nào để làm điều đó.
Thử thách
Viết chương trình hoặc hàm có trong một chuỗi nhiều dòng trong đó mỗi dòng mô tả một trong các dây bạn sở hữu. Một dây được tạo thành từ một hoặc nhiều dấu gạch ngang ( -
), với một đầu cắm ở hai đầu. Một phích cắm luôn là một trong 8 ký tự ()[]{}<>
.
Vì vậy, đây là một số dây hợp lệ:
>->
(--[
}-{
<-----]
(---)
Nhưng đây không phải là:
-->
(--
)--
[{
---
Khi kết nối dây, chỉ các phích cắm có cùng loại khung chính xác mới có thể được kết nối với nhau.
Vì vậy, đây là một số kết nối dây hợp lệ:
...---((---...
...---))---...
...---]]---...
...---{{---...
...---<<---...
Và những điều này không hợp lệ:
...---()---...
...---)(---...
...---{]---...
...---{[---...
...---><---...
...--->)---...
Nếu tất cả các dây trong đầu vào có thể được sắp xếp lại và gắn với nhau thành một chuỗi dài, thì đầu ra chuỗi đó sẽ xuất ra trên một dòng (với một dòng mới theo dõi tùy chọn). Khi có nhiều giải pháp, bạn có thể chọn bất kỳ giải pháp nào để xuất. Nếu không thể tạo một chuỗi đơn, thì không xuất ra được gì (hoặc xuất ra một chuỗi trống với một dòng mới tùy chọn).
Ví dụ: nếu đầu vào là
[-->
{---]
>----{
đầu ra có thể là
[-->>----{{---]
nơi tất cả các dây được nối với nhau.
Tuy nhiên nếu đầu vào là
[-->
{---]
các dây không thể được kết nối nên sẽ không có đầu ra.
Lưu ý rằng dây có thể được lật xung quanh càng nhiều cần thiết để tạo kết nối. ví dụ [-->
và <--]
thực sự là cùng một dây bởi vì chúng có thể tạo ra cùng loại kết nối. Một số đầu ra có thể phụ thuộc vào việc lật các dây đầu vào.
Ví dụ
(-[
}--]
có thể có đầu ra
(-[[--{
nơi dây thứ hai được lật, hoặc
}--]]-)
nơi dây đầu tiên được lật.
(Lưu ý rằng nói chung việc lật toàn bộ đầu ra là hợp lệ vì nó giống như lần đầu lật từng dây riêng lẻ.)
Độ dài của dây trong đầu ra tất nhiên phải khớp với độ dài của dây đầu vào tương ứng. Nhưng các dây có thể được sắp xếp lại và lật xung quanh nhiều như bạn muốn để tạo ra các sợi dây. Đầu vào sẽ luôn chứa ít nhất một dây.
Mã ngắn nhất tính bằng byte thắng.
Các trường hợp thử nghiệm
Các trường hợp có đầu ra:
[-->
{---]
>----{
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.
Các trường hợp không có đầu ra:
[-->
{---]
[-]
[-]
(-]
]->
}-)
>->
>-->
]---]
[-------------------]
]-------------------[
[-----------------]
[-----------------]
{--[
]--}