Обычные скобки ( ()
, []
, <>
и {}
) хороши и однозначна, однако кто - то думал , что это будет идея хорошо использовать символы не кронштейн в скобках. Эти персонажи, |
и "
, неоднозначны. Например, делает
""""
соответствовать
(())
или
()()
Невозможно сказать.
Вещи начинают становиться интересными, когда вы смешиваете, например, неоднозначные скобки
"|""||""|"
Может быть любой из следующих
([(([]))]),([()[]()]),([()][()])
задача
Ваша задача - взять строку из неоднозначных символов и вывести все возможные сбалансированные строки, которые мог задумать автор.
Более конкретно, вы выводите все сбалансированные строки, которые можно сделать, заменяя |
либо либо, [
либо ]
и "
либо (
или )
. Вы не должны выводить какую-либо сбалансированную строку дважды.
IO
В качестве входных данных вы должны взять строку, состоящую из |
и "
. Если вы хотите выбрать два отличных символа, отличных от |
и, "
в качестве замены, вы можете сделать это. Вы должны вывести контейнер сбалансированных строк. Вы можете заменить []
и ()
на выходе с любыми другими двумя парами скобок ( ()
, []
, <>
или {}
) вы хотите. Ваш выходной формат должен быть одинаковым во всех сериях.
счет
Это код-гольф, поэтому ответы будут оцениваться в байтах, причем меньшее количество байтов будет лучше.
Контрольные примеры
"" -> ["()"]
"|"| -> []
||| -> []
"""" -> ["(())","()()"]
""|| -> ["()[]"]
"|"||"|" -> ["([([])])"]
"|""||""|" -> ["([(([]))])","([()[]()])","([()][()])"]
источник
Ответы:
Python 2 , 135 байт
Попробуйте онлайн!
Ожидается ввод, как
2002
вместо"||"
, и заключенный в кавычки.Перебирает все 2 N возможных назначений «open» и «close» для строки, создавая строки
c
вроде:Если
eval
-ing эта строка выдает исключение, она не имеет аналогов. Если нет, мы печатаемc[::2]
, давая:источник
Retina ,
595655 байтПопробуйте онлайн! К сожалению, тестирование для двух наборов соответствующих скобок превышает пригодность одного регулярного выражения .NET, поэтому экономит 15 байтов для проверки вручную. Редактировать: Сохранено
34 байта благодаря @ H.PWiz. Объяснение:Найдите
"
и сделайте две копии строки, одну с а<
и одну с>
. Делайте это по одному"
, чтобы каждая"
удваивала количество строк.Аналогично с
'
,{
и}
. Затем продолжайте замену, пока все"
s и'
s на всех копиях не будут заменены.Сделайте дубликат скобок, разделенных знаком
_
.В дубликате несколько раз удаляйте совпадающие скобки, пока не останется ни одного, и в этом случае удалите
_
также.Удалить все строки, которые все еще имеют
_
.Retina ,
747170 байтПопробуйте онлайн! Пояснение: первые два этапа, как указано выше. На третьем этапе непосредственно выводится результат сопоставления двух наборов совпадающих скобок. Это использует балансирующие группы .NET. На каждом этапе сопоставления регулярное выражение пытается сопоставить символ, затем ищет пару совпадающих скобок, а затем проверяет, совпадает ли верхняя часть стека с открытой скобкой. Если это может сделать это, это означает, что скобка уравновешивается, и открытая скобка выталкивается из стека. В противном случае предполагается, что мы находимся в открытой скобке, которую нужно поместить в стек. Если эти предположения не выполняются, то стек не будет пустым в конце и совпадение не удастся.
Альтернативный подход, также
7471 байт:Здесь мы смотрим вперед или
<
...>
или{
...}
, затем оглядываемся назад, чтобы вставить закрывающую скобку в стек. В противном случае нам нужно сопоставить и вытолкнуть закрывающую скобку, которую мы захватили ранее. В этой версии регулярное выражение может даже не доходить до конца строки, но некоторые строки, такие как<<<>
, проскальзывают через сеть, если мы не проверим наличие пустого стека.источник
|
на входеШелуха , 19 байт
Попробуйте онлайн! Использует символы
ds
на входе, а также соответствующие пары скобокde
иst
на выходе.объяснение
Идея состоит в том, чтобы сгенерировать все возможные скобки для ввода и сохранить те, которые сводятся к пустой строке, когда мы неоднократно удаляем соседние скобки. Это
¨÷₂¨
сжатая строка, которая расширяется в"dest"
, которая была выбрана, потому что она имеет короткую сжатую форму и состоит из пар символов со смежными кодовыми точками. Таким образом, программа эквивалентна следующему.источник
Perl,
565553 байтаВключает
+1
в себя дляn
использует
[
для[]
и{
для{}
Генерирует все 2 ^ N возможностей, затем использует perl,
eval
чтобы проверить, является ли строка типа '+ [+ {}]' допустимым кодом, и если это так, удаляет+
и печатает результатисточник
APL (Dyalog Classic) ,
5553 байтаПопробуйте онлайн!
источник
Чистый ,
203186179 байтПопробуйте онлайн!
Использует только сопоставление с образцом и понимание.
источник
Perl, 56 байт
Включает
+
в себя дляn
Использует вход
[
для вывода[
или]
Использует вход
{
для вывода{
или}
Использует расширенное регулярное выражение perl для соответствия скобкам, отслеживая выбор, сделанный во время возврата. Это может быть намного эффективнее, чем генерация всех 2 ^ N кандидатов, так как он уже отклоняет многие невозможные назначения, пока частично проходит через входную строку
источник
Котлин ,
240236234 байтаукрашенный
Тестовое задание
Правки
true
->1>0
и== 0
->< 1
источник
C (gcc) , 315 байтов
Попробуйте онлайн!
C (gcc) , 334 байта (старая версия)
Попробуйте онлайн!
Пояснение (старая версия)
Попробуйте онлайн!
источник
*s++
в нескольких местах.char S[n],*s=S
все еще корочеchars*s=calloc(n,1)