เขียนโปรแกรมที่รับสายอักขระสี่ตัว()[]
ที่ตรงกับจุดเหล่านี้:
- ทุกวงเล็บมีวงเล็บจับคู่ที่เหมาะสม
(
)
- ทุกวงเล็บซ้ายมีวงเล็บขวาจับคู่
[
]
- การจับคู่วงเล็บและวงเล็บจะไม่ทับซ้อนกัน เช่น
[(])
ไม่ถูกต้องเนื่องจากวงเล็บที่ตรงกันไม่ได้บรรจุอยู่ในวงเล็บที่ตรงกันอย่างสมบูรณ์หรือในทางกลับกัน - อักขระตัวแรกและตัวสุดท้ายเป็นคู่ของวงเล็บหรือวงเล็บ ดังนั้น
([]([]))
และ[[]([])]
ถูกต้อง แต่[]([])
ไม่ใช่
( ไวยากรณ์สำหรับรูปแบบอินพุตคือ<input> ::= [<input>*] | (<input>*)
)
วงเล็บและวงเล็บที่จับคู่แต่ละคู่จะประเมินเป็นจำนวนเต็มที่ไม่เป็นลบ:
- ค่าของคู่ในวงเล็บที่ตรงกันทั้งหมดสรุป การแข่งขันที่ว่างเปล่ามีค่า
()
0
- ค่าของคู่ในวงเล็บที่ตรงกันทั้งหมดคูณ การแข่งขันที่ว่างเปล่ามีค่า
[]
1
( ผลรวมหรือผลิตภัณฑ์ของหนึ่งหมายเลขคือหมายเลขเดียวกันนั้น)
ตัวอย่างเช่น([](())([][])[()][([[][]][][])([][])])
สามารถแบ่งย่อยและประเมินเป็น9
:
([](())([][])[()][([[][]][][])([][])]) <input>
(1 (0 )(1 1 )[0 ][([1 1 ]1 1 )(1 1 )]) <handle empty matches>
(1 0 2 0 [(1 1 1 )2 ]) <next level of matches>
(1 0 2 0 [3 2 ]) <and the next>
(1 0 2 0 6 ) <and the next>
9 <final value to output>
ตัวอย่างอื่น:
[([][][][][])([][][])([][][])(((((([][]))))))] <input>
[(1 1 1 1 1 )(1 1 1 )(1 1 1 )((((((1 1 ))))))]
[5 3 3 (((((2 )))))]
[5 3 3 ((((2 ))))]
[5 3 3 (((2 )))]
[5 3 3 ((2 ))]
[5 3 3 (2 )]
[5 3 3 2 ]
90 <output>
โปรแกรมของคุณจำเป็นต้องประเมินและพิมพ์จำนวนเต็มที่แทนด้วยสตริงข้อมูลทั้งหมด คุณสามารถสันนิษฐานว่าอินพุตนั้นถูกต้อง รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
แทนที่จะเป็นโปรแกรมคุณอาจเขียนฟังก์ชั่นที่ใช้ในสตริงและพิมพ์หรือส่งคืนจำนวนเต็ม