Зафіксуйте дужки тощо


15

Ваша місія, якщо ви вирішите прийняти його, щоб додати в мінімальне кількість дужок, дужки, і дужки , щоб зробити даний рядок (що містить тільки круглі дужки, фігурні дужки, і дужки) мають правильну відповідність дужок. Зв'язки доданих символів повинні бути розірвані, маючи максимальну відстань між парними дужками. Ви повинні повернути лише одну правильну відповідь, яка відповідає цим двом правилам; Подальші зв'язки, якщо вони існують, можуть бути порушені будь-яким способом, який ви вважаєте за потрібне.

Приклади:

input      output
                          // Empty String is a legal input
[          []             // Boring example
[()]       [()]           // Do nothing if there's nothing to be done
({{        ({{}})         // NOT (){}{} (0 + 0 + 0). Maximum distance is 4 + 2 + 0, ({{}})
[([{])]}   {[([{}])]}     // NOT [([])]{[([])]} or similar

Ви можете написати програму або функцію , отримавши вхід через STDIN як аргумент рядка до вашої функції, який повертає результат у вигляді рядка або друкує його в STDOUT (або найближчу альтернативу). Ви можете необов'язково включати в висновок один зворотний новий рядок.

Ви можете припустити, що рядок введення складається лише з 6 таких символів (або їх відсутність): [](){}(Вам не потрібно підтримувати <>)

Це , найкоротший виграш програми. Звичайно, стандартні лазівки заборонені .


Ви мали на увазі повторити заголовок безпосередньо під фактичним заголовком або повторити тег безпосередньо над фактичними тегами? Просто запитуємо на випадок, якщо ви скопіювали вставлені з Sandbox та забули їх видалити.
Rainbolt

@Rainbolt Перший ні (пісочниця), останній так
durron597

1
@AlexA. Я бачу, як вони відрізняються другорядними способами, але думаю, що вони занадто схожі, щоб вважати їх окремими питаннями.
NinjaBearMonkey

Справедливо. Це, звичайно, не різане і сухе, і я не буду продовжувати його закривати, якщо інші вирішать цього не робити.
NinjaBearMonkey

Я вважав би це досить різним. Проголосували за повторне відкриття.
nderscore

Відповіді:


1

Пітон 2 - 198

Я сподівався трохи більше зрозуміти, але зараз не маю багато часу, щоб реально перевірити різні способи вчинити.

s="()[]{}";f=s.find
def F(S):
 r=m=""
 for c in S:
    i=f(c)^1
    if i%2:m=c+m;r+=c
    else:
     for d in m:
        if d==s[i]:break
        r+=s[f(d)^1]
     else:r=s[i]+r+c
     m=m[1:]
 for c in m:r+=s[f(c)^1]
 return r

ОП не включав такий приклад, як {[([{}])]}{[(із суміжними групами), але необхідна ця функціональність, чи виводиться правильно{[([{}])]}{[]}


Як це 198 байт?
Zacharý

@ZacharyT, вкладки ( \t) отримують форматування у вигляді 4 пробілів у переповненні стека, але я фактично чергую вкладки та пробіли (ви можете це зробити для рівнів відступу в Python 2, а не 3), тому перший рівень [space]другий, [tab]третій - [tab][space]четвертий [tab][tab]. Введення коду з пробілами дає мені 227 звідси mothereff.in/byte-counter , і я рахую 10 вкладок, так що 227 - (3 * 10) = 197. Ага, я думаю, я насправді перерахував 1 шлях назад, коли я опублікував це.
KSab

ДАНЬ! Це дійсно хороший трюк. (Введіть наприкінці рядка). Ви можете комбінувати нижній for-цикл та return-оператор, return r+[s[f(c)^1]for c in m]щоб зберегти байти.
Zacharý

1

Хаскелл, 513

Функція h. Попередня версія не дала правильних відповідей на "({{)["та"({{)}}"

import Control.Monad

m '('=')'
m '['=']'
m '{'='}'
m ')'='('
m ']'='['
m '}'='{'

data B=B Char[B]|N[B]|Z B Char[B]
instance Eq B where(==)a b=q a==q b
instance Ord B where(<=)a b=q a<=q b

w(B o s)=o:(s>>=w)++[m o]
v(N k)=k>>=w
n(B _ k)=(sum$n<$>k)+1
q(N k)=sum$n<$>k

u(Z(Z g pc pk) c k)=Z g pc(pk++[B c k])
u(Z(N pk) c k)=N(pk++[B c k])
t(N k)=N k
t z=t$u z

f z c|elem c "([{"=[Z z c[]]
f z@(Z p o k) c|m c==o=[u z]|2>1=(u$Z(Z p o [])(m c)k):f(u z)c
f (N k)c=[Z(N[])(m c)k]

h s=v.minimum$t<$>foldM f(N [])s
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.