mirror of
https://github.com/InternLM/InternBootcamp.git
synced 2026-04-19 12:58:04 +00:00
init-commit
This commit is contained in:
commit
18a552597a
3461 changed files with 1150579 additions and 0 deletions
216
internbootcamp/bootcamp/eyaroslavandalgorithm/eyaroslavandalgorithm.py
Executable file
216
internbootcamp/bootcamp/eyaroslavandalgorithm/eyaroslavandalgorithm.py
Executable file
|
|
@ -0,0 +1,216 @@
|
|||
"""#
|
||||
|
||||
### 谜题描述
|
||||
Yaroslav likes algorithms. We'll describe one of his favorite algorithms.
|
||||
|
||||
1. The algorithm receives a string as the input. We denote this input string as a.
|
||||
2. The algorithm consists of some number of command. Сommand number i looks either as si >> wi, or as si <> wi, where si and wi are some possibly empty strings of length at most 7, consisting of digits and characters \"?\".
|
||||
3. At each iteration, the algorithm looks for a command with the minimum index i, such that si occurs in a as a substring. If this command is not found the algorithm terminates.
|
||||
4. Let's denote the number of the found command as k. In string a the first occurrence of the string sk is replaced by string wk. If the found command at that had form sk >> wk, then the algorithm continues its execution and proceeds to the next iteration. Otherwise, the algorithm terminates.
|
||||
5. The value of string a after algorithm termination is considered to be the output of the algorithm.
|
||||
|
||||
|
||||
|
||||
Yaroslav has a set of n positive integers, he needs to come up with his favorite algorithm that will increase each of the given numbers by one. More formally, if we consider each number as a string representing the decimal representation of the number, then being run on each of these strings separately, the algorithm should receive the output string that is a recording of the corresponding number increased by one.
|
||||
|
||||
Help Yaroslav.
|
||||
|
||||
Input
|
||||
|
||||
The first line contains integer n (1 ≤ n ≤ 100) — the number of elements in the set. The next n lines contains one positive integer each. All the given numbers are less than 1025.
|
||||
|
||||
Output
|
||||
|
||||
Print the algorithm which can individually increase each number of the set. In the i-th line print the command number i without spaces.
|
||||
|
||||
Your algorithm will be launched for each of these numbers. The answer will be considered correct if:
|
||||
|
||||
* Each line will a correct algorithm command (see the description in the problem statement).
|
||||
* The number of commands should not exceed 50.
|
||||
* The algorithm will increase each of the given numbers by one.
|
||||
* To get a respond, the algorithm will perform no more than 200 iterations for each number.
|
||||
|
||||
Examples
|
||||
|
||||
Input
|
||||
|
||||
2
|
||||
10
|
||||
79
|
||||
|
||||
|
||||
Output
|
||||
|
||||
10<>11
|
||||
79<>80
|
||||
|
||||
Here is a reference code to solve this task. You can use this to help you genereate cases or validate the solution.
|
||||
```python
|
||||
C = [
|
||||
\"??0>>0??\",
|
||||
\"??1>>1??\",
|
||||
\"??2>>2??\",
|
||||
\"??3>>3??\",
|
||||
\"??4>>4??\",
|
||||
\"??5>>5??\",
|
||||
\"??6>>6??\",
|
||||
\"??7>>7??\",
|
||||
\"??8>>8??\",
|
||||
\"??9>>9??\",
|
||||
\"??>>?\",
|
||||
\"0?<>1\",
|
||||
\"1?<>2\",
|
||||
\"2?<>3\",
|
||||
\"3?<>4\",
|
||||
\"4?<>5\",
|
||||
\"5?<>6\",
|
||||
\"6?<>7\",
|
||||
\"7?<>8\",
|
||||
\"8?<>9\",
|
||||
\"9?>>?0\",
|
||||
\"?<>1\",
|
||||
\"0>>??0\",
|
||||
\"1>>??1\",
|
||||
\"2>>??2\",
|
||||
\"3>>??3\",
|
||||
\"4>>??4\",
|
||||
\"5>>??5\",
|
||||
\"6>>??6\",
|
||||
\"7>>??7\",
|
||||
\"8>>??8\",
|
||||
\"9>>??9\",
|
||||
]
|
||||
print '\n'.join(C)
|
||||
```
|
||||
|
||||
|
||||
请完成上述谜题的训练场环境类实现,包括所有必要的方法。
|
||||
"""
|
||||
|
||||
from bootcamp import Basebootcamp
|
||||
import random
|
||||
from bootcamp import Basebootcamp
|
||||
|
||||
class Eyaroslavandalgorithmbootcamp(Basebootcamp):
|
||||
def __init__(self, **params):
|
||||
self.params = {
|
||||
'n': params.get('n', 2),
|
||||
'max_iterations': 200,
|
||||
'max_commands': 50
|
||||
}
|
||||
|
||||
def case_generator(self):
|
||||
n = self.params['n']
|
||||
numbers = []
|
||||
for _ in range(n):
|
||||
num_length = random.randint(1, 25)
|
||||
# 生成包含进位的测试用例
|
||||
if random.random() < 0.3:
|
||||
num_str = '9' * num_length
|
||||
elif random.random() < 0.3:
|
||||
num_str = '1' + '9' * (num_length - 1)
|
||||
else:
|
||||
num = random.randint(1, 10**25)
|
||||
num_str = str(num).lstrip('0')
|
||||
if not num_str:
|
||||
num_str = '0'
|
||||
numbers.append(num_str)
|
||||
return {'n': n, 'numbers': numbers, 'max_iterations': self.params['max_iterations'], 'max_commands': self.params['max_commands']}
|
||||
|
||||
@staticmethod
|
||||
def prompt_func(question_case):
|
||||
n = question_case['n']
|
||||
numbers = question_case['numbers']
|
||||
problem = "设计一个算法,使得对于以下每个数字,算法将该数字增加1。"
|
||||
problem += "算法由一系列命令组成,每个命令的形式为 'si >> wi' 或 'si <> wi'。"
|
||||
problem += "其中,si和wi是长度不超过7的字符串,可包含数字和'?'。"
|
||||
problem += "算法执行过程如下:\n"
|
||||
problem += "1. 每次找到第一个匹配的命令,替换后可能继续或终止。\n"
|
||||
problem += "2. 如果使用 '>>',则继续执行;如果使用 '<>',则终止。\n"
|
||||
problem += "以下是要处理的数字:\n"
|
||||
for num in numbers:
|
||||
problem += f"{num}\n"
|
||||
problem += "请给出你的命令列表,每个命令占一行,放在[answer]标签内。\n"
|
||||
problem += "示例:\n"
|
||||
problem += "[answer]\n"
|
||||
problem += "10<>11\n"
|
||||
problem += "79<>80\n"
|
||||
problem += "[/answer]\n"
|
||||
return problem
|
||||
|
||||
@staticmethod
|
||||
def extract_output(output):
|
||||
start = output.rfind("[answer]")
|
||||
if start == -1:
|
||||
return None
|
||||
end = output.find("[/answer]", start)
|
||||
if end == -1:
|
||||
return None
|
||||
content = output[start+8:end].strip()
|
||||
commands = []
|
||||
for line in content.split('\n'):
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
if '>>' in line:
|
||||
parts = line.split('>>', 1)
|
||||
if len(parts) != 2:
|
||||
return None
|
||||
si, wi = parts
|
||||
if len(si) > 7 or len(wi) > 7:
|
||||
return None
|
||||
if not all(c in '0123456789?' for c in si + wi):
|
||||
return None
|
||||
elif '<>' in line:
|
||||
parts = line.split('<>', 1)
|
||||
if len(parts) != 2:
|
||||
return None
|
||||
si, wi = parts
|
||||
if len(si) > 7 or len(wi) > 7:
|
||||
return None
|
||||
if not all(c in '0123456789?' for c in si + wi):
|
||||
return None
|
||||
else:
|
||||
return None
|
||||
commands.append(line)
|
||||
return commands
|
||||
|
||||
@classmethod
|
||||
def _verify_correction(cls, solution, identity):
|
||||
if not solution:
|
||||
return False
|
||||
if len(solution) > identity.get('max_commands', 50):
|
||||
return False
|
||||
numbers = identity['numbers']
|
||||
max_iterations = identity.get('max_iterations', 200)
|
||||
for s in numbers:
|
||||
input_str = s
|
||||
expected = str(int(s) + 1)
|
||||
a = input_str
|
||||
iterations = 0
|
||||
while iterations < max_iterations:
|
||||
found = False
|
||||
for cmd in solution:
|
||||
if '>>' in cmd:
|
||||
si, wi = cmd.split('>>', 1)
|
||||
cmd_type = '>>'
|
||||
elif '<>' in cmd:
|
||||
si, wi = cmd.split('<>', 1)
|
||||
cmd_type = '<>'
|
||||
else:
|
||||
continue
|
||||
pos = a.find(si)
|
||||
if pos != -1:
|
||||
a = a[:pos] + wi + a[pos+len(si):]
|
||||
found = True
|
||||
if cmd_type == '<>':
|
||||
break
|
||||
break
|
||||
if not found:
|
||||
break
|
||||
iterations += 1
|
||||
if iterations >= max_iterations:
|
||||
break
|
||||
if a != expected:
|
||||
return False
|
||||
return True
|
||||
Loading…
Add table
Add a link
Reference in a new issue