mirror of
https://github.com/InternLM/InternBootcamp.git
synced 2026-05-01 17:45:22 +00:00
init-commit
This commit is contained in:
commit
18a552597a
3461 changed files with 1150579 additions and 0 deletions
111
internbootcamp/bootcamp/cdisposition/cdisposition.py
Executable file
111
internbootcamp/bootcamp/cdisposition/cdisposition.py
Executable file
|
|
@ -0,0 +1,111 @@
|
|||
"""#
|
||||
|
||||
### 谜题描述
|
||||
Vasya bought the collected works of a well-known Berland poet Petya in n volumes. The volumes are numbered from 1 to n. He thinks that it does not do to arrange the book simply according to their order. Vasya wants to minimize the number of the disposition’s divisors — the positive integers i such that for at least one j (1 ≤ j ≤ n) is true both: j mod i = 0 and at the same time p(j) mod i = 0, where p(j) is the number of the tome that stands on the j-th place and mod is the operation of taking the division remainder. Naturally, one volume can occupy exactly one place and in one place can stand exactly one volume.
|
||||
|
||||
Help Vasya — find the volume disposition with the minimum number of divisors.
|
||||
|
||||
Input
|
||||
|
||||
The first line contains number n (1 ≤ n ≤ 100000) which represents the number of volumes and free places.
|
||||
|
||||
Output
|
||||
|
||||
Print n numbers — the sought disposition with the minimum divisor number. The j-th number (1 ≤ j ≤ n) should be equal to p(j) — the number of tome that stands on the j-th place. If there are several solutions, print any of them.
|
||||
|
||||
Examples
|
||||
|
||||
Input
|
||||
|
||||
2
|
||||
|
||||
|
||||
Output
|
||||
|
||||
2 1
|
||||
|
||||
|
||||
Input
|
||||
|
||||
3
|
||||
|
||||
|
||||
Output
|
||||
|
||||
1 3 2
|
||||
|
||||
Here is a reference code to solve this task. You can use this to help you genereate cases or validate the solution.
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
|
||||
n = int(raw_input())
|
||||
r = range(2, n + 2)
|
||||
r[-1] = 1
|
||||
print ' '.join(map(str, r))
|
||||
```
|
||||
|
||||
|
||||
请完成上述谜题的训练场环境类实现,包括所有必要的方法。
|
||||
"""
|
||||
|
||||
from bootcamp import Basebootcamp
|
||||
import random
|
||||
import math
|
||||
from bootcamp import Basebootcamp
|
||||
|
||||
class Cdispositionbootcamp(Basebootcamp):
|
||||
def __init__(self, **params):
|
||||
self.n = params.get('n', random.randint(1, 100000))
|
||||
|
||||
def case_generator(self):
|
||||
n = random.randint(1, 100000)
|
||||
if n == 1:
|
||||
p = [1]
|
||||
else:
|
||||
p = [i + 1 for i in range(n)]
|
||||
p[-1] = 1
|
||||
return {'n': n, 'p': p}
|
||||
|
||||
@staticmethod
|
||||
def prompt_func(question_case):
|
||||
n = question_case['n']
|
||||
return (
|
||||
f"你有一个包含{n}本的书籍集,编号从1到{n}。你需要将这些书籍排列成一个序列p,使得除数的数目最少。"
|
||||
f"除数i的定义是:存在至少一个位置j(1 ≤ j ≤ {n}),使得j和p(j)都能被i整除。"
|
||||
f"你的任务是找到这样的排列p,并将其输出为一个由空格分隔的整数序列。"
|
||||
f"请将答案放在[answer]标签内,例如:[answer]2 3 1[/answer]"
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def extract_output(output):
|
||||
start = output.rfind('[answer]')
|
||||
if start == -1:
|
||||
return None
|
||||
end = output.find('[/answer]', start)
|
||||
if end == -1:
|
||||
return None
|
||||
answer_str = output[start + len('[answer]'):end].strip()
|
||||
try:
|
||||
solution = list(map(int, answer_str.split()))
|
||||
except ValueError:
|
||||
return None
|
||||
return solution
|
||||
|
||||
@classmethod
|
||||
def _verify_correction(cls, solution, identity):
|
||||
n = identity['n']
|
||||
if len(solution) != n:
|
||||
return False
|
||||
if sorted(solution) != list(range(1, n+1)):
|
||||
return False
|
||||
divisors = set()
|
||||
for j in range(1, n+1):
|
||||
p_j = solution[j-1]
|
||||
g = math.gcd(j, p_j)
|
||||
factors = set()
|
||||
for i in range(1, int(math.sqrt(g)) + 1):
|
||||
if g % i == 0:
|
||||
factors.add(i)
|
||||
factors.add(g // i)
|
||||
divisors.update(factors)
|
||||
return len(divisors) == 1
|
||||
Loading…
Add table
Add a link
Reference in a new issue