Вы менеджер проекта. Однажды один из ваших программистов сошел с ума ( не по вашей вине ) и взял все выражения в кодовой базе и добавил к ним случайные скобки, прежде чем выйти на месте, разглагольствуя о вашей некомпетентности ( также не по вашей вине ). Это было бы легко исправить, однако, по какой-то причине вы не используете контроль версий ( совсем не ваша вина ). И по какой-то причине никто из других программистов не хочет просматривать каждое выражение, чтобы исправить несоответствующие скобки ( кстати, это не ваша ошибка ). Программисты в эти дни думают про себя. Вам придется сделать это самостоятельно. Ужас! Такие задачи должны были быть под вами ...
Ввод будет состоять из одной строки, которая будет содержать несколько левых скобок ( ( [ {
) и правых скобок ( ) ] }
). Он также может, но не всегда, содержать комментарии ( /* */
) и строковые литералы ( " "
или ' '
), а также различные числа, буквы или символы.
Будет по крайней мере одна скобка (вне комментария или строкового литерала), которая не имеет противоположной противоположности (вне комментария или строкового литерала). Например, странствующий }
без {
предварительного. Другой пример: у (
которого нет )
потом. Ваша программа заменит пробелом минимальное количество скобок, необходимое для совпадения скобок.
Примеры:
(4 + (2 + 3))]
==> (4 + (2 + 3))
(квадратная скобка в конце)
][][[]]
==> [][[]]
(квадратная скобка в начале)
("Hel(o!"))
==> ("Hel(o!")
(скобка в конце)
( /* )]*/
==> /* )]*/
(скобка в начале)
{()]
==> ()
(фигурная скобка и квадратная скобка)
- Ввод может быть получен любым удобным способом (STDIN, аргумент командной строки, чтение из файла и т. Д.)
- Если существует несколько способов устранения несоответствия с одинаковым количеством удалений, любой из них является приемлемым.
- В скобках будут только несоответствия. Строковые литералы и комментарии всегда будут правильно сформированы.
- Название происходит из этой темы
- Никогда не будет никаких кавычек в комментариях, кавычек в кавычках, комментариев в комментариях или комментариев в кавычках.
Это код гольф, поэтому выигрывает минимальное количество байтов. Задавайте вопросы в комментариях, если спецификация не ясна.
источник
("foo (\") bar")
)?{{(})
должен быть{ }
или эквивалентен, так как сценарий открытия подразумевает, что код работал с самого начала, и{(})
считается как несовпадающие скобки в каждом языке программирования, который я знаю (то есть «вызывает стазис» ??). Но тогда я уже написал ответ, поэтому я пристрастен.Ответы:
Рубин, 223 символа
Этот оказался немного длинным.
Сначала он извлекает строки и комментарии, чтобы они не учитывались (и возвращал их позже).
Затем он проходит через строку символ за символом. Когда он находит открывающую скобку, он сохраняет свою позицию. Когда он находит закрывающую фигурную скобку, он появляется из соответствующего массива хранения открытой фигурной скобки.
Если
pop
возвращаетсяnil
(т. Е. Не было достаточно открывающих скобок), он удаляет закрывающую скобку. После того, как все это сделано, удаляются оставшиеся дополнительные открывающие скобки (то есть не хватает закрывающих скобок).В конце программы он возвращает все строки и комментарии обратно и выводит их.
Ungolfed:
источник
(("string"/*comment*/)"string"
? Если я правильно читаю (версия без заглавных букв), вы заменяете строки и комментарии их индексами вunparsed
массиве, что приводит к подстановке,((12)3
а затем ищет несуществующий индекс12
(или11
). Я вижу, что гольф-версия просто используетshift
, но не может ли она все еще иметь подобную проблему?Python 3,
410322317Пытается выполнить все возможные наборы удалений, начиная с более мелких, до тех пор, пока не найдет тот, в котором скобки сбалансированы. (Под этим я подразумеваю полностью правильно сбалансированный:
{{(})
производит( )
, а не{(})
.)Первая версия использовала функцию рекурсивного генератора, которая была действительно крутой, но и очень длинной. Эта версия выполняет простой поиск в ширину с использованием очереди. (Да, это алгоритм факторного времени. В чем проблема?: ^ D)
источник
С - 406
Попытка в C без использования регулярных выражений.
Чтобы скомпилировать и запустить (на компьютере с Linux):
gcc -o brackets brackets.c
./brackets "[(])"
В неопределенных случаях, таких как [(]), он возвращает последнюю действительную пару скобок ()
источник
Питон 3, 320
Как и решение DLosc, в нем исследуются все возможные удаления, но в нем используется рекурсивная стратегия исследования и восстановления, которая намного быстрее. Я знаю, что скорость не является критерием в кодовом гольфе, и исчерпывающий поиск в любом случае экспоненциальный, но этот может обрабатывать входные данные, как
({({({({({({({({(}}}}}}}}
за пару секунд.источник
O(n!!)
решение, а неO(n!)
. (Мой гольфO(n*2^n)
вместо тогоO(2^n)
, потому что наo
самом деле он производит все модели вплоть доr
удаления, а не простоr
удаления. Легко исправить, но это будет стоить несколько символов.)