Строка скобки определяется как строка, состоящая из символов, *()[]
в которых скобки соответствуют правильно:
[brace-string] ::= [unit] || [unit] [brace-string]
[unit] ::= "" || "*" || "(" [brace-string] ")" || "[" [brace-string] "]"
Это правильная скобка:
((())***[]**)****[(())*]*
Но это не так:
)(
**(**[*](**)
**([*)]**
Ваша задача - написать программу (или функцию), которая, учитывая положительное целое число n
, принимает число в качестве входных данных и выводит (или возвращает) все действительные строки скобок длины n
.
Характеристики
- Вы можете выводить строки в любом порядке.
- Вы можете вывести в виде списка или строки, разделенных другим символом.
- Ваша программа должна обрабатывать 0 правильно. Существует 1 возможная скобка длиной 0, которая является пустой строкой
""
. - Это код-гольф , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.
Тестовые случаи
0.
1. *
2. ** () []
3. *** ()* []* (*) [*] *() *[]
4. **** ()** []** (*)* [*]* (**) **() **[] *(*) *[*] (()) ()() ()[] ([]) [**] [()] [[]] []() [][] *()* *[]*
code-golf
balanced-string
Esolanging Fruit
источник
источник
Ответы:
Желе, 29 байт
-3 байта благодаря @JonathanAllan
Пожалуйста , сообщите мне, если есть какие-либо проблемы / ошибки / ошибки или байты, которые я могу устранить!
Попробуйте онлайн!
Предыдущее решение (я) у меня было:
Объяснение (Моя лучшая попытка описания):
источник
“[(*)]”ṗµḟ”*œṣ⁾()Fœṣ⁾[]FµÐLÐḟ
)Пролог, 69 байт
Одним из наиболее интересных свойств Prolog является то, что во многих случаях он способен запускать программу в обратном направлении; например, вместо того, чтобы проверять, является ли что-то истинным, вы можете сгенерировать все решения, для которых оно истинно, и вместо проверки длины строки вы можете сгенерировать все строки с заданной длиной. (Еще одним приятным свойством Prolog является то, что ему требуется пробел после конца каждого определения предиката, и новая строка может быть вставлена так же дешево, как пробел; таким образом, даже программы для игры в гольф часто довольно читабельны.)
Выше определен предикат (эквивалент функции),
b
который проверяет, имеет ли строка заданную длину и является ли она «фигурной скобкой», как определено в вопросе. В частности, он делает это через поддержку грамматики / регулярного выражения / сопоставления шаблонов Пролога, которая дает хороший, короткий сахар для определения такого рода выражений (очевидно, это стандартное / переносимое приложение, но я не знал об этом, когда первоначально писал ответ, и, таким образом, Предполагается, что ответ будет работать только для одной реализации Пролога, но, похоже, он работает для каждой реализации, которая соответствует стандартам. Программа может быть переведена на английский язык довольно напрямую; первые две строки говорят: «a s - пустая строка, или за e следует a s ; a eявляется звездочкой, или s за которым следует нуль строка «.в скобках или s в квадратных скобках ". Третья строка может быть интерпретирована как" b из N может быть A, если A является списком с длиной N, а A является sЯ позаботился о том, чтобы написать
s
(и, таким образомb
), чтобы они соответствовали каждой «строке скобок» ровно одним способом (что является причиной того, что обаs
иe
должны существовать, а не группировать их в один предикат). Это делает их обоих полностью обратимыми; таким образом,b
может использоваться для генерации всех «строк скобок» заданной длины, в дополнение к проверке, является ли строка строкой скобок заданной длины (ее также можно использовать в качестве третьего способа округления, чтобы выяснить длину скобки строка, но это почти наверняка ее наименее полезный режим работы). Реализация является рекурсивной, например, чтобы сгенерировать s , код сгенерирует все возможные e , которые не длиннее требуемой длины вывода, и добавит все возможные sкоторые вписываются в оставшееся им пространство; поскольку я заранее указал длину аргумента (в пределах b ), механизм Пролога знает, что он не может генерировать выходные данные, длина которых превышает заданную длину, что позволяет завершить рекурсию.Вот пример работающей программы:
источник
length
иappend
любой другой, является фундаментальной частью языка, и пользовательские функции часто делают то же самое.length(A,N)
; ЕслиN
задано иA
нет (что произойдет, если предикат используется способом, запрошенным в программе),length
будет сгенерирован список,A
состоящий изN
неизвестных элементов. Использованиеlength
для измерения длины списка, вероятно, более широко используется (хотя использование его «назад» довольно распространено в программировании на Прологе). Большинство предикатов в конечном итоге работают почти одинаково (единственная причина, по которой они этого не делают, заключается в том, что попытка обратить их назад создаст бесконечный цикл, что довольно распространено).-->
и DCG в целом являются стандартными прологами ISO .Haskell,
10194 байта7 байт сохранено Zgarb!
Практически просто, следуя определению, но с
""
делом перенесено.Использование:
(Второе вычисление занимает менее секунды на медленной машине.)
Я также хотел бы поделиться результатом другого подхода, который я предложил, думая о генерации функций. Он определяет список
b
списков строк, которыйb!!n
содержит все строки скобок длиныn
. Точно так жеu!!n
содержит все атомы размераn-1
. Приятно то, что в коде не используются никакие числа. Это не полностью игра в гольф:u
иi
может быть встроено, и это, безусловно, упускает несколько других возможностей для игры в гольф. К сожалению, не похоже, что его можно сделать короче, чем в первой версии, но он вычисляетсяlength $ b !! 10
еще быстрее.источник
b$n-k
иb$n-2
. Также на финальную строчку можно сделатьa:b<-["()","[]"]
и вернутьсяa:s++b
.["()","[]"]
но не мог понять, как улучшить размер кода. Благодарность!Mathematica, 116 байт
объяснение
Найдите символы строки
"*([)]"
, дающиеList
{"*", "(", "[", ")", "]"}
.Найдите кортежи из приведенного выше списка с длиной
n
.Безымянная логическая функция, чтобы определить, сбалансирован ли кортеж:
Удалить все
"*"
на входе.Повторно удаляйте все последовательные вхождения
"("
и")"
или"["
и"]"
до тех пор, пока ввод не изменится.Проверьте, является ли результат пустым
List
.Найдите кортежи, которые дают,
True
когда применяется булева функция.Преобразуйте каждого
List
из символов вString
s.источник
{x=a___,"(",")",y=b___}|{x,"[","]",y}
похоже, работает.Python 2, 128 байт
Винт рекурсивных регулярных выражений - мы используем парсер Python! Чтобы убедиться, что, например,
*(**[])*
это строка-скобка, мы делаем следующее:Создайте строку наподобие
"*", (0,"*","*", [0,0] ,0) ,"*"
, где каждый второй символ из четырех является символом из скобок, а остальные символы являются клеем, чтобы сделать это потенциальным выражением Python.eval
Это.Если это не приводит к ошибке, выведите
s[1::4]
(символы скобок).В клеевых символах выбраны так , что строка я делаю это правильное выражение Python , если и только если принимать каждый второй символ из четырех выходов действительной скобки-струнных.
источник
PHP, 149 байт
Использует старый добрый генерировать все возможные, а затем метод фильтрации. Используйте как:
источник
Python, 134 байта
repl.it
Безымянная функция, которая возвращает список допустимых строк длины
n
.Формы всех длины
n
кортежи персонажей*()[]
, соединяют их в строки , используяmap(''.join,...)
и фильтры для тех , которые имеют сбалансированные скобки, удаляя «пар»"*"
,"()"
и ,"[]"
в свою очередь ,n
и проверьте , что результат является пустой строкой (n
раз это перебор, особенно для"*"
но гольфист).источник
Сетчатка , 78 байт
Количество байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
объяснение
Я генерирую все возможные строки длиной 5, а затем отфильтровываю неверные.
Это преобразует ввод в унарный, используя
1
в качестве цифры.Это многократно (
+
) заменяет первый (1
) по одному в каждой строке (%
) таким образом, что он делает пять копий строки, по одной для каждого возможного символа. Это делается с помощью замены префикса и суффикса,$`
и$'
для создания остатка каждой строки.Этот цикл останавливается, когда нет больше 1 для замены. На данный момент у нас есть все возможные строки длины
N
, по одной на каждой строке.Эти два этапа выполняются для каждой строки отдельно (
%
). На первом этапе просто дублируется строка с;
разделением двух копий.Второй этап является еще цикл (
+
), который удаляет повторно[]
,()
или*
от первой копии строки, или удаляет точку с запятой в начале строки (что возможно только после того, как строка исчезла полностью).Допустимые строки - это те, у которых больше нет точки с запятой, поэтому мы просто отбрасываем все строки (
A
), которые содержат точку с запятой.источник
Python 3.5, 146 байт
Очень длинный по сравнению с другими ответами, но самый короткий, который я смог найти. Она имеет форму анонимной лямбда-функции и поэтому должна вызываться в формате
print(<Function Name>(<Integer>))
Выходы в Python набор из неупорядоченных строк , представляющих все возможные фигурных скобки-строки длины входного сигнала.
Например, предполагая, что названная выше функция названа
G
, вызовG(3)
приведет к следующему выводу:Попробуйте онлайн! (Ideone)
Однако, если, как и я, вы на самом деле не являетесь поклонником упрощения вещей с помощью встроенных модулей, то вот мой собственный оригинальный ответ - не использовать какие-либо внешние библиотеки для поиска перестановок, и в настоящее время он занимает колоссальные
288237 байт :Опять же, как и в случае с конкурирующим ответом, этот ответ имеет форму лямбда-функции и поэтому должен также вызываться в формате
print(<Function Name>(<Integer>))
И выводит Python список из неупорядоченных строк , представляющих все фигурные скобки-строку длины входа. Например, если лямбда должна быть вызвана как
G(3)
, на этот раз результат будет следующим:Кроме того, этот также намного быстрее, чем мой другой ответ, он может найти все скобки длиной
11
около 115 секунд , длиной10
около 19 секунд , длиной9
около 4 секунд и длиной8
в около 0,73 секунды на моей машине, тогда как мой конкурирующий ответ занимает намного больше времени, чем 115 секунд для ввода6
.Попробуйте онлайн! (Ideone)
источник
05AB1E, 23 байта
Некоторые из этих функций могли быть реализованы после публикации вопроса. Любые предложения приветствуются!
Попробуйте онлайн!
Как?
источник
*
быть и в массиве удаления? И можноõQ
ли заменить чек чем-то вроде НЕТ?'*м„()„[]‚õ:
vs„()„[]‚'*«õ:
(не проверено), поскольку нет команды для объединения 3 значений AFAIK. Второй не будет работать, так как нет строки, которая бы работала так на строке, AFAIK. (Где AFAIK представляет «насколько я знаю»)