มีการปลอมตัวในวงเล็บหรือไม่?


12

มีคนให้สตริงเรา แต่ตัวละครที่เหมือนวงเล็บถูกเปลี่ยนให้เป็นสตริงปกติและเราไม่รู้ว่ามีอะไรหรือแม้แต่มีกี่ตัว สิ่งที่เรารู้ก็คือว่าถ้าL1,L2,L3,...,LNเป็นวงเล็บปีกกาด้านซ้ายที่R1,R2,R3,...,RNแตกต่างกันและเป็นวงเล็บปีกกาด้านขวาที่แตกต่างกันทุกตัวจะแตกต่างกัน (2N วงเล็บปีกกาที่แตกต่างกัน) สตริงจะใช้ได้ถ้า if เป็นหนึ่งใน (+ คือ

  • L1+X+R1, L2+X+R2, ... , LN+X+RNซึ่งXเป็นสตริงที่ถูกต้อง

  • X+Yที่ไหนXและYเป็นสตริงที่ถูกต้อง

  • อักขระเดี่ยวใด ๆ ที่ไม่ใช่อักขระวงเล็บเหลี่ยม

  • สตริงว่าง

เรารู้ว่าพวกเขาเริ่มต้นด้วยสตริงที่ถูกต้องก่อนที่พวกเขาจะเปลี่ยนวงเล็บและพวกเขาไม่ได้เปลี่ยนเป็นอักขระใด ๆ ที่มีอยู่แล้วในสตริง มีอย่างน้อยหนึ่งคู่สำหรับแต่ละวงเล็บเช่นกัน คุณสามารถสร้างอักขระตัวใดที่คู่ซ้ายและขวาในวงเล็บเดิม (ค้นหาLiและปฏิบัติRiตามเงื่อนไขที่กำหนด)?

เอาต์พุตคู่ของอักขระที่เป็นวงเล็บเหลี่ยม ตัวอย่างเช่นถ้า(){}[]จริง ๆ แล้วเป็นอักขระวงเล็บเหลี่ยมคุณอาจส่งออก(){}[]หรือ{}[]()หรือ[](){}ฯลฯ อาจมีหลายวิธีในการทำสตริงคุณจะต้องส่งคืนเฉพาะกรณีที่ไม่มีการกำหนดค่าวงเล็บด้วยคู่เพิ่มเติม (ดูตัวอย่าง) โปรดทราบว่าสตริงผลลัพธ์ควรมีความยาวเท่ากันเสมอ

ตัวอย่าง:

abcc- cไม่สามารถยึดเนื่องจากไม่มีตัวละครอื่น ๆ ที่มีทั้งสองเกิดขึ้น แต่อาจจะเป็นคู่วงเล็บดังนั้นคุณจะส่งออกว่าabab

fffff - สตริงใด ๆ ที่มีอักขระไม่เกินหนึ่งตัวต้องไม่มีเครื่องหมายวงเล็บดังนั้นคุณจะส่งคืนสตริงว่างหรือไม่มีอะไรส่งออก

aedbedebdcecdec - สตริงนี้ไม่สามารถมีวงเล็บใด ๆ ได้เนื่องจากมี 1 a, 2 bs, 3 cs, 4 ds และ 5 es ดังนั้นจึงไม่มีอักขระสองตัวที่เกิดขึ้นในจำนวนครั้งเท่ากันซึ่งเป็นข้อกำหนดที่จะต้องมีวงเล็บ

abcd- การมอบหมายงานที่เป็นไปได้ab, cd, abcd, cdab, adbc, bcad, ac, ad, bcและbd(เช่นเดียวกับที่ได้รับมอบหมายที่ว่างเปล่าซึ่งทั้งหมดของพวกเขามี) แต่คุณจะต้องกลับมาเป็นหนึ่งในการมอบหมายงานที่ยาวที่สุดเพื่อให้คุณจะต้องกลับabcd, cdab, หรือadbcbcad

aabbcc, abc- เหล่านี้ทั้งสองมีab, acและbcเป็นคู่ที่ถูกต้อง คุณต้องส่งคืนหนึ่งในคู่เหล่านี้ไม่สำคัญ

abbac- a และ b มีจำนวนอักขระเท่ากัน แต่ไม่สามารถใช้งานได้จริงเนื่องจากหนึ่งในนั้นเกิดขึ้นกับทั้งด้านซ้ายและด้านขวาของสิ่งอื่นที่เกิดขึ้น ไม่ต้องส่งคืน

aabcdb- cdและabเป็นที่แน่นอนสองคู่วงเล็บเพื่อการส่งออกอย่างใดอย่างหนึ่งหรือcdababcd

abcdacbd- เพียงหนึ่งคู่สามารถทำได้ในครั้งเดียว แต่ab, ac, bd, cdและadมีทุกคู่ที่เป็นไปได้คุณสามารถกลับ ไม่ว่าคุณจะเลือกคู่แบบใดมันก็มีตัวอย่างที่ตัวละครตัวหนึ่งอยู่ในตัวมันซึ่งห้ามคู่อื่นยกเว้นในกรณีadที่คู่อื่น ๆbcและcbไม่สามารถอยู่คนเดียวได้เช่นกัน adกับ

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ อินพุตจาก STDIN ถ้าเป็นไปได้สำหรับภาษาของคุณ หากเป็นไปไม่ได้ให้ระบุวิธีป้อนข้อมูลในคำตอบของคุณ


1
สำหรับอินพุตabcdเอาต์พุตadbcก็จะยอมรับได้ใช่ไหม
Patrick Roberts

ใช่ฉันเพิ่มลงในตัวอย่างแล้ว
Melon Fricative

คำตอบ:


4

Ruby, 373 ไบต์

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]

นี้ใช้รุ่นแข็งแรงเล่นกอล์ฟของ parser สแต็คที่นี่

มันอาจจะง่ายขึ้นอีก แต่ฉันไม่คิดว่าสมองของฉันจะสามารถรับมือได้อีก

กรณีทดสอบทั้งหมด: http://ideone.com/gcqDkK

ด้วยช่องว่าง: http://ideone.com/pLrsHg

Ungolfed (ส่วนใหญ่): http://ideone.com/oM5gKX

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.