Làm phẳng chương trình Stack Mèo


13

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 Avà đại Bdiện cho một đoạn tùy ý):

  1. 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).
  2. 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).
  3. 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, BCđề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 (){}( [], <>\/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à , 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)(<|>)

Để chắc chắn, các vòng lặp chúng ta phải trích xuất chỉ được biểu thị bằng dấu ngoặc đơn (), 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}?
Kevin Cruijssen

@KevinCruijssen Có, phép chuyển đổi chỉ hợp lệ đối với (...)các vòng lặp -type.
Martin Ender

Trong trường hợp thử nghiệm cuối cùng, tại sao \^/trong ngoặc đơn?
Kevin Cruijssen

1
@KevinCruijssen Đó là những dấu ngoặc đơn ngoài cùng sau khi bạn trích xuất (<|>((X((T)))[_]))(([_](((T))X))<|>).
Martin Ender

1
Ah tôi thấy. Vì vậy, ((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).
Kevin Cruijssen

Câu trả lời:


6

Võng mạc 0.8.2 , 113 107 67 66 byte

+`\(\)|(\()?(\(((\()|(?<-4>\))|[^()])*(?(4)@)\))(?(1)|(\)))
$5$2$1

Hãy thử trực tuyến! Bao gồm 3 tiết kiệm 4 byte nhờ @MartinEnder. Giải trình:

+`

Liên tục áp dụng thay thế cho đến khi không có trận đấu.

\(\)|

Khớp với một vòng lặp trống (trong trường hợp đó không có gì được ghi lại để thay thế chỉ đơn giản là xóa nó) hoặc:

(\()?

Tùy ý khớp a (. Điều này được ghi lại trong nhóm 1 nếu nó khớp, nhưng không được ghi lại.

(\(

Nắm bắt cơ thể chính của trận đấu trong nhóm 2 và khớp a (.

(
 (\()
|
 (<-4>\))
|
 [^()]
)*

Liên tục khớp ( , bắt nó trong nhóm 4 hoặc a ), xóa một bắt giữ khỏi nhóm 4 (không thành công nếu không có), hoặc một cái gì đó khác.

(?(4)@)

Đảm bảo rằng không có ảnh chụp dự phòng còn lại trong nhóm 4.

\))

Kết thúc nhóm 2 với nhóm khác ) .

(?(1)|(\)))

Nếu chụp nhóm 1 trống, thì chụp ) nhóm trong nhóm 5. (Vì vậy, chính xác một trong hai nhóm đó sẽ có bản chụp).

$5$2$1

Di chuyển khung được chụp trong nhóm 1 hoặc nhóm 5 sang phía bên kia của nhóm 2. Điều này có tác dụng di chuyển vòng lặp bên trong ra phía trước hoặc kết thúc vòng lặp bên ngoài tùy thuộc vào phía nào phù hợp.


2

Stax v1.0.3 +, 76 65 64 62 58 byte CP437

îÜ•$o,Γ{í]Üf╒9♦╛üΣóç*\$ñ₧└ΦJ♠¥c╥jóu≥3E.╘ⁿ◄◘W₧<¶┼7úê╟┴zç↨aG

70 byte khi giải nén,

{{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Md}X!:Rx!:Rc.()z:rgp

Chạy và gỡ lỗi trực tuyến!

Giải trình

{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Mdlà một khối tách A((B)C)Dthành bốn phần và chuyển đổi nó thànhA(B)(C)D .

X!:Rx!:Rthực thi khối trên chuỗi đầu vào (bước 1), sau đó phản ánh chuỗi (phản xạ chuỗi trong Stax có nghĩa là đảo ngược chuỗi cộng với thay thế (dịch) (<[{/bằng (sang) \}]>)) và thực hiện khối trên chuỗi thu được, sau đó phản ánh lại chuỗi (bước 2). Bước 2 về cơ bản là chuyển đổi (A(B))sang (A)(B).

c.()z:r loại bỏ tất cả các vòng lặp trống (bước 3).

gplà một trình tạo tìm điểm sửa lỗi của phép lặp. Trong trường hợp này, chuỗi được lặp lại với quy trình 3 bước cho đến khi nó không còn thay đổi.

Ngụ ý đầu ra.


1

Python 3 , 226 223 212 206 byte

Được rồi, đây là một nỗ lực để giải quyết vấn đề này bằng ngôn ngữ không hỗ trợ regex đệ quy.

lambda s:g(g(s,*'()'),*')(').replace('()','')
def g(s,t,u):
 m,*a={},;i=v=0
 for c in s:
  i+=1;a+=[i]*(c==t)
  if c==u:*a,x=a;m[x]=i;v=m.get(x+1)
  if v:return g(s[:x]+s[x+1:v]+t+s[v:],t,u)
 return s[::-1]

Hãy thử trực tuyến!

Chỉnh sửa:

  • Được cấu trúc lại [::-1]để lưu 6 byte, nhờ Mr.Xcoder.

Các gchức năng là khối xây dựng cơ bản, mà tìm thấy một xảy ra ((A)B), thay đổi nó để (A)(B), sau đó áp dụng riêng của mình để kết quả cho đến khi không chuyển đổi hơn là có thể.

Các bước chính là:

  • Áp dụng gcho đầu vào bình thường.
  • Áp dụng gcho đầu vào lật. Chạy này tìm thấy sự xuất hiện của ))A(B(trong đầu vào đảo ngược, xử lý hiệu quả (A(B)).
  • Loại bỏ bất kỳ sự xuất hiện của ().

Vấn đề là, gcó cấu trúc kiểm soát tồi tệ đến mức cố gắng một dòng khiến nó trở nên tồi tệ, vì vậy tôi không nghĩ rằng có thể cải thiện lớn dựa trên giải pháp này.

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.