Có là một vài câu hỏi trên trang web này về việc cân bằng dấu ngoặc, và kiểm tra xem dấu ngoặc được cân bằng. Tôi đề nghị đã đến lúc sử dụng những dấu ngoặc cân bằng này cho một cái gì đó!
Trong toán học và lập trình, dấu ngoặc giống như bong bóng, cô lập mọi thứ bên trong tạo thành mọi thứ bên ngoài để mọi thứ bên trong có thể làm mọi thứ trong hòa bình và bất cứ thứ gì bên ngoài chỉ nhìn thấy một đối tượng. Tuy nhiên, một chuỗi dấu ngoặc là một chiều, trong khi bong bóng thường có ít nhất hai chiều. Điều đó có nghĩa là các bong bóng có thể tự do di chuyển xung quanh nhau miễn là chúng không bao giờ chạm vào nhau hoặc giao thoa giữa bên trong và bên ngoài của bất kỳ bong bóng nào khác.
Thử thách
Đầu vào là một chuỗi các dấu ngoặc phù hợp của một loại, tròn ()
, vuông []
, xoăn {}
hoặc góc <>
. Tùy thuộc vào loại bạn muốn chương trình của bạn chấp nhận và chương trình chỉ chấp nhận một loại dấu ngoặc đơn được chấp nhận. (Phần thưởng tưởng tượng nếu chương trình của bạn có thể xử lý bất kỳ phần nào trong số chúng, điểm thưởng tưởng tượng lớn nếu nó có thể xử lý tất cả chúng trong cùng một đầu vào.) Đầu vào không thể chứa bất cứ thứ gì giữa các dấu ngoặc, mặc dù khoảng trắng được cho phép.
Đầu ra là tất cả các tổ chức có thể có (theo thứ tự tùy ý và bao gồm cả đầu vào ban đầu) của các dấu ngoặc có cùng cấu hình bong bóng, không có hai chuỗi giống nhau. Điều đó có nghĩa là với đầu vào ()()
, đầu ra cũng chỉ ()()
, mặc dù về mặt kỹ thuật, hai bong bóng có thể hoán đổi vị trí. Đối với phần thưởng tưởng tượng lớn, {}[]()
tất nhiên đầu vào sẽ dẫn đến đầu ra gồm 6 phần tử / chuỗi / dòng khác nhau.
Hai cấu hình của bong bóng là "giống nhau" nếu bạn có thể tạo một cái khác bằng cách di chuyển bong bóng xung quanh, mà không để bất kỳ bong bóng nào đi qua từ bên trong một bong bóng khác ra bên ngoài nó, hoặc từ ngoài vào trong. Nếu bạn ví các dấu ngoặc đơn được lồng vào cây (mỗi cặp được khớp là một nút và mỗi cặp được khớp bên trong là một mã con và mỗi cặp được khớp trong đó lại có một mã con của các nút đó, v.v.) trong đó các mã con của bất kỳ nút nào được đặt hàng , sau đó một cấu hình duy nhất của bong bóng là một cây nơi các nút không được sắp xếp.
Bất kỳ định dạng đầu ra hợp lý nào cũng sẽ làm, như trả về một danh sách các chuỗi hoặc danh sách các danh sách các ký tự đơn hoặc một chuỗi với một loại khoảng trắng, hoặc in ra stdout
hoặc stderr
với một số dạng ký tự khoảng trắng có thể nhìn thấy (phổ biến nhất là dòng mới hoặc dấu cách) từng tổ chức lại.
Trailing space cho mỗi lần sắp xếp lại và theo dõi và đặt trước các dòng mới / phần tử danh sách trống trước và sau khi đầu ra thực tế được cho phép. Bạn nên sử dụng cùng loại dấu ngoặc trong đầu ra của bạn khi bạn chấp nhận trong đầu vào của mình. Ngoài dấu ngoặc, dòng mới và khoảng trắng như được chỉ định ở đây và bất kỳ dấu phân cách nào bạn sử dụng, không nên in gì (bao gồm các ký tự vô hình / độ rộng bằng không).
Điểm số là số byte trong mã; số lượng thấp nhất cho mỗi ngôn ngữ chiến thắng. Bạn có thể lưu ý xem bạn có nhận được một phần thưởng tưởng tượng, thường xuyên hay lớn, nhưng nó không ảnh hưởng đến điểm số của bạn. Tiền thưởng thực tế là quá khó để cân bằng ngay.
Ví dụ đầu vào-đầu ra
Ví dụ 1:
Đầu vào:
()(())
Đầu ra:
()(())
(())()
Ví dụ 2:
Đầu vào:
(()())()()
Đầu ra:
(()())()()
()(()())()
()()(()())
Ví dụ 3:
Đầu vào:
(()(()))()
Đầu ra:
((())())()
()((())())
(()(()))()
()(()(()))
((()))
ví dụ 1? hay()()()
? Có vẻ như bạn đang thiếu hoán vị cho mỗi đầu vào.