Напишите программу или функцию, которая принимает восьмибайтовую строку, содержащую один из каждого символа, ()[]{}<>
расположенного любым образом, так чтобы четыре соответствующих типа скобок совпадали. Например, ]<([){}>
неверный ввод, потому что квадратные скобки не совпадают (хотя все остальные совпадают).
Выведите или верните целое число от 0
до 6
, обозначающее, сколько из шести возможных пар четырех типов скобок заблокировано. Пары типа скобок считаются блокированными, если между скобками другого типа встречается ровно одна скобка одного типа. Так ([)]
и [(])
сцепляются , но ()[]
, []()
, ([])
и [()]
нет.
Самый короткий код в байтах побеждает.
Примеры ввода / вывода
()[]{}<> : 0
([{<>}]) : 0
<>{[]}() : 0
{<>([])} : 0
<(>)[{}] : 1
<[({)}]> : 1
[{<}]>() : 2
{<>([}]) : 2
<{(>})[] : 3
[(]<){>} : 3
<([>{)}] : 4
(<{[>})] : 4
(<[{)>}] : 5
<{[(>})] : 5
[{<(]}>) : 6
(<{[)>}] : 6
источник
7~f&
? Мне уже нравится этот ответ, и я даже не прочитал остальную часть этого.Python 2, 163 байта
Это смотрит на вещи между каждой парой соответствующих скобок и подсчитывает количество отдельных левых или правых скобок. Сумма этих значений, деленная на два, является выходной.
Я уверен, что это может быть гораздо лучше, чем я.
источник
GNU sed -r, 147
Выход в унарном соответствии с этим мета-ответом .
Примечание. Замените
\t
действительными tabсимволами, чтобы получить правильный результат. Тем не менее, программа будет работать в любом случае с GNU sed.Попробуйте онлайн .
источник
Perl, 77 байт
76 код + 1 переключатель
Принимает ввод из STDIN, и программа должна быть запущена заново для каждого ввода.
объяснение
y/.../.../
).for$x...
) увеличьте счетчик для символа ($h{$x}++
).length $1
) и удалите оба вхождения этого символа из строки. Например, если строка была([{([{<<
, есть два символа[
и{
между двумя(
s. После обработки(
s, строка становится,[{[{<<
и мы добавляем 2 к общему количеству ($z
) блокирующих скобок.$z
($_=$z
)источник
Pyth, 20 байтов
Тестирование
JmC/CdTz
Во-первых, это преобразует каждую пару символов в один символ путем сопоставления каждого входного символа с его кодом символа (Cd
), деленным на 10 (/ T
), который одинаков для каждой пары, но различен для всех пар. Результирующее число преобразуется обратно в символ для целей, которые будут раскрыты позже (C
). Результирующий список символов сохраняется вJ
.lsm@FPcsJd{J
: Теперь мы сопоставляем уникальные символы вJ
({J
). Мы начнем с обрезки строки, образованной конкатенацией,J
используя текущий символ в качестве delimeter (csJd
). Пара скобок перекрывает текущую пару, если она появляется во второй группе или в первой или третьей группе. Чтобы избежать двойного счета, мы просто посчитаем первый и второй случай группы. Итак, мы удаляем третью группу (P
) и берем пересечение оставшихся групп (@F
). Наконец, мы объединяем символы перекрытия (s
) и печатаем длину resut (l
).источник
Python 3, 107
Сильно основано на моем решении CJam.
источник
Retina ,
128108646255 байтГде
<empty>
представляет собой пустую висячую строку. Для целей подсчета поместите каждую строку в отдельный файл и замените их\n
действительными символами перевода строки. Для удобства вы можете использовать этот эквивалентный код с-s
флагом из одного файла:Выход одинарный .
объяснение
Первый
(
говорит Retina выполнить весь код в цикле, пока итерация не прекратит изменять строку. В этом случае он всегда будет повторяться четыре раза, по одному разу для каждого типа скобок.Это просто превращает каждую закрывающую скобку в соответствующую открывающую скобку, чтобы мы могли сопоставить соответствующие скобки с простой обратной ссылкой позже. (Эта стадия становится недоступной после первой итерации. Она включается только в цикл, потому что
T
уже требуется обратная пометка, поэтому добавление(
стоит только один вместо двух байтов.)Это заменяет крайнюю левую пару скобок символами новой строки. Мы используем,
\D
чтобы отличить скобки от1
s, которые мы добавим позже в цикле для подсчета. В(.*)
конце гарантируется, что будет заменена только одна пара (поскольку совпадения не могут перекрываться).Все регулярные выражения в предвкушении, так что это соответствует позиции . Более конкретно, он соответствует одной позиции для каждой пары скобок, которая была разделена другими скобками, которые мы только что превратили в новые строки. А
1
вставляется в каждую из этих позиций. Мы можем просто оставить1
s там, потому что они не влияют ни на одно из других регулярных выражений (потому что они\D
гарантируют, что мы не совпадем с ними случайно).Наконец, мы удаляем символы новой строки (т. Е. Заполнители для текущего типа скобок) - это означает, что мы сократили оставшуюся проблему до строки длиной 6, содержащей только 3 типа скобок, но в остальном она работает точно так же.
В конце
1
останутся только те s, которые мы вставили, и их количество точно соответствует количеству блокирующих скобок.источник
JavaScript (ES7),
121117 байтВау. Это было весело. Я набросал идею ответа, когда впервые появился этот вызов, но его длина превышала 150 байтов, и я не хотел прикладывать усилия для его игры в гольф. Вчера я наткнулся на эту идею в своей записной книжке и решил, что не перестану думать об этом, пока полностью не поиграю в нее. В итоге я написал два совершенно новых алгоритма, первый из которых оказался на несколько байт короче, после того, как вы проиграли около 25 байт с кучей хитов.
Как это работает
Сначала мы устанавливаем переменные
a
иb
в0
.a
является 4-битным двоичным массивом пар скобок, в котором мы сейчас находимся, иb
16-разрядным двоичным массивом пар скобок, которые связаны вместе.Далее мы перебираем каждый символ
c
вx
и каждый символd
в'0123'
. Сначала мы определяем , какой тип кронштейнаc
находится сe=c.charCodeAt()/26-1|0
. Десятичные коды символов каждого типа скобок:Делив на 26, вычитая 1 и настил, мы сопоставляем их с 0, 1, 2 и 3 соответственно.
Далее мы проверяем, равно ли это число текущему значению
d
. Если это так, мы либо входим, либо выходим изd
типа th скобки, поэтому мы переключаемd
бит tha
с помощьюa^=1<<d
. Если это не так, но мы находимся внутриd
скобки, нам нужно перевернутьe
бит вd
4-битной секцииb
. Это делается так:(a>>d&1)
Возвращаетd
бит вa
. Если мы находимся внутриd
скобочного типа, это возвращает 1; в противном случае возвращается 0. Затем мы сдвигаем это влево наd*4+e
биты, а XORb
- на результат. Если мы находимся внутриd
скобочного типа, то это XORd*4+e
битb
; в противном случае это ничего не делает.В конце всего цикла
b
будет содержаться число 1-бит, равное удвоенному желаемому возвращаемому значению. Но нам все еще нужно выяснить, сколько это битов. Вот гдеf
входит подфункция:Если
y
0, это просто возвращает 0. В противном случае, он принимает последний битy
сy%2
, а затем добавляет результатy
повторного выполнения всех функций, кроме последнего, через функцию. Например:Мы пробегаем
b
эту функцию и делим результат на 2, и наш ответ есть.источник
Oracle SQL 11.2, 206 байт
Без гольфа:
источник