Đóng gói dữ liệu test (Test Data Package)
Khi ra đề trên CTOJ, dữ liệu chấm được nạp lên dưới dạng một file ZIP chứa các cặp file test và một file kê khai (manifest) init.yml. Bài viết này mô tả cấu trúc file ZIP đó: nội dung bên trong, định dạng init.yml, quy ước đặt tên, và cách tải lên.
Bài này dành cho người ra đề. Nếu bạn là thí sinh và muốn hiểu input/output trông như thế nào, xem Định dạng test (Input/Output).
Cấu trúc file ZIP
Tất cả file phải nằm phẳng ở thư mục gốc của ZIP — không bọc trong thư mục con (tests/, data/, ...). Hệ thống đọc trực tiếp 01.in, không phải tests/01.in.
tests.zip
├── 01.in ← input của test 1
├── 01.out ← output chuẩn của test 1
├── 02.in
├── 02.out
├── ...
├── 10.in
├── 10.out
└── init.yml ← file kê khai danh sách test + điểm
| Thành phần | Vai trò |
|---|---|
*.in |
Dữ liệu vào, được nạp vào stdin của chương trình thí sinh |
*.out |
Đáp án chuẩn, dùng để so sánh với stdout của thí sinh |
init.yml| Manifest: liệt kê các test theo thứ tự và điểm từng test |
File init.yml
Đây là file YAML khai báo archive và danh sách test:
archive: tests.zip
testcases:
- { in: 01.in, out: 01.out, points: 10 }
- { in: 02.in, out: 02.out, points: 10 }
- { in: 03.in, out: 03.out, points: 10 }
- { in: 04.in, out: 04.out, points: 10 }
- { in: 05.in, out: 05.out, points: 10 }
- { in: 06.in, out: 06.out, points: 10 }
- { in: 07.in, out: 07.out, points: 10 }
- { in: 08.in, out: 08.out, points: 10 }
- { in: 09.in, out: 09.out, points: 10 }
- { in: 10.in, out: 10.out, points: 10 }
Các trường
| Trường | Ý nghĩa |
|---|---|
archive |
Tên file ZIP (thường là tests.zip). |
testcases |
Danh sách test theo đúng thứ tự chấm. |
in |
Tên file input của test (phải khớp file trong ZIP). |
out |
Tên file output chuẩn của test. |
points |
Điểm của test đó. |
Về điểm (points)
- Tổng điểm các test thường được quy về 100 (ví dụ 10 test × 10 điểm, hoặc 20 test × 5 điểm).
- Mỗi test có thể có số điểm khác nhau nếu muốn nhấn mạnh nhóm test nặng/biên.
- Với bài chấm toàn phần (full score) theo lối thông thường, chỉ cần chia đều điểm cho mọi test.
Quy ước đặt tên & số lượng
- Đặt tên test theo số 2 chữ số, có số 0 ở đầu:
01.in/01.out,02.in/02.out, ... - Mỗi test phải đủ một cặp
.invà.out. - Số lượng test gợi ý theo độ khó:
- Dễ: ~10 test
- Trung bình: ~20 test
- Khó: 30–50 test
- Nên có test biên (n nhỏ nhất, n lớn nhất), test ngẫu nhiên, và test "anti" để loại các lời giải sai hoặc chậm.
Bài có checker / interactive
Với bài dùng custom checker (bridged) hoặc interactive, cấu trúc ZIP không thay đổi — vẫn gồm *.in, *.out, init.yml:
- File
.outvẫn là đáp án tham chiếu. Hệ thống truyền nó cho checker/interactor qua streamans(xem Custom Checker và Interactive Problem). - Nếu một test không có đáp án so sánh trực tiếp (checker tự kiểm tra hoàn toàn từ
infvàouf), file.outvẫn cần tồn tại — có thể để rỗng hoặc chứa giá trị tối ưu tùy theo logic checker. - Mã nguồn checker/interactor không nằm trong ZIP test; nó được cấu hình riêng ở phần thiết lập bài.
Tạo file ZIP
Khi đã có các file test trong một thư mục, đóng gói chúng thành ZIP sao cho mọi file nằm phẳng ở gốc (không có thư mục con):
- Windows: chọn tất cả các file
*.in,*.outvàinit.yml(không chọn thư mục chứa chúng), bấm chuột phải → Send to → Compressed (zipped) folder. - macOS: chọn các file (không phải thư mục), bấm chuột phải → Compress.
- Dòng lệnh (cờ
-jđể bỏ đường dẫn thư mục):zip -j tests.zip *.in *.out init.yml
Mở thử file ZIP để chắc chắn thấy 01.in, 01.out, ..., init.yml ngay ở gốc, không nằm trong thư mục con.
Tải dữ liệu lên CTOJ
Sau khi đã có file tests.zip đúng cấu trúc, bạn tải nó lên qua giao diện quản lý bài:
- Mở trang chỉnh sửa bài toán của bài cần cập nhật (dành cho người có quyền ra đề).
- Tìm tới mục Dữ liệu test (Test data).
- Bấm chọn file và chọn
tests.ziptừ máy của bạn, rồi tải lên. - Lưu lại. Hệ thống sẽ đọc
init.ymltrong ZIP để nhận diện danh sách test và điểm. - Đợi vài giây để dữ liệu test đồng bộ sang các máy chấm, sau đó nộp lại lời giải mẫu để xác nhận vẫn được AC trên bộ test mới.
Mỗi lần tải lên sẽ thay thế toàn bộ dữ liệu test cũ của bài bằng nội dung trong ZIP mới. Hãy đảm bảo ZIP chứa đầy đủ tất cả test bạn muốn giữ, không chỉ phần thay đổi.
Sai sót thường gặp
- Bọc file trong thư mục con trong ZIP → hệ thống không tìm thấy
01.in. Luôn đóng gói phẳng. - Tên trong
init.ymlkhông khớp tên file thật trong ZIP (sai phần mở rộng, sai số 0 đầu) → test bị bỏ hoặc lỗi. - Thiếu file
.outcho một test khai tronginit.yml. - Quên
init.ymltrong ZIP → không có manifest, hệ thống không biết danh sách test. - CRLF/khoảng trắng thừa ở cuối file output — hệ thống thường bỏ qua khoảng trắng cuối dòng, nhưng nên giữ output sạch (đúng
\n, không dòng trống thừa).
Tóm tắt
| Mục | Quy ước |
|---|---|
| Layout ZIP | Phẳng ở gốc: *.in, *.out, init.yml |
| Tên test | 2 chữ số: 01.in/01.out, ... |
| Manifest | init.yml với archive + danh sách {in, out, points} |
| Tổng điểm | Thường quy về 100 |
| Checker/Interactive | Cùng layout; .out là đáp án tham chiếu (ans) |
| Tải lên | Qua trang chỉnh sửa bài → mục Dữ liệu test → tải ZIP → lưu |