haochengsama's picture
Add files using upload-large-folder tool
97cb846 verified
Raw
History Blame Contribute Delete
3.14 kB
"""`file_splitting` task generator."""
import json
import random
import shutil
from collections import defaultdict
from pathlib import Path
from ..base import (
Generator, _VERIFY_HEADER, _render_verify, pad_to, _write, _para,
_AUTHORS, _SONG_TITLES, _STUDENTS, _WORDS,
)
class FileSplitting(Generator):
KEY = "file_splitting"
CATEGORY_NAME = "File Splitting"
DIFFICULTY = "L2"
TAGS = ["file content", "split"]
SRC = "combined.txt"
DELIM = "-----"
OUT_DIR = "parts"
def build(self, env_dir, llm, rng):
k = rng.randint(3, 5)
sections = []
for _ in range(k):
sections.append("\n".join(_para(rng, rng.randint(2, 4))))
content = ("\n" + self.DELIM + "\n").join(sections)
_write(env_dir / self.SRC, content + "\n")
return {"src": self.SRC, "delim": self.DELIM, "out_dir": self.OUT_DIR, "k": k}
def description(self, spec):
return (
"Please use FileSystem tools to finish the following task:\n\n"
"### Task: Split a combined file into parts\n\n"
f"The file `{self.SRC}` contains several sections separated by lines that "
f"consist of exactly `{self.DELIM}`.\n\n"
f"1. Create a folder named `{self.OUT_DIR}/` in the test directory root.\n"
f"2. Write each section, in order, to `{self.OUT_DIR}/part_1.txt`, "
f"`{self.OUT_DIR}/part_2.txt`, … (1-based).\n"
"3. Each part file contains only that section's text (no delimiter "
"lines). Do not modify the original file."
)
def verify_src(self, spec):
body = '''
C = json.loads(__CONSTS__)
def main():
t = get_test_dir()
src = t / C["src"]
if not src.is_file():
fail(f"source file missing: {C['src']}")
sections = src.read_text(encoding="utf-8").split("\\n" + C["delim"] + "\\n")
pdir = t / C["out_dir"]
if not pdir.is_dir():
fail(f"missing directory: {C['out_dir']}")
for i, sec in enumerate(sections, 1):
pf = pdir / f"part_{i}.txt"
if not pf.is_file():
fail(f"missing part file: part_{i}.txt")
if pf.read_text(encoding="utf-8").strip() != sec.strip():
fail(f"part_{i}.txt content does not match section {i}")
extra = [p.name for p in pdir.iterdir() if p.is_file() and p.name not in
{f"part_{i}.txt" for i in range(1, len(sections) + 1)}]
if extra:
fail(f"unexpected files in {C['out_dir']}: {extra}")
ok(f"file correctly split into {len(sections)} parts")
print("\\U0001f389 All checks passed!")
sys.exit(0)
if __name__ == "__main__":
main()
'''
return _render_verify(body, {"src": spec["src"], "delim": spec["delim"], "out_dir": spec["out_dir"]})
def solve(self, work_dir, spec):
src = work_dir / spec["src"]
sections = src.read_text(encoding="utf-8").split("\n" + spec["delim"] + "\n")
pdir = work_dir / spec["out_dir"]
pdir.mkdir(exist_ok=True)
for i, sec in enumerate(sections, 1):
_write(pdir / f"part_{i}.txt", sec.strip() + "\n")