Чи можу я з'єднати всі шнури та адаптери разом?


30

Припустимо, одного дня ви копаєте велику коробку невикористаних комп'ютерних шнурів та адаптерів (USB до USB mini, VGA до DVI тощо). Скріплені шнури скрізь роблять безлад, і вам цікаво, чи не могли б ви спростити речі, з'єднавши всі шнури разом в одну довгу нитку, а потім просто згорнувши її.

Питання полягає в тому, чи можливо з'єднати всі ваші шнури та адаптери одним довгим рядком? Це, очевидно, не завжди можливо, наприклад, якщо у вас були лише два шнура з абсолютно різними вилками, їх не можна було з'єднати разом. Але якщо у вас був третій шнур, який може підключитися до обох, то ви могли зв'язати всі шнури разом.

Вам не байдуже, який тип штепсельних вилок на кінцях шнура. Їм не потрібно підключатися один до одного, щоб утворити цикл. Ви хочете лише знати, чи можливо виготовлення шнура з усією шнуркою, і якщо це можливо, як це зробити.

Виклик

Напишіть програму або функцію, яка містить багаторядковий рядок, де кожен рядок зображує один із ваших шнурів. Шнур складається з однієї або декількох тире ( -), з вилкою на будь-якому кінці. Плагін завжди є одним із 8 символів ()[]{}<>.

Отже, це кілька дійсних шнурів:

