Có dấu ngoặc trong ngụy trang?


12

Ai đó đã cho chúng tôi một chuỗi, nhưng tất cả các ký tự giống như khung đã được thay đổi thành một chuỗi bình thường và chúng tôi không biết đó là gì, hoặc thậm chí có bao nhiêu. Tất cả những gì chúng ta biết là nếu L1,L2,L3,...,LNlà các loại dấu ngoặc trái R1,R2,R3,...,RNkhác nhau và là các loại dấu ngoặc phải tương ứng khác nhau, tất cả đều khác biệt (ký tự dấu ngoặc riêng biệt 2N), một chuỗi sẽ hợp lệ nếu đó là một trong (+ là nối chuỗi bình thường):

  • L1+X+R1,, L2+X+R2..., LN+X+RNnơi Xlà một chuỗi hợp lệ,

  • X+Y, ở đâu XYlà các chuỗi hợp lệ,

  • Bất kỳ ký tự đơn lẻ nào không phải là ký tự ngoặc.

  • Chuỗi rỗng

Chúng tôi biết họ đã bắt đầu với một chuỗi hợp lệ trước khi họ thay đổi dấu ngoặc và họ đã không thay đổi chúng thành bất kỳ ký tự nào đã tồn tại trong chuỗi. Ít nhất một cặp tồn tại cho mỗi khung là tốt. Bạn có thể xây dựng lại các ký tự ban đầu là cặp ngoặc trái và phải (tìm LiRitheo các điều kiện đã cho) không?

Xuất ra các cặp ký tự được ngoặc. Ví dụ: nếu (){}[]thực sự là các ký tự dấu ngoặc, bạn có thể xuất (){}[]hoặc {}[]()hoặc [](){}, v.v. Có thể có nhiều cách để thực hiện điều này cho một chuỗi, bạn chỉ cần trả về một ký tự sao cho không có phép gán khung với nhiều cặp hơn (xem ví dụ). Lưu ý rằng chuỗi đầu ra phải luôn có độ dài chẵn.

Ví dụ:

abcc- ckhông thể là dấu ngoặc, vì không có ký tự nào khác có hai lần xuất hiện, nhưng abcó thể là một cặp ngoặc vuông, vì vậy bạn sẽ xuất chính xác ab.

fffff - bất kỳ chuỗi nào có nhiều nhất một ký tự không thể có dấu ngoặc, vì vậy bạn sẽ trả về chuỗi trống hoặc đầu ra không có gì.

aedbedebdcecdec - chuỗi này không thể có bất kỳ dấu ngoặc nào vì có 1 a, 2 bs, 3 cs, 4 ds và 5 es, vì vậy không có hai ký tự xảy ra cùng một số lần, đó là một yêu cầu để có dấu ngoặc.

abcd- bài tập có thể là ab, cd, abcd, cdab, adbc, bcad, ac, ad, bcbd, (cũng như việc chuyển nhượng trống rỗng, mà tất cả đều có) nhưng bạn phải trả lại một trong những bài tập dài nhất, vì vậy bạn phải trả lại abcd, cdab, adbc, hoặc bcad.

aabbcc, abc- đây là cả hai đều có ab, acbcnhư cặp hợp lệ. Bạn phải trả lại một trong các cặp này, không quan trọng.

abbac- a và b có cùng số lượng ký tự, nhưng chúng thực sự không thể hoạt động được, vì một trong số chúng xảy ra ở cả bên trái và bên phải của tất cả các lần xuất hiện khác. Trả lại không có gì.

aabcdb- cdablà hai cặp khung chính xác, do đó, đầu ra cdabhoặc abcd.

abcdacbd- chỉ có một cặp có thể đạt được cùng một lúc, nhưng ab, ac, bd, cd, và adđược tất cả các cặp có thể bạn có thể quay trở lại. Cho dù bạn chọn cặp nào, nó cũng có một trường hợp có một nhân vật khác ở trong đó, điều này cấm bất kỳ cặp nào khác, ngoại trừ trong trường hợp ad, các cặp khác bccbkhông thể ở một mình, và vì vậy không thể có thể với ad.

Đây là mã golf, vì vậy mã ngắn nhất trong byte thắng. Đầu vào là từ STDIN nếu có thể cho ngôn ngữ của bạn. Nếu không thể, hãy chỉ ra phương thức nhập trong câu trả lời của bạn.


1
Đối với đầu vào abcd, đầu ra adbccũng sẽ được chấp nhận, phải không?
Patrick Roberts

Vâng, tôi đã thêm nó vào ví dụ.
Dưa ma sát

Câu trả lời:


4

Ruby, 373 byte

i=gets.chomp
b=[*(i.chars.group_by{|x|x}.group_by{|x,y|y.size}.map{|x|s=x[1].size
x[1][0...s-s%2].map{|x|x[0]}*''}*'').chars.each_slice(2)]
puts [*[*b.size.downto(1).map{|n|b.combination(n).map{|t|[t*'',(h=Hash[t]
s=[]
o=1
i.each_char{|c|s.push(c)if h.keys.include?c
(o=false if s.empty?||!h[s.pop].eql?(c))if h.values.include?c}
o ?s.empty?: o)]}}.find{|x|x[0][1]}][0]][0]

Điều này sử dụng một phiên bản golf của trình phân tích cú pháp ngăn xếp ở đây .

Nó có thể được đơn giản hóa hơn nữa, nhưng tôi không nghĩ bộ não của tôi có thể xử lý được nữa.

Tất cả các trường hợp thử nghiệm: http://ideone.com/gcqDkK

Với khoảng trắng: http://ideone.com/pLrsHg

Ungolfed (chủ yếu): http://ideone.com/oM5gKX

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.