Stack Mèo là một ngôn ngữ dựa trên ngăn xếp, đảo ngược. Bản chất đảo ngược của nó làm cho các vòng lặp hơi kỳ lạ. Thử thách này là về vòng lặp có điều kiện (...)
. Khi các vòng lặp này được lồng theo một số cách nhất định, có thể chuyển đổi mã để giảm độ sâu lồng. Dưới đây là các quy tắc (nơi A
và đại B
diện cho một đoạn tùy ý):
- Khi một vòng lặp bắt đầu với một vòng lặp khác, chúng ta có thể trích xuất vòng lặp bên trong ra phía trước:
((A)B)
trở thành(A)(B)
. - Khi một vòng lặp kết thúc bằng một vòng lặp khác, chúng ta có thể trích xuất vòng lặp bên trong đến cuối:
(B(A))
trở thành(B)(A)
. - Các vòng lặp trống
()
, có thể được gỡ bỏ hoàn toàn khỏi chương trình. Như một hệ quả (kết hợp với các quy tắc khác),((A))
tương đương với(A)
.
Các vòng chỉ lồng nhau rằng sẽ vẫn có dạng (A(B)C)
, trong đó A
, B
và C
đều là phòng không trống.
Các thách thức
Bạn đã được cung cấp một chương trình Stack Mèo hợp lệ và nhiệm vụ của bạn là giảm mức độ lồng nhau càng nhiều càng tốt, không để lại các vòng lặp trống, sử dụng các phép biến đổi ở trên.
Một chương trình Stack Mèo hợp lệ ...
- ... Chỉ bao gồm các nhân vật
()/\<>[]{}!"*+-:=ITX^_|
. - ... có tính đối xứng gương (ví dụ:
\(]{}!{}[)/
chương trình hợp lệ, nhưng/|/
không). - ... đã khớp chính xác và lồng nhau
()
và{}
([]
,<>
và\/
không nhất thiết phải được khớp như bình thường, mặc dù chúng sẽ xuất hiện theo cặp do yêu cầu đối xứng gương).
Bạn có thể lấy một chuỗi hoặc một danh sách các ký tự làm đầu vào, nhưng đầu ra cần phải được trình bày theo cùng định dạng.
Bạn có thể viết chương trình hoặc chức năng và sử dụng bất kỳ phương pháp tiêu chuẩn nào để nhận đầu vào và cung cấp đầu ra. Lưu ý rằng các sơ hở này bị cấm theo mặc định.
Đây là môn đánh gôn , vì vậy câu trả lời hợp lệ ngắn nhất - được đo bằng byte - thắng.
Các trường hợp thử nghiệm
Các trường hợp kiểm tra là hai dòng mỗi (đầu vào và đầu ra), được phân tách bằng các dòng trống. Lưu ý rằng một đầu ra trống. Bạn cũng cần hỗ trợ đầu vào trống (điều này sẽ dẫn đến đầu ra trống).
(((=+|+=)))
(=+|+=)
({(=+|+=)})
({(=+|+=)})
((\)/)I(\(/))
(\)(/)I(\)(/)
(()()(())()())
((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)
(...)
các vòng lặp -type.
\^/
trong ngoặc đơn?
(<|>((X((T)))[_]))
và (([_](((T))X))<|>)
.
((A)B(C))
sẽ trở thành (A)(B)(C)
do cả hai quy tắc 1 và 2 sau đó: ((A)B(C))
→ (A)(B(C))
(quy tắc 1) → (A)(B)(C)
(quy tắc 2).
()
, vì vậy một đầu vào{{A}B}
sẽ vẫn như cũ và sẽ không được trích xuất{A}{B}
?