Misalkan suatu hari Anda menggali melalui kotak besar kabel dan adaptor komputer yang tidak digunakan (USB ke USB mini, VGA ke DVI, dll.). Ada kabel kusut di mana-mana membuat berantakan, dan Anda bertanya-tanya apakah Anda bisa menyederhanakan hal-hal dengan menyatukan semua kabel dalam satu untaian panjang, dan kemudian menggulungnya.
Pertanyaannya adalah, mungkinkah menghubungkan semua kabel dan adaptor Anda dalam satu garis panjang seperti ini? Jelas tidak selalu mungkin, misalnya jika Anda hanya memiliki dua kabel dengan colokan yang sama sekali berbeda, mereka tidak dapat dihubungkan bersama. Tetapi jika Anda memiliki kabel ketiga yang dapat terhubung ke keduanya, maka Anda dapat merangkai semua kabel Anda.
Anda tidak peduli tentang jenis colokan yang ada di ujung untai semua kabel. Mereka tidak perlu saling menyambungkan untuk membentuk lingkaran. Anda hanya ingin tahu apakah membuat untai semua kabel itu mungkin, dan jika ya, bagaimana cara melakukannya.
Tantangan
Tulis program atau fungsi yang menggunakan string multiline di mana setiap baris menggambarkan salah satu kabel yang Anda miliki. Kabel terdiri dari satu atau lebih garis putus-putus ( -
), dengan colokan di kedua ujungnya. Sebuah plug selalu merupakan salah satu dari 8 karakter ()[]{}<>
.
Jadi ini beberapa kabel yang valid:
>->
(--[
}-{
<-----]
(---)
Tapi ini bukan:
-->
(--
)--
[{
---
Saat menghubungkan kabel, hanya colokan dengan tipe braket yang sama persis yang dapat dihubungkan bersamaan.
Jadi ini beberapa koneksi kabel yang valid:
...---((---...
...---))---...
...---]]---...
...---{{---...
...---<<---...
Dan ini tidak valid:
...---()---...
...---)(---...
...---{]---...
...---{[---...
...---><---...
...--->)---...
Jika semua kabel dalam input dapat disusun ulang dan dilampirkan bersama dalam satu untai panjang, maka hasilkan untai itu ke stdout pada satu baris (dengan baris tambahan opsional). Ketika ada beberapa solusi, Anda dapat memilih salah satu dari mereka untuk dihasilkan. Jika membuat untai tunggal tidak dimungkinkan, maka tidak menghasilkan apa-apa (atau mengeluarkan string kosong dengan baris baru tambahan opsional).
Misalnya, jika inputnya adalah
[-->
{---]
>----{
outputnya bisa
[-->>----{{---]
di mana semua kabel dirangkai.
Namun jika inputnya adalah
[-->
{---]
kabel tidak dapat dihubungkan sehingga tidak akan ada output.
Perhatikan bahwa kabel dapat dibalik sebanyak yang diperlukan untuk membuat koneksi. mis [-->
dan <--]
secara efektif kabel yang sama karena mereka dapat membuat jenis koneksi yang sama. Beberapa output mungkin bergantung pada membalik kabel input.
Sebagai contoh
(-[
}--]
bisa memiliki output
(-[[--{
di mana kabel kedua dibalik, atau
}--]]-)
di mana kabel pertama dibalik.
(Perhatikan bahwa secara umum membalik seluruh output valid karena sama seperti membalikkan setiap kabel secara individual.)
Panjang kabel dalam output tentu saja harus sesuai dengan panjang kabel input yang sesuai. Tetapi kabel dapat disusun ulang dan diputar sebanyak yang Anda inginkan untuk membuat untai semua kabel. Input akan selalu mengandung setidaknya satu kabel.
Kode terpendek dalam byte menang.
Uji Kasus
Kasus dengan output:
[-->
{---]
>----{
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.
Kasing tanpa keluaran:
[-->
{---]
[-]
[-]
(-]
]->
}-)
>->
>-->
]---]
[-------------------]
]-------------------[
[-----------------]
[-----------------]
{--[
]--}