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,208 @@
"""#
### 谜题描述
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
from fractions import *
from math import *
from itertools import *
from fractions import*
import string
import copy
import random
import bisect
from decimal import *
from collections import deque
def id_generator(size=20, chars=string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def mp():
return map(int,str(raw_input()).split())
n,r=mp()
l=list(mp())
x=pow(2,n)
s=sum(l)
print(s/float(x))
for i in range(r):
a,b=mp()
s=s-l[a]
s+=b
l[a]=b
print(s/float(x))
```
请完成上述谜题的训练场环境类实现包括所有必要的方法
"""
from bootcamp import Basebootcamp
import random
import re
from math import isclose
from bootcamp import Basebootcamp
class Dgamebootcamp(Basebootcamp):
def __init__(self, **params):
self.n = params.get('n', 2)
self.r = params.get('r', 0)
# 验证n和r的范围
if self.n < 1 or self.n > 18:
raise ValueError("n must be between 1 and 18")
if self.r < 0 or self.r > (2 ** 18):
raise ValueError("r must be between 0 and 2^18")
def case_generator(self):
n = self.n
r = self.r
size = 2 ** n
# 生成初始c数组考虑边界情况
initial_c = [random.randint(0, 10**9) for _ in range(size)]
# 确保至少有一次修改如果r>0
updates = []
for _ in range(r):
z = random.randint(0, size - 1)
g = random.randint(0, 10**9)
updates.append((z, g))
case = {
'n': n,
'initial_c': initial_c,
'r': r,
'updates': updates
}
return case
@staticmethod
def prompt_func(question_case):
n = question_case['n']
initial_c = question_case['initial_c']
r = question_case['r']
prompt = (
"Allen和Bessie正在玩一个数字游戏。游戏规则如下\n"
"游戏由一个函数f决定f接受n个二进制变量返回一个实数值。"
"初始时,所有变量设为-1每轮随机选择一个玩家设置一个变量为0或1。"
"游戏目标是计算在每一轮修改后的期望值输出r+1个结果每个结果保留六位小数。\n"
"初始函数值为:"
)
prompt += f"{initial_c}\n"
prompt += "每次修改操作如下:\n"
for i, (z, g) in enumerate(question_case['updates'], 1):
prompt += f"{i}次修改将f的值{z}修改为{g}\n"
prompt += (
"请输出每次修改后的期望值,每个值放在[answer]标签内,"
"保留六位小数,例如:[answer]1.500000[/answer]。"
)
return prompt
@staticmethod
def extract_output(output):
pattern = r'\[answer\](.*?)\[\/answer\]'
matches = re.findall(pattern, output)
if not matches:
return None
solutions = []
for m in matches:
m_clean = m.strip()
# 处理可能的格式问题,例如多余的空格或换行符
if m_clean == "":
continue
try:
num = float(m_clean)
solutions.append(num)
except ValueError:
pass
if not solutions:
return None
return solutions
@classmethod
def _verify_correction(cls, solution, identity):
if isinstance(solution, list):
solutions = solution
else:
solutions = [solution]
n = identity['n']
size = 2 ** n
initial_c = identity['initial_c']
updates = identity['updates']
r = identity['r']
correct = []
current_sum = sum(initial_c)
correct_value = current_sum / size
correct.append(correct_value)
current_c = initial_c.copy()
for z, g in updates:
delta = g - current_c[z]
current_sum += delta
current_c[z] = g
correct_value = current_sum / size
correct.append(correct_value)
if len(solutions) != len(correct):
return False
for s, c in zip(solutions, correct):
if not isclose(s, c, rel_tol=1e-6, abs_tol=1e-6):
return False
return True