Perbaiki Braces, dll

15

Misi Anda, sebaiknya Anda memilih untuk menerimanya, adalah untuk menambahkan dengan minimum jumlah tanda kurung, kawat gigi, dan kurung untuk membuat string yang diberikan (yang hanya berisi tanda kurung, kawat gigi, dan kurung) memiliki pencocokan penjepit yang benar. Ikatan simbol yang ditambahkan harus diputus dengan memiliki jarak maksimum antara kawat gigi yang dipasangkan. Anda harus mengembalikan hanya satu jawaban yang benar yang cocok dengan kedua aturan ini; Ikatan lebih lanjut, jika ada, dapat diputus sesuai keinginan Anda.

Contoh:

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

Anda dapat menulis sebuah program atau fungsi , menerima input melalui STDIN sebagai argumen string ke fungsi Anda, yang mengembalikan output sebagai string atau mencetaknya ke STDOUT (atau alternatif terdekat). Anda dapat secara opsional memasukkan satu baris baru dalam output.

Anda dapat menganggap bahwa string input hanya terdiri dari 6 karakter berikut (atau ketiadaan): [](){}(Anda tidak perlu mendukung <>)

Ini adalah , kemenangan program terpendek. Tentu saja celah standar dilarang .

durron597
sumber
Apakah Anda bermaksud mengulangi judul secara langsung di bawah judul yang sebenarnya, atau mengulangi tag langsung di atas tag yang sebenarnya? Hanya bertanya jika Anda menyalin disisipkan dari Sandbox dan lupa untuk menghapusnya.
Rainbolt
@ Rainbolt Mantan tidak ada (kotak pasir), yang terakhir ya
durron597
1
@AlexA. Saya dapat melihat bagaimana mereka berbeda dalam hal-hal kecil, tetapi saya pikir mereka terlalu mirip untuk dianggap sebagai pertanyaan terpisah.
NinjaBearMonkey
Cukup adil. Ini tentu saja bukan potong-dan-kering, dan saya tidak akan mengejar menutupnya jika orang lain memutuskan untuk tidak melakukannya.
NinjaBearMonkey
Saya akan menganggapnya cukup berbeda. Memilih untuk membuka kembali.
nderscore

Jawaban:

1

Python 2 - 198

Saya berharap untuk mendapatkan beberapa pemahaman lebih sedikit tetapi tidak punya banyak waktu sekarang untuk benar-benar menguji berbagai cara dalam melakukan sesuatu.

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

OP tidak termasuk contoh suka {[([{}])]}{[ (dengan grup yang berdekatan), tetapi apakah fungsionalitas ini diperlukan atau tidak, ini menghasilkan yang benar{[([{}])]}{[]}

KSab
sumber
Bagaimana itu 198 byte?
Zacharý
@ ZacharyT, tabs ( \t) diformat sebagai 4 spasi pada stack overflow tapi saya sebenarnya berganti-ganti tab dan spasi (Anda dapat melakukan ini untuk tingkat lekukan di Python 2, bukan 3) jadi level pertama adalah [space]kedua adalah [tab]ketiga adalah [tab][space]sebagainya adalah [tab][tab]. Memasukkan kode dengan spasi memberi saya 227 dari sini mothereff.in/byte-counter , dan saya menghitung 10 tab jadi 227 - (3 * 10) = 197. Huh, saya kira saya benar-benar dihitung berlebihan dengan 1 jalan kembali ketika saya diposting ini.
KSab
BERBAHAYA! Itu trik yang sangat bagus. (Masukkan di akhir baris). Anda dapat menggabungkan bagian bawah untuk-loop dan pernyataan-kembali return r+[s[f(c)^1]for c in m]untuk menyimpan byte.
Zacharý
1

Haskell, 513

Fungsinya h. Versi sebelumnya tidak memberikan jawaban yang benar untuk "({{)["dan"({{)}}"

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
Mat
sumber