Чи є дужки замасковані?


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

Безголовки (в основному): http://ideone.com/oM5gKX

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.