Thu gom rác


9

Bạn đang nhìn vào một đại lộ, và ai đó đã bỏ rác! Bạn cần viết một chương trình để giúp khắc phục vấn đề, bằng cách bỏ rác vào thùng rác.

Nhiệm vụ

Đại lộ được tạo thành từ một chuỗi các ký tự ASCII có thể in được, ví dụ:

[[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)

Một số dấu ngoặc ở đây là vô song; Đó chỉ là những trò giải mã. Những gì chúng tôi quan tâm là các bộ dấu ngoặc phù hợp.

Một thùng rác là một chuỗi bắt đầu với [và kết thúc với ], và với dấu ngoặc trong nội bộ phù hợp và dấu ngoặc đơn. Ví dụ, [][[](dust)[]]là thùng rác trong chuỗi trên.

Một túi rác là một chuỗi bắt đầu bằng (và kết thúc bằng ), và với dấu ngoặc và dấu ngoặc đơn phù hợp bên trong. Ví dụ, (dust)là một túi rác trong chuỗi trên.

Có thể một số túi rác đã ở trong thùng rác rồi. Tuy nhiên, ít nhất một cái sẽ bị bỏ lại và chúng ta cần di chuyển các túi rác để tất cả chúng nằm trong thùng rác. Cụ thể, đối với mỗi túi rác hiện không có trong thùng rác (tức là một chuỗi con của thùng rác đó), chúng ta cần loại bỏ nó khỏi vị trí hiện tại của nó trong chuỗi và thay vào đó vào vị trí bên trong thùng rác .

Có một quy tắc bổ sung ở đây. Bởi vì chúng tôi không muốn chi quá nhiều tiền cho những người thu gom rác và tuyến đường của họ đưa họ dọc theo đại lộ từ phải sang trái, chúng tôi muốn di chuyển từng túi rác sang trái (tiêu chí quan trọng nhất, giả sử chúng tôi phải di chuyển nó tại tất cả) và khoảng cách ngắn nhất có thể (miễn là nó di chuyển sang trái). Vì vậy, ví dụ, đầu ra đúng duy nhất cho

[can1](bag)[can2]

[can1(bag)][can2]

(di chuyển túi chỉ một ký tự bên trái). Ngoài ra, các túi cần phải theo thứ tự tương đối:

[can](bag1)(bag2)

phải trở thành

[can(bag1)(bag2)]

(tức là bạn không thể đặt (bag2)bên trái của (bag1).)

Làm rõ

  • Sẽ không có túi rác nào ở bên trái thùng rác ngoài cùng bên trái; nó sẽ luôn có thể có thể tất cả các thùng rác bằng cách di chuyển nó sang bên trái.
  • Sẽ luôn có ít nhất một túi để di chuyển. Có thể có nhiều hơn một.
  • Sẽ không bao giờ có thùng rác bên trong túi rác (lon quá giá trị để bỏ đi).
  • Nếu một cái túi đã ở trong một cái hộp, hãy để nó một mình.
  • Không sao cho đầu vào và đầu ra khác nhau về khoảng trắng theo sau (bao gồm cả dòng mới).

Ví dụ:

  • Đầu vào: [[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)

    Đầu ra: [[](dust)[]((paper)vomit)(broken(glass))] car [[(rotten)(dirty)] fence

  • Đầu vào: []] (unusable) door (filthy) car

    Đầu ra: [(unusable)(filthy)]] door car


5
Những người bỏ phiếu kín, bạn có thể giải thích những gì bạn đang tìm kiếm không rõ ràng? Bài đăng sẽ khó sửa nếu không có hướng dẫn rõ ràng về vấn đề của nó.

@ ais523 Tôi không thể hiểu nhiệm vụ là gì. Cứ cho rằng đó có thể là do tôi mệt nhưng cách diễn đạt hiện tại không có ý nghĩa gì nhiều
Blue

1
Về cơ bản, đối với mỗi chuỗi con nằm trong dấu ngoặc đơn nhưng không nằm trong dấu ngoặc, hãy di chuyển nó sang bên trái cho đến khi nó nằm trong dấu ngoặc.

Vì vấn đề này liên tục bị đóng và mở lại, tôi đã chỉnh sửa nó với sự hiểu biết của mình về vấn đề này. Hy vọng rằng tôi đã không thay đổi vấn đề trong quá trình này.

@ ais523 Điều này tốt bởi tôi. Cảm ơn bạn rất nhiều cho tất cả các chỉnh sửa của bạn.
Ewan Delanoy

Câu trả lời:


3

JavaScript (ES6), 263 228 209 205 184 177 173 162 byte

Bất kỳ trợ giúp với mã / biểu thức thông thường được đánh giá rất cao.

f=s=>s.match(t=/\[\[][\w()]*\[]]|\[]/g,g=/\([\w()]*\)/g,i=0,u=s.split(t).filter(e=>e)).map(e=>e.substr(0,e.length-1)+u[i].match(g).join``+`]`+u[i++].replace(g,``)).join``

Một chức năng ẩn danh; nhận một Stringtham số svà trả về đầu ra.

/\[\[][\w()]*\[]]|\[]/g khớp các thùng rác với các túi rác lồng nhau, tuy nhiên tôi không nghĩ rằng nó có thể kiểm tra các dấu ngoặc cân bằng trong các túi rác nếu cần.

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.