InternBootcamp/internbootcamp/bootcamp/cbracketsubsequence/cbracketsubsequence.py
2025-05-23 15:27:15 +08:00

142 lines
4.3 KiB
Python
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""#
### 谜题描述
A bracket sequence is a string containing only characters \"(\" and \")\". A regular bracket sequence is a bracket sequence that can be transformed into a correct arithmetic expression by inserting characters \"1\" and \"+\" between the original characters of the sequence. For example, bracket sequences \"()()\" and \"(())\" are regular (the resulting expressions are: \"(1)+(1)\" and \"((1+1)+1)\"), and \")(\", \"(\" and \")\" are not.
Subsequence is a sequence that can be derived from another sequence by deleting some elements without changing the order of the remaining elements.
You are given a regular bracket sequence s and an integer number k. Your task is to find a regular bracket sequence of length exactly k such that it is also a subsequence of s.
It is guaranteed that such sequence always exists.
Input
The first line contains two integers n and k (2 ≤ k ≤ n ≤ 2 ⋅ 10^5, both n and k are even) — the length of s and the length of the sequence you are asked to find.
The second line is a string s — regular bracket sequence of length n.
Output
Print a single string — a regular bracket sequence of length exactly k such that it is also a subsequence of s.
It is guaranteed that such sequence always exists.
Examples
Input
6 4
()(())
Output
()()
Input
8 8
(()(()))
Output
(()(()))
Here is a reference code to solve this task. You can use this to help you genereate cases or validate the solution.
```python
[n,k] = map(int,raw_input().split())
bracket = raw_input()
result = []
i = 0
for i in bracket:
if i == \")\" and n>k:
result.pop()
n-=2
else:
result.append(i)
print \"\".join(result)
```
请完成上述谜题的训练场环境类实现,包括所有必要的方法。
"""
from bootcamp import Basebootcamp
import re
import random
from bootcamp import Basebootcamp
class Cbracketsubsequencebootcamp(Basebootcamp):
def __init__(self, max_insertions=3):
self.max_insertions = max_insertions
def case_generator(self):
# 生成目标k长度序列
k = 2 * random.randint(1, 6) # 允许更大范围k值
t = self.generate_regular_sequence(k)
# 插入多层括号结构
insertions = random.randint(0, self.max_insertions)
s = t
for _ in range(insertions):
# 随机插入合法括号对
pos = random.randint(0, len(s))
s = s[:pos] + '()' + s[pos:]
assert self.is_regular(s), f"Invalid regular sequence: {s}"
return {'n': len(s), 'k': k, 's': s}
@staticmethod
def generate_regular_sequence(length):
"""生成更复杂的嵌套结构"""
if length == 0:
return ""
if length == 2:
return "()"
choice = random.random()
if choice < 0.5:
return "(" + Cbracketsubsequencebootcamp.generate_regular_sequence(length-2) + ")"
else:
split = random.randint(1, length//2 - 1) * 2
return (Cbracketsubsequencebootcamp.generate_regular_sequence(split) +
Cbracketsubsequencebootcamp.generate_regular_sequence(length-split))
@staticmethod
def prompt_func(question_case):
# 保持原prompt结构增加示例多样性
return f"""给定长度为{question_case['n']}的正则括号序列:
{question_case['s']}
请找出长度为{question_case['k']}的正则子序列。将答案置于[answer][/answer]标签内。"""
@staticmethod
def extract_output(output):
# 强化格式校验
matches = re.findall(r'\[answer\]\s*([()]+)\s*\[/answer\]', output)
return matches[-1] if matches else None
@classmethod
def _verify_correction(cls, solution, identity):
# 添加更严格的校验
return (
len(solution) == identity['k'] and
solution.count('(') == solution.count(')') and
cls.is_regular(solution) and
cls.is_subsequence(solution, identity['s'])
)
@staticmethod
def is_regular(s):
balance = 0
for c in s:
balance += 1 if c == '(' else -1
if balance < 0:
return False
return balance == 0
@staticmethod
def is_subsequence(sub, s):
it = iter(s)
return all(c in it for c in sub)