Есть ли скрытые скобки?


12

Кто-то дал нам строку, но все символы в скобках были заменены на обычные, и мы не знаем, какие или даже сколько их было. Все, что мы знаем, это то, что если бы L1,L2,L3,...,LNбыли разные виды левых скобок и R1,R2,R3,...,RNбыли разные соответствующие виды правых скобок, причем все они отличались друг от друга (2N разных символов скобок), строка была бы действительной, если бы она была одной из (+ - нормальная конкатенация строк):

  • L1+X+R1, L2+X+R2...,, LN+X+RNгде Xдопустимая строка,

  • X+Yгде Xи где Yдопустимы строки,

  • Любой отдельный символ, который не является символом скобки.

  • Пустая строка

Мы знаем, что они начали с правильной строки, прежде чем сменили скобки, и они не изменили их на символы, которые уже существовали в строке. По крайней мере одна пара существовала для каждой скобки. Можете ли вы восстановить, какие символы изначально были парами левой и правой скобок (найти Liи Riвыполнить заданные условия)?

Выведите пары символов, которые были в скобках. Например, если на (){}[]самом деле это были символы в скобках, вы можете вывести (){}[]или {}[]()или [](){}, и т. Д. Для строки может быть несколько способов сделать это, вам нужно только вернуть один из них, чтобы не было присвоения скобок с большим количеством пар (см. Примеры). Обратите внимание, что выходная строка всегда должна иметь четную длину.

Примеры:

abcc- cне может быть скобкой, поскольку нет другого символа с двумя вхождениями, но abможет быть парой скобок, так что вы бы точно вывели ab.

fffff - любая строка, содержащая не более одного символа, не может иметь скобок, поэтому вы должны вернуть пустую строку или ничего не выводить.

aedbedebdcecdec - эта строка не может иметь никаких скобок, потому что есть 1 a, 2 bs, 3 cs, 4 ds и 5 es, поэтому два символа не встречаются одинаковое количество раз, что является обязательным условием для использования скобок.

abcd- возможные присвоения ab, cd, abcd, cdab, adbc, bcad, ac, ad, bcи bd, (а также пустые уступки, что все они имеют) , но вы должны вернуть один из самых длинных заданий, так что вы должны вернуться abcd, cdab, adbcили bcad.

aabbcc, abc- они оба имеют ab, acи bcкак действительные пары. Вы должны вернуть одну из этих пар, не важно, какая.

abbac- a и b имеют одинаковое количество символов, но на самом деле они не могут работать, поскольку один из них встречается слева и справа от всех вхождений другого. Ничего не вернуть

aabcdb- cdи abточные две пары кронштейнов, так что выход либо cdabили abcd.

abcdacbd- только одна пара может быть достигнута сразу, но ab, ac, bd, cd, и adвсе из возможных пар вы можете вернуться. Независимо от того , какая пара вы выбираете, он имеет случай , когда один другой персонаж находится в нем, который запрещает любые другие пары, за исключением случая ad, когда другие пары bcи cbне представляется возможным в одиночку либо, и поэтому не может быть возможным с ad.

Это код гольф, поэтому выигрывает самый короткий код в байтах. Ввод из STDIN, если это возможно для вашего языка. Если это невозможно, укажите способ ввода в своем ответе.


1
для ввода abcdвывод adbcтакже будет приемлемым, верно?
Патрик Робертс

Да, я добавил это к примеру.
Фрикативная дыня

Ответы:


4

Рубин, 373 байта

i=gets.chomp
b=[*(i.chars.group_by{|x|x}.group_by{|x,y|y.size}.map{|x|s=x[1].size
x[1][0...s-s%2].map{|x|x[0]}*''}*'').chars.each_slice(2)]
puts [*[*b.size.downto(1).map{|n|b.combination(n).map{|t|[t*'',(h=Hash[t]
s=[]
o=1
i.each_char{|c|s.push(c)if h.keys.include?c
(o=false if s.empty?||!h[s.pop].eql?(c))if h.values.include?c}
o ?s.empty?: o)]}}.find{|x|x[0][1]}][0]][0]

Это использует golfed версию парсера стека здесь .

Вероятно, это можно упростить дальше, но я не думаю, что мой мозг сможет справиться с этим.

Все тестовые случаи: http://ideone.com/gcqDkK

С пробелами: http://ideone.com/pLrsHg

Ungolfed (в основном): http://ideone.com/oM5gKX

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.