Wiki Hướng dẫn ra đề Đóng gói dữ liệu test (Test Data Package)

Đóng gói dữ liệu test (Test Data Package)

huunguyen huunguyen Updated Tháng sáu 22, 2026

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 .in.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 .out vẫn là đáp án tham chiếu. Hệ thống truyền nó cho checker/interactor qua stream ans (xem Custom CheckerInteractive 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ừ infouf), file .out vẫ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, *.outinit.yml (không chọn thư mục chứa chúng), bấm chuột phải → Send toCompressed (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:

  1. 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 đề).
  2. Tìm tới mục Dữ liệu test (Test data).
  3. Bấm chọn file và chọn tests.zip từ máy của bạn, rồi tải lên.
  4. Lưu lại. Hệ thống sẽ đọc init.yml trong ZIP để nhận diện danh sách test và điểm.
  5. Đợ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.yml khô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 .out cho một test khai trong init.yml.
  • Quên init.yml trong 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
gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0