>->
(--[
}-{
<-----]
(---)

Але це не такі:

-->
(--
)--
[{
---

При підключенні шнурів, разом можуть бути з'єднані тільки штекери з таким самим типом кронштейнів.

Отож, це кілька дійсних кабельних з'єднань:

...---((---...
...---))---...
...---]]---...
...---{{---...
...---<<---...

І це недійсні:

...---()---...
...---)(---...
...---{]---...
...---{[---...
...---><---...
...--->)---...

Якщо всі шнури, що знаходяться на вході, можуть бути переставлені та з'єднані між собою в одну довгу нитку, то виведіть цю нитку для викреслювання на одній лінії (з необов'язковою лінією нового рядка). Якщо є кілька рішень, ви можете вибрати будь-яке з них для виведення. Якщо зробити одну нитку неможливо, не виведіть нічого (або виведіть порожню рядок із необов'язковим новим рядком).


Наприклад, якщо вхід є

[-->
{---]
>----{

вихід може бути

[-->>----{{---]

де всі шнури нанизані між собою.

Однак якби вхід був

[-->
{---]

шнури не можна підключити, щоб не було виводу.


Зауважте, що шнури можна обертати навколо стільки, скільки необхідно для з'єднання. наприклад, [-->і <--]фактично є одним і тим же шнуром, оскільки вони можуть здійснювати однотипні з'єднання. Деякі виходи можуть залежати від гортання вхідних шнурів.


Наприклад

(-[
}--]

може мати вихід

(-[[--{

де другий шнур перевернутий, або

}--]]-)

де перевернутий перший шнур.

(Зверніть увагу, що загалом гортання всього виводу є дійсним, оскільки воно таке саме, як спочатку гортати кожен шнур окремо.)


Довжина шнурів у висновку повинна, звичайно, відповідати довжинам відповідних вхідних шнурів. Але шнури можуть бути впорядковані та обернені навколо стільки, скільки ви хочете, щоб зробити пасмо з шнура. Вхід завжди буде містити принаймні один шнур.

Виграє найкоротший код у байтах.

Випробування

Випадки з виходом:

[-->
{---]
>----{
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.

Випадки без виходу:

[-->
{---]

[-]
[-]

(-]
]->
}-)

>->
>-->
]---]

[-------------------]
]-------------------[
[-----------------]
[-----------------]

{--[
]--}

6
велика коробка невикористаних шнурів та адаптерів комп’ютера. Це робить мене почувати себе краще - я не єдиний. Насправді у мене є кілька таких ящиків.
Цифрова травма

але що робити, якщо ви підключите шнур до себе?
anOKsquirrel

Чи гарантовані всі шнури дійсні?
Р. Кап

@ R.Kap Так вони
Хобі Кальвіна

Відповіді:


10

Не читається , 3924 байт

Це перший раз, коли я реалізував дещо структуру, схожу на стек виклику, у програмі Нечитабельно.

(Перша версія цього становила понад 5300 байт, просто для того, щоб дати уявлення про те, скільки я в цьому полював.)

"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "

Пояснення

Розглянемо цей приклад введення:

>--{
[---}

Протягом більшої частини виконання стрічка викладається таким чином:

  • Клітини від 0 до 5 - це розташування для різних змінних.

  • В комірці 6 далі міститься вся інформація про набір кабелів у вашій коробці:

    Приклад макета стрічки

  • Решта комірок після нульового термінатора містять стек. Кожен "стек-кадр" - це одна комірка, яка вказує на першу комірку кабелю (комірку "пусковий штекер"). У наведеному вище прикладі, коли програма вирішить, що знайшла рішення, стек буде містити 6 (з посиланням на >--{перший кабель) та 21 (маючи на увазі {---]дзеркало другого кабелю).

Програма триває в трьох основних етапах:

  1. Прочитайте весь вхід і генеруйте вищевказану структуру, включаючи всі дзеркальні кабелі.
  2. Спробуйте всі комбінації (але зупиніть, якщо знайдеться рішення).
  3. Якщо рішення було знайдено, виведіть його.

На першому етапі (прочитайте структуру вводу та генерування кабелів) використовуються лише комірки №1 (які я зателефоную p) та №2 (які я зателефоную ch) та функціонують у циклі часу так:

  • Під час умови: збільшення pна 6, прочитайте наступний символ (стартовий штекер) у комірці *pта переконайтеся, що це не -1(EOF).

  • Прочитайте наступні символи *(p+2)та порахуйте їх *(p+1), поки ми не зустрінемо нічого, крім -(дефісу). У цей момент *(p+1)буде міститися кількість дефісів (довжина кабелю) та *(p+2)останній нефіфічний символ (кінцевий штекер). (Ми також копіюємо дефіси символів у комірку №5, щоб ми могли отримати доступ до цього коду ASCII пізніше на етапі виводу.)

  • Через певний час знайдіть дзеркальну штепсельну вилку та зберігайте її *(p+3), а потім збільшуйте pна 2, поки *pне дорівнює нулю. Цикл виглядає так у псевдокоді:

    while (ch = *p) {
        *(p+3) = (ch -= 40) ? (ch -= 1) ? (ch -= 19) ? (ch -= 31) ? ch-32 ? *p-2 : *p+2 : *p+2 : *p+2 : *p-1 : *p+1
        p += 2
    }
    
  • Цей цикл завжди виконуватиме дві ітерації (стартовий та кінцевий штекер) та зберігатиме результати у четвертому та шостому осередку цього кабелю. Тепер, якщо ви звернули увагу, ви розумієте, що шоста комірка - це дійсно правильне місце для дзеркального кінцевого штекера, але дзеркальний пусковий штекер знаходиться в комірці з написом "булева індикація оригінального кабелю". Це нормально, тому що нам потрібна лише ця клітинка, яка має ненульове значення.

  • Оскільки pщойно було збільшено 4, тепер він вказує на клітинку з написом "булева індикація кабелю використовується". Встановити *(p+3)значення *(p-1). Це ставить дзеркальний стартовий штекер в потрібне місце.

  • Прочитайте (і відкиньте) ще один символ (який, як ми очікуємо, буде новим рядком, але програма цього не перевіряє).

pспочатку починається з 0, але збільшується на 6 всередині, тоді як дані кабелю починаються в комірці №6. pзбільшується на 4 всередині корпусу петлі, і, таким чином, 10 на кожен кабель, що саме те, що нам потрібно.

На другому етапі, клітини # 0-4 зайняті змінні , які я буду називати a, p, q, m, і notdone. (Комірка №5 досі запам'ятовує ASCII код дефісу.)

Щоб підготуватися до другого етапу, нам потрібно *pповернути 0 (комірка з позначкою «нульовий термінатор»), щоб вона могла виконувати роль термінатора для списку кабелів; ми також встановлюємо q(що є нашим покажчиком стека) на p+1(тобто комірку після «нульового термінатора»; саме тут починається стек); *qдо 1 (перший елемент стека; чому 1 стане очевидним пізніше); і notdoneдо 1. Все це робиться в одному заяві:

*p = (notdone = *(q = p+1) = 1)-1

Другий етап - це також певний час. Його стан просто notdone. У кожній ітерації циклу while може статися будь-яка з наступних чотирьох речей:

  1. Ми виявляємо, що всі кабелі позначені "в користуванні". Це означає, що ми знайшли рішення (яке представлено поточним вмістом стека).
  2. Ми можемо перейти *qдо іншого придатного кабелю (який ми негайно позначимо як "використовується" разом із його двійником), а потім повторно (тобто створимо новий стек-кадр).
  3. Ми не можемо просунутись *qчерез те, що не існує іншого придатного кабелю, тому нам потрібно відступити назад (видалити рамку стека та позначити попередній кабель та його близнюк як вже не "використовується").
  4. Ми не можемо просунутись *qчерез те, що не існує жодного іншого придатного кабелю, і ми не можемо відступити, оскільки ми досягли нижньої частини стека. Це означає, що рішення немає.

Тіло циклу перевіряє кожну з цих чотирьох умов у цьому порядку. Ось деталі:

  1. Встановіть mі pна 1, і через певний час, збільшуйте pна 5 (таким чином, перебираючи кабелі) і перевірте, чи встановлено *(p+4)("використовується"). Якщо це не так, встановіть m0. В кінці цього циклу mповідомляється, чи використовуються всі кабелі. Якщо так, встановіть notdone0, щоб завершити основну петлю. В іншому випадку продовжуйте етап 2 нижче.

  2. Встановіть pна *q(кабель в верхній частині стека) , і в той час як петлі , аналогічні наведеним вище, приріст pна 5 для перебору кабелів. Починаючи із *qзабезпечення, ми розглядаємо лише ті, про які ми ще не розглядали; однак пам’ятайте, що початкове значення для нового стека фрейму дорівнює 1, тому перший розглянутий кабель - той у комірці 6, який справді є першим кабелем.

    Для кожного кабелю нам потрібно перевірити, *(p+4)чи він уже не використовується, а також, що він або *(q-1) дорівнює нулю (тобто ми знаходимося в нижній частині стека, тому немає жодних обмежень на стартовий штекер), або *p (запуск кабелю штекер) дорівнює *(*(q-1)+2)(кінцева штепсельна кабель трохи нижче на стеці). Ми перевіряємо рівність, встановлюючи aдо *(*(q-1)+2)і mдо, *p+1а потім декрементуючи обидва циклу. Це +1тому m, що всередині стан зменшується, тому він зменшується ще раз a. Якщо aв кінці цього значення дорівнює нулю, два штекери рівні.

    Таким чином, якщо або *(q-1)було нульове, або порівняння рівності вдалося, кабель є прийнятним. Встановіть *qна pзаміну кабелю у верхній частині стійки на новий; встановити mте саме, що вказує на те, що ми знайшли відповідний кабель; а потім декремент p. Цей декремент - це невелика хитрість, щоб змусити цикл часу (ітерація через кабелі) достроково припинитися; він збільшиться ще pна 5, тим самим перенісши його до клітинки, що містить прапор цього "кабелю в користуванні", і ми знаємо, що це нуль, тому що ми лише перевірили це. Нарешті, після ітерації кабелю під час циклу, ми перевіряємо, чи mнемає нуля. Якщо так, ми знайшли відповідний кабель і pвказуємо на прапорець "використовується" для відповідного кабелю. Встановіть його на 1, щоб позначити його як використовуваний. Також встановити*(*(p-1) ? p+5 : p-5)до 1, щоб позначити свого близнюка як у використанні. Нарешті, приріст qі встановіть нове *qзначення 1 для створення нового стека.

  3. Якщо після ітерації кабелю під час циклу ми виявимо mнуль, більше немає відповідних кабелів, тому нам потрібно відступити. Обмеження qдля переміщення вниз по стеку і перевірити, чи все ще вказує на кабель (ненульове значення). Якщо так, позначте цей кабель та його двійник як уже не використовується. (Ми зберігаємо значення *qв, pщоб зменшити цей вираз у коді.)

  4. Якщо після декрементування qми виявимо, що він вказує на нульове значення, то це «нульовий термінатор», це означає, що ми перевалили стек. Ми робимо висновок, що рішення немає. Встановлюємо notdone0 для припинення основної петлі.

Третій етап - вихідний етап. Можуть статися дві речі:

  • основний цикл знайшов рішення, яке нам потрібно вивести, або
  • основний цикл зробив висновок, що рішення немає, і ми нічого не виводимо.

Зручно, якщо б не було НЕ рішення, pдорівнює нулю , тому що ми встановлюємо його до значення *qперед перевіркою , що на нуль; і якщо було рішення, pвказує на «нульовий термінатор», тому що він просто перейшов через кабелі, тож тепер ми можемо використовувати pітерацію через стек. Тому просто повторіть стек, вивівши для кожного кабелю стартовий штекер ( *(*p)), дефіси (шляхом зменшення *(*p+1)в циклі часу; використовуючи код дефіс ASCII, збережений у комірці №5), та кінцевий штекер ( *(*p+2)). Не забувайте, що це руйнує інформацію про довжину кабелю; нам це вже не потрібно.


3

CJam, 67

qN%e!{_,2,m*\f{.{_{"()[]{}<>--"_@#1^=}%W%?}_2ew{~\W=#}%0-{;}&}~}%1<

Спробуйте в Інтернеті

Примітка. Посилання використовує останній код із сховища (натиснуто, але ще не випущено), оскільки воно містить виправлення помилок.

Пояснення:

Програма просто приміряє всі перестановки та всі орієнтації шнурів.

qN%             read the input and split into lines
e!              generate all permutations
{…}%            map each permutation of cords
  _,            get the number of cords (n)
  2,m*          generate all patterns of n bits (cartesian power of [0 1])
  \f{…}         for each bit pattern and the cord permutation
    .{…}        apply the block to each bit and cord (flipping cords for bit 0)
      _         duplicate the cord
      {…}%      map each character of the cord
        "…"_    push the string of all the plugs (and 2 dashes) and duplicate it
        @#      get the index of the character in the string
        1^      XOR with 1
        =       get the character at this new index (plugs get toggled)
      W%        reverse the cord
                 the stack now has the bit, the original cord and the flipped cord
      ?         if the bit is 1, use the original cord, else use the flipped one
    _           duplicate the array of cords
    2ew         get all pairs of adjacent cords
    {…}%        map each pair of cords
      ~\        dump the 2 cords on the stack and swap them
      W=        get the right plug of the first cord
      #         find its position in the second cord (if 0, we have a match)
    0-          remove all the zeros
    {…}&        if the array is not empty (i.e. we have a mismatch)
      ;         pop the array of cords
  ~             dump all the results for this permutation on the stack
                 (to avoid nested arrays)
1<              get the first result (if any) from the array of all results

Можливо, пояснення, як саме це працює?
Тімві

@Timwi нормально, я також пограв у нього трохи більше
aditsu

Це рішення недійсне, оскільки не дає жодного виводу для вводу (-] ]-> >-} }-) )-[ [-< <-{ {-(.
Р. Кап

@ R.Kap це вирішує цей вклад, але цей конкретний інтернет-перекладач має тайм-аут (і про це зовсім мовчить). Ви можете спробувати його тут замість цього (і дати йому кілька хвилин) або використовувати інтерпретатор Java (швидкий)
aditsu

Насправді, перекладача, якого я зв'язав вище, мабуть, знадобиться багато часу, щоб вирішити цю інформацію. В Java інтерпретатор вирішує його менш ніж за 1,5 хвилини на моєму комп'ютері.
aditsu

2

JavaScript (ES6), 206

Рекурсивна функція

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>l[0]?l.some((b,i)=>r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])] .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)&&(l=[...l],l[i]=r,f(l)))?r:'':a

Більш читабельний

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>
  l[0]?
  l.some((b,i)=>
     r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])]
     .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)
     &&(l=[...l],l[i]=r,f(l))
    )?r:''
 :a

Тест

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>l[0]?l.some((b,i)=>r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])] .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)&&(l=[...l],l[i]=r,f(l)))?r:'':a

console.log=(...x)=>O.textContent+=x+'\n'

;[
 //OK
 ['[-->','{---]','>----{']
,['(-[','}--]']
,['(-)']
,['[--{']
,['[-]',']-[']
,['[----->',')------------[','{--<','}---)']
,['>-->','>->','>--->']
,['(-]',']->','>-}','}-)',')-[','[-<','<-{','{-(']
 //KO
,['[-->','{---]']
,['[-]','[-]']
,['(-]',']->','}-)']
,['>->','>-->',']---]']
,['[-------]',']-------[','[-------]','[---------]'] // shortened a little,
,['{--[',']--}']
].forEach(t=>{
  console.log(t+' : "'+f(t)+'"\n')
})
<pre id=O></pre>


1

Javascript, 800 байт

Далеко від оптимізованого рішення, але ось швидкий злом разом у JavaScript (немає фантазії ecma5 чи нічого, тому що я цього не знаю).

function a(r){function t(r,t){var n=r.slice();return n.splice(t,1),n}function n(r){var t,n={"[":"]","]":"[",">":"<","<":">","(":")",")":"(","{":"}","}":"{"},e=r.split("").reverse();for(t=0;t<e.length;t++)n.hasOwnProperty(e[t])&&(e[t]=n[e[t]]);return e.join("")}function e(r,t){return r.unshift(t),r}var h,u,f=[];if(1==r.length)return r[0];for(h=0;h<r.length;h++){var l=r[h],i=t(r,h),c=l.charAt(0),g=l.charAt(l.length-1);for(u=0;u<i.length;u++){var o=i[u],s=o.charAt(0),p=o.charAt(o.length-1);c==p&&f.push(e(t(i,u),o+l)),g==s&&f.push(e(t(i,u),l+o)),o=n(o),s=o.charAt(0),p=o.charAt(o.length-1),c==p&&f.push(e(t(i,u),o+l)),g==s&&f.push(e(t(i,u),l+o))}}if(f.length<1)return!1;for(h=0;h<f.length;h++){if(1===f[h].length)return f[h][0];f[h]=a(f[h])}for(h=0;h<f.length;h++)if(f[h]!==!1)return f[h];return!1}

Необов’язаний, ось це ... Я впевнений, що принаймні 2 для циклу тут непотрібні, і перевірка наявності введення одного елемента вгорі та відповідність одного елемента внизу є хиткою ... але, здається, працює і обробляє тестові входи.

function a(inputs)
{
	var i, ii, matches = [];
	if (inputs.length == 1) {
		return inputs[0];
	}
	// For each of the elements in inputs (e1)
	for (i = 0; i < inputs.length; i++) {
		var e1 = inputs[i],
			others = except(inputs,i),
			e1s = e1.charAt(0),
			e1e = e1.charAt(e1.length-1);
		// Compare to each of the other elements in inputs (e2)
		for (ii = 0; ii < others.length; ii++) {
			// get the start and end of the elements to compare (e1s,e1e,e2s,e2e)
			var e2 = others[ii],
				e2s = e2.charAt(0),
				e2e = e2.charAt(e2.length-1);
			// if any of them match up (e1s == e2e || e1s == e2s || e1e == e2s || e1e = e2e)
			// Make a new array of inputs containing the joined elements (as a single element) and all other elements which might join with them
			if (e1s == e2e) {
				matches.push(addTo(except(others,ii),e2+e1));
			}
			if (e1e == e2s) {
				matches.push(addTo(except(others,ii),e1+e2));
			}
			e2 = flip(e2);
			e2s = e2.charAt(0);
			e2e = e2.charAt(e2.length-1);
			if (e1s == e2e) {
				matches.push(addTo(except(others,ii),e2+e1));
			}
			if (e1e == e2s) {
				matches.push(addTo(except(others,ii),e1+e2));
			}
		}
	}

	if (matches.length < 1) {
		return false;
	}

	for (i = 0; i < matches.length; i++) {
		if (matches[i].length  === 1) {
			return matches[i][0];
		} else {
			matches[i] = a(matches[i]);
		}
	};

	for (i = 0; i < matches.length; i++) {
		if (matches[i] !== false) {
			return matches[i];
		}
	};

	return false;

	function except(list,idx)
	{
		var newList = list.slice();
		newList.splice(idx,1);
		return newList;
	}
	function flip(s) {
		var replacements = {
			'[':']',
			']':'[',
			'>':'<',
			'<':'>',
			'(':')',
			')':'(',
			'{':'}',
			'}':'{'
		}, i, a = s.split('').reverse();
		for (i = 0; i < a.length; i++) {
			if (replacements.hasOwnProperty(a[i])) {
				a[i] = replacements[a[i]];
			}
		}

		return a.join('');
	}
	function addTo(arr,newEl)
	{
		arr.unshift(newEl);
		return arr;
	}
}


1
Ви можете перейменувати функції, щоб зберегти досить багато байтів. stackoverflow.com/questions/6156319 / ...
noɥʇʎԀʎzɐɹƆ

1
уникайте .charAt у будь-якій версії JavaScript. s.charAt(x)===s[x]
edc65

1

Python 3, 217 байт

from itertools import*
a='()[]{}<>'
all(any(c[-1]!=d[0]for c,d in zip(q,q[1:]))or print(''.join(q))for p in permutations(open(0))for q in product(*[(c[:-1],a[a.find(c[-2])^1]+c[-3:0:-1]+a[a.find(c[0])^1])for c in p]))

( Демонстрація на Ideone )


Як це приймає внесок?
Р. Кап

@ R.Kap На stdin, один шнур на рядок.
Anders Kaseorg

Це не здається, принаймні, коли я запускав його.
Р. Кап

Крім того, наскільки швидко він може знайти правильну відповідь (-] ]-> >-} }-) )-[ [-< <-{ {-(?
Р. Кап

@ R.Kap Ознайомтеся з демонстраційною версією Ideone на прикладі того, як вона приймає вклад і виробляє вихід. (Це може не працювати в Windows, якщо це ви намагаєтеся зробити?) Це запускається ~ моментально на вашому тестовому випадку. Звичайно, є випадки, які займуть експоненціальний час.
Anders Kaseorg

0

Луа, 477 байт

function r(s)return s:reverse():gsub("[()%[%]{}<>]",{["("]=")",[")"]="(",["["]="]",["]"]="[",["{"]="}",["}"]="{",["<"]=">",[">"]="<"})end
function a(c,b)for i, v in next,b do
m=c:sub(-1,-1)n=v:sub(1,1)o=r(c):sub(-1,-1)p=r(v):sub(1,1)l=table.remove(b,i)if m==n then
return a(c..v,b)elseif o==n then
return a(r(c)..v,b)elseif m==p then
return a(c..r(v),b)elseif o==p then
return a(r(c)..r(v),b)end
table.insert(b,i,l)end
return#b>0 and""or c
end
print(a(table.remove(arg,1),arg))

Приймає шнури як аргументи командного рядка


0

Python 3.5, 448 432 427 424 286 311 байт:

( +25, оскільки виникла помилка, де вихід може бути довшим, ніж повинен бути для деяких входів )

def g3(z):
 B=z.split();M='i[::-1].translate({41:40,40:41,125:123,123:125,62:60,60:62,93:91,91:93})';f=B+[eval(M)for i in B if eval(M)not in B];d=[f.pop(0)]
 for h in d:
  try:[d.append([f.pop(f.index(c))for c in f if h[-1]==c[0]][0])if len(d)<len(B)else E]
  except:break
 return''.join(d)if len(d)>=len(B)else''

Працює чудово! крім входів із 7 і більше значеннями. Тим самим потрібно багато часу, швидше за все тому, що він повинен пройти всі ті перестановки введення плюс вхід зворотний . Я спробую це виправити, якщо і коли зможу, але наразі це здається досить гарним. Зараз все добре! Якщо тільки я міг якось використати цей try-exceptблок у розумінні списку, він міг би бути трохи коротшим і виглядати набагато приємніше. Тим не менш, зараз він працює для всіх тестових випадків, і, найкраще, він не використовує імпорт! :)

Спробуйте в Інтернеті! (Ideone) (тут 284 байти)

(Порада. Щоб спробувати, просто виберіть "виделка", а потім введіть свій вибір, розділений пробілом , і виберіть "запустити")

Пояснення

В основному, те, що відбувається, це ...

  1. Список B,, створюється з введення, розділяючи його на пробілі на його складові "шнури".
  2. Mя створив рядок, який при оцінці повертає список, на основі Bякого містяться всі шнури, але цього разу назад .
  3. Список, створений з, Mв кінцевому рахунку поєднується зB сам собою для створення списку f, з усіма можливими орієнтаціями "шнурів".
  4. dСтворюється ще один список, який буде ініціалізований з першим значенням (значенням)f[0] ) f.
  5. Нарешті, усі значення в dітератуються, і останній символ кожного значення порівнюється з першим символом кожного елемента в f, і коли знайдено збіг, цей символ вискакується (або видаляється) і повертається зі списку f. Це відбувається до тих пір, поки a не IndexErrorбуде підвищено, або довжина списку не dперевищить Bі a не NameErrorбуде піднято після виклику до E, обидва вони обробляються, а потім dвміст списку об'єднується в рядок і повертається до тих пір, поки довжина списку dбільше ніж або дорівнює довжині списку B. В іншому випадку повертається порожня рядок ( ''), оскільки вона dне має тієї ж довжини, що Bозначає, що всі "шнури" у спискуB не можна з'єднати в один довгий "шнур".

@KennyLau Що ти змінив? З того, що я бачу, ви щойно додали. Що <!-- language: lang-python -->це змінить?
Р. Кап

Це може ввімкнути підсвічування синтаксису для вашого коду.
Leaky Nun

@KennyLau Ого, це круто. Мені було цікаво, як мені це зробити на PPCG. Тепер я знаю! Дякую! :)
Р. Кап
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.