Это была одна из серии задач, которые привели к дню рождения Брейн-Флака. Узнайте больше здесь .
Вызов
Для этой задачи вашей целью будет найти самую первую пару совпадающих скобок в полностью согласованной цепочке ()[]{}<>
скобок. Чтобы позаимствовать определение DJMcMayhem полностью совпадающей строки:
Для этого вызова, «скобка» представляет собой любая из этих символов:
()[]{}<>
.Пара скобок считается "совпавшей", если открывающая и закрывающая скобки расположены в правильном порядке и в них нет символов, например
() []{}
Или если каждый подэлемент внутри него также совпадает.
[()()()()] {<[]>} (()())
Субэлементы также могут быть вложены в несколько слоев.
[(){<><>[()]}<>()] <[{((()))}]>
Строка считается «полностью согласованной» тогда и только тогда, когда каждая пара скобок имеет правильную открывающую и закрывающую скобки в правильном порядке.
вход
Ввод будет состоять из единственной непустой строки или массива char, содержащего только символы ()[]{}<>
, и гарантированно будет полностью согласован. Вы можете принимать входные данные любым разумным способом, который соответствует нашим настройкам ввода-вывода .
Выход
Результатом вашей программы или функции будет индекс скобки, закрывающей первую. Выход должен быть 0
или 1
индексироваться. Опять же, вывод может быть любым разумным способом, который соответствует нашим значениям по умолчанию для ввода / вывода .
Тестовые случаи
Input 0-indexed 1-indexed
() 1 2
(<>) 3 4
<[]{<>}> 7 8
{}{}{}{} 1 2
[[]<>[]] 7 8
Это код-гольф , побеждает меньше байтов!
Ответы:
V , 4 байта
Попробуйте онлайн!
Это, в отличие от большинства ответов V, использует 0-индексирование. Я очень горжусь этим ответом и тем, как далеко зашёл мой язык. Объяснение:
источник
Brain-Flak ,
685, 155, 151, 137 байтПопробуйте онлайн!
136 байт кода плюс один байт для
-a
. Один проиндексирован.530 байтов в игре! Это, наверное, самый большой гольф, который я когда-либо делал.
14 байтов сохранено благодаря Райли!
Это нарушает формулу открывающей / закрывающей скобки: если вы берете значения ASCII, увеличиваете его на единицу и берете по модулю 4, openers (
({[<
) всегда получает0
или1
, тогда как closers ()}]>
) всегда получает 2 или 3.Объяснение:
источник
n-1&2
/n+1&2
/-n&2
илиn%7&2
различают открывающие и закрывающие скобки ...&2
, но я посмотрю на это.0
/1
и2
/3
... хотя теперь, когда я смотрю на это, вы просто уменьшаете, если положительный результат.(TOS+1)%4
Может быть короче: Попробуйте его в Интернете!05AB1E ,
17 1610 байт-1 благодаря carusocomputing
-6 спасибо Аднану за его удивительное понимание того, что «после приращения второй последний бит равен 0 для открывающей скобки и 1 для закрывающей скобки»
Попробуйте онлайн!
источник
žu
кажется пригодным для использования здесь.žu8ÝÈÏ
так что нет, не очень. В лучшем случае это все равно будет 5 байтов. Я больше думал о разделении на пары фигурных скобок и удалении фигурных скобок до тех пор, пока не останется только одна пара, увеличивая счетчик на 2 для каждой удаленной пары. Я понятия не имею, если это меньше, хотя. Попробуй это, атм.Ç>2&<.pO0k
.0
для открывающей скобки и1
для закрывающей скобки.Vim, 23 байта
Попробуйте онлайн!
Мне очень грустно об этом ответе. Это решение красиво элегантно и коротко, но по умолчанию vim не учитывает
<
и не>
может быть сопоставлено, поэтому мне нужно 13 байтов стандартного кода. В противном случае это будет всего 10 байтов.Я бы написал V-ответ, но он был бы всего на один байт короче, а именно изменился
Vr
наÒ
, такVr
как это обычная vim-идиома.Это 1-индексированный, но может быть тривиально изменен, чтобы быть 0-индексированным, изменив на
1
a0
.источник
Желе ,
11109 байтПопробуйте онлайн!
объяснение
Идея здесь состояла в том, чтобы найти «волшебную формулу», которая может отличить открывающие и закрывающие скобки. Первоначально я использовал
O%7&2
(то есть "взять код ASCII, по модулю 7, поразрядно и 2"), но предложил @ETHproductionsO’&2
(который заменяет модуль 7 с уменьшением); оба возвращают 0 для одного вида скобок и 2 для другого. Вычитание 1 (’
) превратит эти результаты в -1 и 1.Остальная часть кода есть
+\
.+\
производит накопленную сумму. Если набор скобок правильно сопоставлен, он будет содержать одинаковое количество -1 и 1, то есть его совокупная сумма будет равна 0. Тогда нам просто нужно вернуть индекс первого 0 в результирующем списке; мы можем сделать это сi0
.источник
b*2%7>3
Сетчатка ,
2624 байтаПопробуйте онлайн!
Результат основан на 1.
объяснение
Совсем другое решение Retina, основанное на единственном (и очень читаемом ...) регулярном выражении. Это использует новую технику, которую я обнаружил вчера для сопоставления сбалансированных строк с использованием балансировочных групп .
Найти (
M
) и вернуть (!
) все совпадения регулярного выражения^.(?<-1>([[({<])*.)*
. Это регулярное выражение пропускает первый символ строки, а затем использует балансировочные группы для отслеживания глубины вложения. Любое[({<
увеличение глубины (отслеживание по группам1
) и любой другой символ уменьшает глубину (в принципе,.
позволяет также уменьшать глубину, открывая скобки, но поскольку регулярное выражение сопоставляется жадно, средство отслеживания никогда не будет пытаться это сделать ). Странный трюк заключается в том, что(?<-1>...)
включающая группа1
работает, потому что выталкивание из уравновешивающей группы происходит в конце группы. Это экономит два байта по сравнению со стандартным подходом в форме((open)|(?<-2>close))*
, Совпадение обязательно останавливается на скобке, которая закрывает первую, потому что мы ее пропустили, поэтому она не учитывается в глубине стека (и глубина стека не может быть отрицательной).Длина этого соответствия - это основанный на 0 индекс скобки, которую мы ищем.
Просто посчитайте количество пустых совпадений в этой строке. Пустое регулярное выражение всегда совпадает один раз с количеством символов в строке, так что это дает нам основанный на 1 индекс скобки, которую мы ищем.
источник
Сетчатка , 24 байта
Попробуйте онлайн!
Это вдохновлено решением Мартина Эндера .
объяснение
Первая строка - это регулярное выражение, которое соответствует символу, за которым следует сбалансированная строка, идущая до конца основной строки (подробное объяснение того, как балансировочные группы используются в этом регулярном выражении, см. В ответе Мартина). Поскольку регулярные выражения ищут совпадения слева направо, будет найден самый длинный сбалансированный правильный подфикс, то есть все, что после скобки, закрывающей первый, плюс сама скобка.
Следующая строка пуста, поэтому мы заменяем совпадение пустой строкой, а это означает, что теперь нам нужно только подсчитать оставшиеся символы, чтобы получить (индексированный 0) желаемый результат.
Последняя пустая строка подсчитывает количество совпадений пустой строки в строке, что на один больше, чем количество символов в строке, что эквивалентно результату с 1 индексом.
источник
Perl 5 , 28 байт
Сохранено 6 байтов, используя
.
вместо этого ответ Retina[>})\]]
Мартина Эндера .27 байт кода +
-p
флаг.Попробуйте онлайн!
Рекурсивное регулярное выражение, какое прекрасное изобретение.
Регулярное выражение ищет открывающую скобку (
[<{([]
), за которой следует рекурсивный вызов (?0
), а затем закрывающая скобка (.
). Все это без жадности (+?
), поэтому оно соответствует как можно короче с самого начала. Индекс конца матча является ответом, и, как это происходит, его можно найти в$+[0]
.источник
JavaScript (ES6),
555352 байтаСохранено 1 байт благодаря @Adnan
Для каждой открывающей скобки, взяв ее код-код, мод 4 дает нам 0 или 3; для закрывающих скобок это дает нам 1 или 2. Таким образом, мы можем различить открывающую и закрывающую скобки, отрицая кодовую скобку скобки (которая переворачивает биты и вычитает 1) и беря второй младший значащий бит; то есть
n&2
.источник
n-1&2
,-n&2
также работает?C,
757256555445 байтВидеть это работает онлайн .
Если вы хотите, чтобы выходные данные были проиндексированы 1 вместо 0, замените последний
0
на1
.источник
Python 2,7 + Numpy,
8579 байтМоя первая попытка кода в гольф:
источник
Brain-Flak , 97 байт (96 для кода, 1 для флага)
Беги с
-a
флагом.Попробуйте онлайн!
Объяснение:
Это просто работает, хорошо.
источник
Сетчатка , 34 байта
Попробуйте онлайн!
Результат основан на 0.
объяснение
Заменить первый символ на
!
. Это приводит к тому, что скобка, которую мы ищем, не имеет себе равных.Преобразуйте скобки, квадратные скобки и скобки в угловые скобки. Поскольку строка гарантированно полностью соответствует, мы не заботимся о фактических типах вообще, и это экономит несколько байтов на следующем шаге.
Повторно (
+
) заменять каждый символ во всех совпадениях<!*>
с на!
s. То есть мы сопоставляем пары скобок, которые не содержат дальнейших необработанных скобок, и превращаем их в дополнительные восклицательные знаки. Это превратит всю строку за исключением непревзойденной закрывающей скобки в восклицательные знаки.Подсчитайте количество начальных восклицательных знаков, которое равно нулю позиции первого не восклицательного знака (то есть непревзойденной скобки). Каждый из
\G
якорей соответствует предыдущему, поэтому это не учитывает!
s после указанной скобки.источник
(?!(2))
это просто(?!2)
. Вы, вероятно, имели в виду(?(2)(?!))
или(?2)!)
. Вы также забыли сбежать,]
и финал+
должен быть*
.PHP, 116 байт
Онлайн версия
источник
<?php
?Python , 76 байт
Рекурсивная функция, которая использует порядковый 2-й LSB в качестве флага для трюка open vs close, используемого многими, найденными Аднаном (и, возможно, другими). Хвост поражает, когда совокупная сумма
-1
для открытия и1
закрытия достигает нуля. Индекс хранится в переменной, так как он стоит дешевле, чем при использованииlen(r)
, индексирование основано на 1.Попробуйте онлайн!
источник
Рубин,
3534 байтаНа основании ответа Даля Perl5 . Выход 1 индексируется. Требуется, чтобы интерпретатор Ruby вызывался с
-n
параметром (неявнымwhile gets
цикл).Изменить: Это также
3534 байтов, но это еще одна возможная отправная точка для дальнейшего сокращения этого ответа.Edit2: удалены ненужные пробелы после
p
.Edit3: еще пара 34-байтовых ответов.
источник
Python 3 ,
59555049 байтВывод 0 проиндексирован. Формула для определения направления скобки была впервые обнаружена @ETHProductions и улучшена @Adnan.
Попробуйте онлайн!
источник
Пакет, 172 байта
1-индексироваться.
<>
Это, конечно, специальные символы в пакетном режиме, поэтому я не только должен цитировать все подряд, но я даже не могу делать такие трюки, как создание ихgoto
ярлыков.источник
R, 126 байт
источник
C 127 байтов
Попробуйте онлайн
Выход
источник