Sửa niềng răng, v.v.


15

Nhiệm vụ của bạn, nên bạn chọn để chấp nhận nó, là để thêm các tối thiểu số dấu ngoặc đơn, dấu ngoặc, và dấu ngoặc để thực hiện một chuỗi cho trước (chỉ chứa dấu ngoặc đơn, dấu ngoặc, và khung) có phù hợp với cú đúp đúng. Các ràng buộc của các biểu tượng được thêm vào phải được phá vỡ bằng cách có khoảng cách tối đa giữa các dấu ngoặc nhọn. Bạn phải trả lại chỉ một câu trả lời đúng phù hợp với hai quy tắc này; Mối quan hệ xa hơn, nếu chúng tồn tại, có thể bị phá vỡ bất kỳ cách nào bạn thấy phù hợp.

Ví dụ:

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

Bạn có thể viết chương trình hoặc hàm , nhận đầu vào qua STDIN dưới dạng đối số chuỗi cho hàm của bạn, trả về đầu ra dưới dạng chuỗi hoặc in ra STDOUT (hoặc thay thế gần nhất). Bạn có thể tùy ý bao gồm một dòng mới duy nhất trong đầu ra.

Bạn có thể giả sử chuỗi đầu vào chỉ bao gồm 6 ký tự sau (hoặc thiếu ký tự sau): [](){}(Bạn không cần hỗ trợ <>)

Đây là , chương trình chiến thắng ngắn nhất. Tất nhiên, sơ hở bị cấm .


Bạn có nghĩa là lặp lại tiêu đề trực tiếp bên dưới tiêu đề thực tế, hoặc lặp lại thẻ trực tiếp trên các thẻ thực tế? Chỉ cần hỏi trong trường hợp bạn sao chép dán từ Sandbox và quên xóa chúng.
Rainbolt

@Rainbolt Cái trước không (hộp cát), cái sau có
durron597 27/05/2015

1
@AlexA. Tôi có thể thấy chúng khác nhau như thế nào theo những cách nhỏ, nhưng tôi nghĩ chúng quá giống nhau để được coi là những câu hỏi riêng biệt.
NinjaBearMonkey

Đủ công bằng. Nó chắc chắn không bị khô và tôi sẽ không theo đuổi việc đóng cửa nếu người khác quyết định không.
NinjaBearMonkey 27/05/2015

Tôi sẽ xem xét nó đủ khác nhau. Bình chọn để mở lại.
nderscore

Câu trả lời:


1

Con trăn 2 - 198

Tôi đã hy vọng có được một số hiểu biết hơn một chút nhưng không có nhiều thời gian ngay bây giờ để thực sự kiểm tra các cách làm khác nhau.

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 không bao gồm một ví dụ như {[([{}])]}{[(với các nhóm liền kề), nhưng liệu chức năng này có được yêu cầu hay không, điều này có đúng hay không{[([{}])]}{[]}


Làm thế nào là 198 byte?
Zacharý

@ZacharyT, các tab ( \t) được định dạng như 4 không gian trên stack overflow nhưng tôi thực sự xen kẽ các tab và không gian (bạn có thể làm điều này cho mức thụt đầu dòng bằng Python 2, chứ không phải 3) mức vì vậy đầu tiên là [space]thứ hai là [tab]thứ ba là [tab][space]ra là [tab][tab]. Nhập mã vào có khoảng trắng cho tôi 227 từ đây mẹeff.in / byte-count và tôi đếm 10 tab để 227 - (3 * 10) = 197. Huh, tôi đoán rằng tôi thực sự bị tính quá 1 cách khi tôi quay lại đăng này.
KSab

ĐỪNG! Đó là một mẹo thực sự tốt. (Nhập ở cuối dòng). Bạn có thể kết hợp vòng lặp for dưới và câu lệnh return return r+[s[f(c)^1]for c in m]để lưu byte.
Zacharý

1

Haskell, 513

Các chức năng h. Phiên bản trước không đưa ra câu trả lời chính xác cho "({{)[""({{)}}"

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.