InternBootcamp/internbootcamp/bootcamp/cjzzhuandapples/cjzzhuandapples.py
Yongkang Chen a8249acc18
update to tech report version (#10)
* feat(run_eval): add checkpoint resume functionality and update example documentation;
- update new bootcamp benchmark dataset

* refactor(data_pipeline): optimize data generation pipeline; add multiple preset configurations for data generation

* docs: update bootcamp list and add new scripts

- Update Fulllist_InternBootcamp.md with new bootcamps and categories
- Add new scripts to .gitignore:
  - examples/pipelines/filter_autogen_configs.py
  - examples/pipelines/quickgen_data_configs_from_eval_meta.py
- Update dependencies in setup.py:
  - Add scipy and scikit-learn

* refactor(internbootcamp): update bootcamp modules and improve error handling

- Update import statements in __init__.py files
- Add timestamp to target directory name in verl_data_preprocess.py
- Improve error handling and scoring logic in bootcamp_judger.py
- Remove unnecessary comments and update puzzle descriptions in multiple files
2025-08-28 12:39:47 +08:00

211 lines
5.2 KiB
Python
Executable file

"""### 谜题描述
Jzzhu has picked n apples from his big apple tree. All the apples are numbered from 1 to n. Now he wants to sell them to an apple store.
Jzzhu will pack his apples into groups and then sell them. Each group must contain two apples, and the greatest common divisor of numbers of the apples in each group must be greater than 1. Of course, each apple can be part of at most one group.
Jzzhu wonders how to get the maximum possible number of groups. Can you help him?
Input
A single integer n (1 ≤ n ≤ 105), the number of the apples.
Output
The first line must contain a single integer m, representing the maximum number of groups he can get. Each of the next m lines must contain two integers — the numbers of apples in the current group.
If there are several optimal answers you can print any of them.
Examples
Input
6
Output
2
6 3
2 4
Input
9
Output
3
9 3
2 4
6 8
Input
2
Output
0
Here is a reference code to solve this task. You can use this to help you genereate cases or validate the solution.
```python
n=input()
ans=[]
used={i:0 for i in range(1,n+1)}
an=0
for i in range(3,n/2+1,2)+[2]:
prime=True
for j in range(3,int(i**0.5)+1,2):
if i%j==0:
prime=False
break
if prime:
cur=[i]
l=1
for j in range(3,n/i+1):
if used[j*i]==0:
cur.append(j*i)
used[j*i]=1
l+=1
if l%2==1 and 2*i<=n:
cur.append(2*i)
used[2*i]=1
l+=1
for j in range(l/2):
an+=1
ans.append((cur[j*2],cur[2*j+1]))
print an
for i in ans:
print i[0],i[1]
```
请完成上述谜题的训练场环境类实现,包括所有必要的方法。
"""
from bootcamp import Basebootcamp
import math
import random
from bootcamp import Basebootcamp
class Cjzzhuandapplesbootcamp(Basebootcamp):
def __init__(self, n_min=2, n_max=100):
self.n_min = max(1, n_min)
self.n_max = n_max
def case_generator(self):
n = random.randint(self.n_min, self.n_max)
m_correct = self.compute_max_groups(n)
return {'n': n, 'm_correct': m_correct}
@staticmethod
def compute_max_groups(n):
if n < 2:
return 0
used = [False] * (n + 1)
primes = []
# Efficient sieve to find primes up to n//2
sieve_size = (n // 2) + 1
sieve = [True] * sieve_size
sieve[0] = sieve[1] = False
for i in range(2, int(math.isqrt(sieve_size)) + 1):
if sieve[i]:
sieve[i*i::i] = [False] * len(sieve[i*i::i])
# Collect primes in the order: odd primes first, then 2
primes = [i for i in range(3, sieve_size, 2) if sieve[i]]
if 2 <= sieve_size:
primes.append(2)
total_groups = 0
for prime in primes:
if prime > n // 2:
continue
# Collect multiples of prime
multiples = []
if not used[prime]:
multiples.append(prime)
used[prime] = True
max_multiple = n // prime
for multiplier in range(3, max_multiple + 1):
num = prime * multiplier
if not used[num]:
multiples.append(num)
used[num] = True
# Handle odd count
if len(multiples) % 2 != 0:
candidate = prime * 2
if candidate <= n and not used[candidate]:
multiples.append(candidate)
used[candidate] = True
total_groups += len(multiples) // 2
return total_groups
@staticmethod
def prompt_func(question_case) -> str:
n = question_case['n']
return f"""Jzzhu has {n} apples numbered 1-{n}. Group them into pairs where each pair's GCD >1. Find the maximum groups.
Output format:
m
a1 b1
...
am bm
Put your answer between [answer] and [/answer]. Example:
[answer]
2
6 3
2 4
[/answer]"""
@staticmethod
def extract_output(output):
import re
matches = re.findall(r'\[answer\](.*?)\[/answer\]', output, re.DOTALL)
if not matches:
return None
answer = matches[-1].strip().split('\n')
try:
m = int(answer[0])
pairs = [tuple(map(int, line.split())) for line in answer[1:m+1]]
if len(pairs) != m:
return None
return pairs
except:
return None
@classmethod
def _verify_correction(cls, solution, identity):
if not solution:
return identity['m_correct'] == 0
n = identity['n']
expected_m = identity['m_correct']
if len(solution) != expected_m:
return False
used = set()
for a, b in solution:
if a < 1 or b < 1 or a > n or b > n:
return False
if math.gcd(a, b) == 1:
return False
if a in used or b in used:
return False
used.update({a, b})
return True