init-commit

This commit is contained in:
lilinyang 2025-05-23 15:27:15 +08:00
commit 18a552597a
3461 changed files with 1150579 additions and 0 deletions

View file

@ -0,0 +1,213 @@
"""#
### 谜题描述
Allen and Bessie are playing a simple number game. They both know a function f: \{0, 1\}^n R, i. e. the function takes n binary arguments and returns a real value. At the start of the game, the variables x_1, x_2, ..., x_n are all set to -1. Each round, with equal probability, one of Allen or Bessie gets to make a move. A move consists of picking an i such that x_i = -1 and either setting x_i 0 or x_i 1.
After n rounds all variables are set, and the game value resolves to f(x_1, x_2, ..., x_n). Allen wants to maximize the game value, and Bessie wants to minimize it.
Your goal is to help Allen and Bessie find the expected game value! They will play r+1 times though, so between each game, exactly one value of f changes. In other words, between rounds i and i+1 for 1 i r, f(z_1, ..., z_n) g_i for some (z_1, ..., z_n) \{0, 1\}^n. You are to find the expected game value in the beginning and after each change.
Input
The first line contains two integers n and r (1 n 18, 0 r 2^{18}).
The next line contains 2^n integers c_0, c_1, ..., c_{2^n-1} (0 c_i 10^9), denoting the initial values of f. More specifically, f(x_0, x_1, ..., x_{n-1}) = c_x, if x = \overline{x_{n-1} x_0} in binary.
Each of the next r lines contains two integers z and g (0 z 2^n - 1, 0 g 10^9). If z = \overline{z_{n-1} ... z_0} in binary, then this means to set f(z_0, ..., z_{n-1}) g.
Output
Print r+1 lines, the i-th of which denotes the value of the game f during the i-th round. Your answer must have absolute or relative error within 10^{-6}.
Formally, let your answer be a, and the jury's answer be b. Your answer is considered correct if \frac{|a - b|}{max{(1, |b|)}} ≤ 10^{-6}.
Examples
Input
2 2
0 1 2 3
2 5
0 4
Output
1.500000
2.250000
3.250000
Input
1 0
2 3
Output
2.500000
Input
2 0
1 1 1 1
Output
1.000000
Note
Consider the second test case. If Allen goes first, he will set x_1 1, so the final value will be 3. If Bessie goes first, then she will set x_1 0 so the final value will be 2. Thus the answer is 2.5.
In the third test case, the game value will always be 1 regardless of Allen and Bessie's play.
Here is a reference code to solve this task. You can use this to help you genereate cases or validate the solution.
```python
n,r = map(int, raw_input().split())
ls = map(int, raw_input().split())
sm=sum(ls)
nls=2**n
print float(sm)/nls
for i in range(r):
a,b = map(int, raw_input().split())
sm+=b-ls[a]
ls[a]=b
print float(sm)/nls
```
请完成上述谜题的训练场环境类实现包括所有必要的方法
"""
from bootcamp import Basebootcamp
import re
import random
from bootcamp import Basebootcamp
class Fgamebootcamp(Basebootcamp):
def __init__(self, max_n=3, max_r=5, **kwargs):
"""
初始化训练场参数
:param max_n: 最大n值用于生成测试案例时限制n的范围
:param max_r: 最大r值限制修改次数
"""
super().__init__(**kwargs)
self.max_n = max_n
self.max_r = max_r
def case_generator(self):
"""
生成谜题实例
"""
n = random.randint(1, self.max_n)
size = 2 ** n
initial = [random.randint(0, 100) for _ in range(size)]
r = random.randint(0, self.max_r)
updates = []
for _ in range(r):
z = random.randint(0, size - 1)
g = random.randint(0, 100)
updates.append({"z": z, "g": g})
return {
"n": n,
"r": r,
"initial": initial,
"updates": updates
}
@staticmethod
def prompt_func(question_case) -> str:
"""
将谜题实例转换为问题描述文本
"""
n = question_case["n"]
r = question_case["r"]
initial = " ".join(map(str, question_case["initial"]))
updates = "\n".join([f"{u['z']} {u['g']}" for u in question_case["updates"]])
example_input = f"{n} {r}\n{initial}"
if r > 0:
example_input += "\n" + updates
prompt = f"""Allen和Bessie正在玩一个数字游戏。已知函数f接受n个二进制参数并返回实数值。游戏开始后两人轮流随机设置变量的值最终计算f的值。你的任务是计算游戏开始时和每次函数值变化后的期望值。
输入格式
第一行是n和r0 r 2^18第二行有2^n个整数表示初始的f值接着r行每行给出一个修改(z, g)表示将f在z处的值改为g
输出格式
输出r+1每行为对应阶段游戏的期望值保留六位小数
例如给定输入
2 2
0 1 2 3
2 5
0 4
正确输出
1.500000
2.250000
3.250000
请将答案包含在[answer]标签内每行一个结果格式如下
[answer]
1.500000
2.250000
3.250000
[/answer]
请输入以下测试案例的答案
{example_input}"""
return prompt
@staticmethod
def extract_output(output):
"""
从模型输出中提取答案
"""
answer_pattern = re.compile(r'\[answer\](.*?)\[/answer\]', re.DOTALL)
matches = answer_pattern.findall(output)
if not matches:
return None
last_answer = matches[-1].strip()
solutions = []
for line in last_answer.split('\n'):
line = line.strip()
if line:
try:
solutions.append(float(line))
except ValueError:
continue
return solutions if solutions else None
@classmethod
def _verify_correction(cls, solution, identity):
"""
验证答案是否正确
"""
if not solution or len(solution) != identity['r'] + 1:
return False
n = identity['n']
initial = identity['initial'].copy()
updates = identity['updates']
total = sum(initial)
expected = [total / (2 ** n)]
current_values = initial.copy()
for update in updates:
z = update['z']
g = update['g']
total += g - current_values[z]
current_values[z] = g
expected.append(total / (2 ** n))
if len(solution) != len(expected):
return False
for s, e in zip(solution, expected):
if abs(s - e) > 1e-6 and abs(s - e) / max(1, abs(e)) > 1e-6:
return False
return True