Вы должны написать программу или функцию, которая берет строку в скобках и выводит, соответствует ли эта строка полностью. Ваша программа должна напечатать истинное или ложное значение, и IO может быть в любом разумном формате .
Правила и определения:
Для этого вызова, «скобка» представляет собой любая из этих символов:
()[]{}<>
.Пара скобок считается "совпавшей", если открывающая и закрывающая скобки расположены в правильном порядке и в них нет символов, например
() []{}
Или если каждый подэлемент внутри него также совпадает.
[()()()()] {<[]>} (()())
Субэлементы также могут быть вложены в несколько слоев.
[(){<><>[()]}<>()] <[{((()))}]>
Строка считается «Полностью сопоставленной», если и только если:
Каждый отдельный символ - это скобка,
Каждая пара скобок имеет правильные открывающую и закрывающую скобки и в правильном порядке, и
Каждая скобка соответствует.
Вы можете предположить, что ввод будет содержать только печатный ASCII .
Тест IO
Вот некоторые входные данные, которые должны возвращать истинное значение:
()
[](){}<>
(((())))
({[<>]})
[{()<>()}[]]
[([]{})<{[()<()>]}()>{}]
А вот некоторые результаты, которые должны возвращать ложное значение:
( Has no closing ')'
}{ Wrong order
(<)> Each pair contains only half of a matched element
(()()foobar) Contains invalid characters
[({}<>)> The last bracket should be ']' instead of '>'
(((())) Has 4 opening brackets, but only 3 closing brackets.
Как обычно, это код-гольф, поэтому применяются стандартные лазейки, и выигрывает кратчайший ответ в байтах.
источник
[}
совпадение? И если нет, то где это исключено этими правилами?Each pair of brackets has the correct opening and closing bracket and in the right order.
Ответы:
05AB1E , 19 байтов
Вход дан в кавычках . Код:
Ну дерьмо, много ошибок и нереализованных функций было найдено. Объяснение:
Это на самом деле сложная часть. Как это выглядит в псевдокоде:
Это покрыто этой частью из кода 05AB1E :
Как видите, это бесконечная замена (выполняется до тех пор, пока строка больше не изменится). Так что мне не нужно беспокоиться о том, чтобы заменить замену в цикле, так как это уже встроено. После того:
Использует кодировку CP-1252 . Попробуйте онлайн! (слегка изменено, поскольку вышеприведенная версия устарела).
источник
õ
было добавлено?Brain-Flak ,
1101, 1085, 981 байтПопробуйте онлайн!
Это 980 байт исходного кода, и
+1
для-a
флага, допускающего ввод ASCII (но десятичный вывод)Это ответ , который я давно хотел написать для очень и очень долго. Не менее 6 месяцев. Я ждал, чтобы опубликовать это, потому что я знал, что ответить на этот вызов будет очень сложно в мозгу. Но оно того стоит по одной очень важной причине: исходный код сам по себе является правдоподобным вводом, который и составляет весь смысл самого этого языка.
И как я уже писал здесь , этот вопрос вдохновил меня на написание мозгов.
Этот ответ занял примерно два часа, чтобы написать. Я признаю, что это довольно плохо, в основном потому, что большая часть кода повторяется для каждого типа скобок. Но я больше всего удивлен, что мне вообще удалось написать ответ, особенно учитывая, что Brain-Flak
Я собираюсь попытаться сыграть в гольф позже, но я все равно хотел это сделать.
У меня есть подробное объяснение, но оно имеет длину около 6 тысяч символов, поэтому я думаю, что было бы неразумно вставлять все это в этот ответ. Вы можете прочитать это здесь, если хотите. Я добавлю более короткое объяснение здесь.
Основная идея заключается в том, что мы повторяем следующие шаги для каждого символа в стеке:
Мы проверяем каждый символ, чтобы увидеть, соответствует ли он какой-либо скобке. Если это открывающая скобка, мы помещаем число в другой стек в соответствии со следующим отображением:
Затем мы проверяем, соответствует ли оно какой-либо закрывающей скобке. Если это так, мы помещаем эквивалентное число в альтернативный стек, как для открывающих скобок. Затем мы проверяем, равны ли два верхних числа. Если они есть, оба выскочили, и программа продолжилась как обычно. Если это не так, мы очищаем оба стека (чтобы остановить цикл) и помещаем единицу в альтернативный стек. По сути, это утверждение «перерыв».
После проверки 8 типов скобок мы пропускаем значение этого цикла. Поскольку мы обнуляем большую его часть, единственными фрагментами, которые имеют какое-либо значение, являются условия, когда мы сравниваем их в скобках. Таким образом, если сопоставляется какая-либо скобка, весь цикл имеет значение 1. Если ни один из них не сделал, весь цикл имеет значение 0. В этом случае мы очистим оба стека и поместим 0 в альтернативный стек. Опять же, это похоже на заявление «перерыв».
После запуска этого основного цикла все остальное довольно просто. Мы находимся в (пустом) основном стеке, и альтернативный стек является пустым (если скобки были сопоставлены) или непустым, если они не были. Итак, мы запускаем это:
Это поместит 0 или 1 в основной стек, а когда программа завершится, она будет напечатана неявно.
Спасибо @WheatWizard за то, что он предложил хороший чистый "стек" фрагмент "равно" и "не логический", и за регулярное обновление github wiki полезными примерами.
Спасибо @ ASCII-only за написание целочисленного онлайн- метагольфера, который очень помог в написании этой программы
изменения
Удалена некоторая избыточность всплывающих окон
Изменилась логика счетчика нуля
источник
Brain-Flak ,
204196190 байтовПопробуйте онлайн!
-8 байт благодаря Wheat Wizard. -6 байт благодаря Джо Кинг.
объяснение
Эта программа хранит коды символов всех текущих незакрытых скобок во втором стеке. Пары скобок
<>
,[]
и{}
имеют коды символов , которые отличаются ровно 2, поэтому нет необходимости проверять их специально. Пара()
отличается только на 1, поэтому мы проверяем, что(
именно, и эффективно уменьшаем этот байт (фактически увеличиваем каждый второй байт) перед продолжением.источник
([{}]<>({}))((){[()](<{}>)}{})
({<>[()]}())
на -6 байтJavaScript (ES6),
5250 байтПовторно снимайте скобки, пока результат не станет таким же, как в оригинале, а затем верните false, если строка не пуста.
Редактировать: 2 байта сохранены благодаря @ edc65.
источник
Сетчатка, 20 байт
Попробуйте онлайн
источник
CJam,
25242321 байтСпасибо Sp3000 за сохранение 2 байта.
Спасибо jimmy23013 за сохранение 2 байта.
Тестирование.
Работает в основном так же , как другие ответы: мы неоднократно удалить
()
,[]
,<>
и{}
из строки и проверить , если мы в конечном итоге с пустой строкой. Чтобы не проверять, когда мы закончим, мы удаляем парыN
времен, гдеN
есть длина строки, которая всегда достаточна (поскольку каждая итерация удалит как минимум два символа, если мы не закончили). Я рад видеть, что это не побеждает Retina. :) (хотя Pyth или Jelly могли бы ...)Здесь есть одна забавная игра в гольф: чтобы получить строку,
()<>[]{}
мы используем следующее:Это
{()<>}
просто блок (то есть функция), который содержит другие скобки в виде кода. При этомa
мы оборачиваем блок в массив.`
Stringifies этого массива, который дает"[{()<>}]"
. Наконец, мы сортируем строку с$
, которая переставляет скобки в()<>[]{}
.источник
()<>[]{}`
будет работать так же хорошо, и иметь такое же количество байтов, верно?()<>
это четыре оператора (декремент, инкремент, а затем сравнение или усечение в зависимости от операндов), которые будут выполняться немедленно, тогда как{}
обозначает блок (эквивалент функции CJam), то есть фрагмент кода, который просто выдвигается в стек, не оценивая его сразу. Вот почему мне нужно{}
обернуть()
и<>
, но тогда использованиеa
для размещения всего в массиве короче, чем[...]
.Python, 67 байт
Создает и извлекает выражение, которое выглядит как
и проверяет, является ли результат пустым.
Sp3000 сэкономил 8 байтов, указав, что
[],(),{}
их можно вставлять без кавычек, потому что они являются объектами Python и что два паренса не нужны.источник
Yacc, 119 байт
Не использует регулярные выражения / заменить.
Ungolfed
компиляция
использование
источник
Pyth,
312524 байтаГольф до 25 байтов благодаря FryAmTheEggMan Удалено 1 байт
Попробуйте здесь: Тестовый пакет !
Я все еще новичок Пит, любая помощь приветствуется.
объяснение
Кстати, поздравляю с другим ответом Pyth (который в настоящее время 20 байтов)
источник
Vz=:z"<>|\[]|{}|\(\)"k;!z
. Особенно примечательно, что вам, по сути, никогда не нужно использовать,l
если вам на самом деле не нужно число, и=
автоматически угадывает первую переменную, используемую в выражении. Дайте мне знать, если вы хотите, чтобы я объяснил что-нибудь еще в чатеl
было ненужно, это приятно знать. Сначала я объявил функцию, потому что моя логика была другой, и забыл ее удалить. Должен ли я включить ваш ответ на мой? (Я новичок>. <)Pyth, 20 байт
Попробуйте онлайн: Test Suite
Многократно удаляет вхождений
[]
,()
,<>
и{}
путем расщепления и повторного объединения. Проверяет, является ли полученная строка пустой или нет.источник
Javascript ES6, 54 байта
Использует рекурсивную реализацию замены. Достаточно просто.
источник
Регекс (PCRE аромат),
4137 байтПросто стандартное решение с рекурсивным регулярным выражением.
Спасибо jimmy23013 за бритье 4 байта
источник
Perl,
3433 байтаВключает +2 для
-lp
Запустить с вводом на STDIN:
brackets.pl
:Находит первую пару скобок без чего-либо между ними и удаляет ее, пока они есть. Затем проверяет, является ли последняя строка пустой.
источник
s/\(\)|\[]|<>|{}//&&redo;$_=!$_
сработает? :)Brain-Flak , 204 байта
Попробуйте онлайн!
Не такой короткий, как ответ Нитродена , но использует совсем другой подход. Этот многократно проходит через вход, удаляя соседние совпадающие пары скобок каждый раз, пока не останется ни одного. В этот момент, если в стеке что-то осталось, строка не была полностью согласована.
Объяснение:
источник
Brainfuck, 132 байта
отформатирован:
Ожидается ввод без завершающей строки. Отпечатки
\x00
за ложь и\x01
за правду.Попробуйте онлайн.
Подход: ведите стопку, начиная с
\x01
, и нажимайте на соответствующую закрывающую скобку всякий раз, когда встречается открывающая скобка. Прежде чем проверять, является ли текущий символ открывающей скобкой, сначала проверьте, равна ли она закрывающей скобке в верхней части стека, и если это так, вставьте ее. Если это ни правильная закрывающая скобка, ни открывающая скобка, потребляйте оставшуюся часть ввода, перемещая указатель вправо. В конце проверьте, находится ли указатель рядом с начальным\x01
.источник
Grime v0.1, 34 байта
Отпечатки
1
для матча и0
без матча. Попробуйте онлайн!объяснение
Grime - мой язык сопоставления двухмерных шаблонов, разработанный для этой задачи ; его также можно использовать для сопоставления одномерных строк. Это мой первый ответ. Я изменил Grime сегодня, но только для изменения характера одного элемента синтаксиса (
`
вместо,
), чтобы он не влиял на мой счет.источник
Reng v.3.3, 137 байт, неконкурентный
Попробуй это здесь!
Есть еще немного игры в гольф, но, по крайней мере, это работает. Я добавил команду,
ð
чтобы отслеживать стеки после этого испытания, чтобы это было возможно / легко удаленно. Я объясню это немного, но обычно он отслеживает все повторяющиеся строки и ищет повторы; если есть повторение, то строка неприводима. В противном случае строка будет уменьшена до пустой строки / стека и будет выводиться1
. В противном случае вывод не будет произведен.источник
PowerShell v2 +,
6362 байтаНе могу поймать JavaScript, но в настоящее время вытесняет другие не esolangs.
Подобный подход , как и другие ответы: простой цикл , который продолжается до тех пор , пока мы можем удалить один из
[]
,()
, или<>
(с несколькими посторонними символами , потому что нам нужно , чтобы избежать регулярных выражений специальные). Мы используем$b
в качестве помощника на этом пути, чтобы запомнить, как$a
был установлен наш предыдущий цикл . Неинициализированная переменная$null
, поэтому при первом обнаружении цикла$a
она явно не равна$null
.В конце цикла,
$a
либо пусто, либо нет, а логическое-не в этой строке либо либо,True
либоFalse
.пример
источник
C
121122114 байтовПобритый из 8 байтов благодаря @xsot!
Использует стек.
источник
c%7&2
. На самом деле, вам не нужноk
. Вместо этого вы можете просто увеличиватьi
то, что вы хотите изменить,k
так как вамi
все равно нужно проверить, равен ли он нулю. Что - то вроде этого (непроверенных код):a[99],i;main(c){for(;read(0,&c,1);c%7&2?i+=a[i--]^c/9:(a[++i]=c/9))i+=!strchr("()[]{}<>",c);putchar(48+!i);}
.a[99],i,k;main(c){for(;read(0,&c,!k);c%7&2?k|=a[i--]^c/9:(a[++i]=c/9))k|=!strchr("()[]{}<>",c);putchar(48+!i*!k);}
a[99],i;main(c){for(;read(0,&c,1);c%7&2?i+=a[i]^c/9?1:-1:(a[++i]=c/9))i+=!strchr("()[]{}<>",c);putchar(48+!i);}
но это пока не работает для ввода()))
, так как «выталкивание» из стека фактически не обнуляет значения в массиве.Java 7,
156151 байтЯ не ожидаю, что это получит какие-либо награды, но я еще не видел ответа Java. Кроме того, мне нравится скрываться за PPCG, и мне бы очень хотелось иметь возможность голосовать / комментировать другие ответы.
Ввод дан как параметры программы. Это следует тому же формату, что и многие другие ответы здесь, в том смысле, что он выполняет замену регулярного выражения в цикле. Первоначально у меня был цикл N раз, где N - длина исходной строки, но цикл
Integer.MAX_VALUE
короче:]. Это должно быть нормально, потому чтоInteger.MAX_VALUE
это максимальная длинаString
в Java, поэтому существует неявное предположение, что длина ввода - это то, что Java может обрабатывать. Время выполнения довольно плохое (заняло около 20 минут на моем lappytop) из-за цикла, но я не увидел никаких ограничений на это.источник
Haskell , 151 байт
Попробуйте онлайн!
источник
(#)
должна вызываться с пустой строкой в качестве второго аргумента, вам необходимо сосчитать до количества(#"")
байтов. Также толькоTrue
иFalse
считаются правдивыми / ложными, см. Руководство по правилам игры в гольф .a:x#b:y|a==b=x#y
на байты до 113: попробуйте онлайн!Python 2.7, 96 байт
источник
Python 2, 80 байт
источник
Юлия, 51 байт
Наименее безумный из нескольких вариантов. Неудивительно, что использование силы регулярных выражений является кратчайшим путем к сопоставлению строк, но это действительно только в том случае, если сопоставляемый шаблон является регулярным. Попытка создания рекурсивных шаблонов PCRE приводит к тому, что размер кода увеличивается, либо проверяя, соответствует ли вся строка совпадению, либо привязывая концы, а затем создавая конструкцию, указывающую внутреннее тело для рекурсии регулярного выражения. Ни один из которых не является симпатичным или способствующим коду гольфа.
Объяснение:
Функция многократно удаляет соседние пары скобок из своего единственного аргумента и возвращает true, если она может получить пустую строку таким образом.
источник
sed,
3936 байт (34 для кода, 2 для -r)Попробуйте онлайн!
sed версия того, что кажется стандартным подходом. Требуются расширенные регулярные выражения (
sed -r
)Сохранено 3 байта благодаря шарлатану Cows
источник
a
это:a
иta
спасти байтq
с/./
и сбросить скобки там же. Попробуйте онлайн! Это из-за того, какc
работает05AB1E, 9 байтов
Вход дан в кавычках.
Попробуйте онлайн!
Объяснение:
источник
Clojure, 153 байта
Дольше, чем даже C и Brainfuck отвечает: o
Не использует регулярное выражение, вместо этого использует первый символ, чтобы определить, что представляет собой закрывающий тег, и находит первый индекс, в котором эта скобка сбалансирована (накопленная сумма равна нулю). Затем итеративно проверяет, что то, что в скобках и после скобок, является действительным.
Должен посмотреть, есть ли лучший подход ...
источник
Луа , 295 байт
Безголовая версия
Попробуйте онлайн!
источник
Japt v2.0a0
-!
, 16 байтПопробуй
источник
Р, 298
Подход здесь состоит в том, чтобы преобразовать последовательность в код R, а затем попытаться проанализировать и оценить ее. Если это дает ошибку, вернитесь
FALSE
.Но есть небольшая проблема ... Правила R для скобок различны, поэтому
<
и>
вовсе не являются скобками, а другие типы имеют свои собственные правила. Это решается с помощью революционного подхода - скриповой функции, единственная функция которой - сигнализировать об ошибке, если ее голова и хвост скрипят по-разному.Например,
[]
превращается вS('[', {}, ']')
, где S определяется как ...Поскольку писк головы и писк хвоста совпадают, ошибки не выдается.
Несколько других примеров (левая часть представляет собой последовательность скобок, а правая часть представляет собой ее преобразование в действительный код R, который можно оценить):
Некоторые другие последовательности скобок приведут к ошибкам разбора:
Таким образом, оставшаяся часть просто перехватывает ошибки и возвращает FALSE, если они есть, и TRUE, если их нет.
Читаемый человеком код:
Применяя его в примерах:
источник