Bỏ qua để đến nội dung

Hướng dẫn chấm bài bằng bộ test

Trang này hướng dẫn thầy cô dùng bộ test đi kèm bộ đề ôn thi HSG Tin học THCS để chấm bài của học sinh. Phần “Lỗi hay gặp” ở cuối trang hữu ích cho cả các em tự luyện.

Sau khi giải nén, thư mục goi-test có dạng:

goi-test/
├── README.md hướng dẫn ngắn và bảng thời gian chạy của từng bài
├── cham.py công cụ chấm bài
├── include/ file hỗ trợ biên dịch C++ trên macOS
└── de-01/
├── XEDAP/
│ ├── problem.json điểm của bài, thời gian chạy tối đa
│ └── tests/ 01.inp, 01.out, 02.inp, 02.out, ...
└── ...

Mỗi bài có 12–20 test, chia đúng theo tỉ lệ ràng buộc ghi trong đề (ví dụ “Có 40% số test với n ≤ 1000”). Các test có điểm bằng nhau, nên học sinh chỉ làm được subtask nhỏ vẫn nhận được phần điểm tương ứng.

cham.py chạy được trên Windows, macOS và Linux. Chỉ cần cài Python 3.8 trở lên. Muốn chấm bài C++ thì máy cần có g++: trên Windows cài MinGW (thường có sẵn nếu đã cài Dev-C++ hoặc Code::Blocks và thêm vào PATH), trên macOS chạy xcode-select --install.

Mở cửa sổ lệnh (Command Prompt / Terminal) tại thư mục goi-test rồi chạy:

Terminal window
# Chấm một bài làm
python cham.py de-01/XEDAP D:/baiLam/XEDAP.py
python cham.py de-01/TIACAY D:/baiLam/TIACAY.cpp

Kết quả hiện từng test và điểm của bài:

Bài TIACAY (Tỉa hàng cây), 6 điểm
Test 01: AC Đúng 0.02s
...
Test 20: TLE Quá thời gian 2.00s
=> Đúng 9/20 test, điểm: 2.70/6

Ý nghĩa các kết quả:

Kí hiệuÝ nghĩa
ACĐúng
WASai kết quả
TLEChạy quá thời gian cho phép
REChương trình bị lỗi khi chạy
NOKhông tìm thấy file kết quả (thường do sai tên file)

Xếp bài làm của mỗi học sinh vào một thư mục riêng, file đặt tên theo mã bài:

bai-lam-lop-9a/
├── nguyen-van-an/ XEDAP.py CHUDAO.py TIACAY.cpp
├── tran-thi-binh/ XEDAP.cpp CHUDAO.cpp SOCHIA5.cpp TIACAY.cpp
└── ...

Rồi chạy:

Terminal window
python cham.py de-01 bai-lam-lop-9a --csv bang-diem.csv

cham.py chấm lần lượt từng học sinh, in bảng điểm và ghi ra file bang-diem.csv (mở được bằng Excel).

  • Sai tên file. Phải đọc đúng XEDAP.INP và ghi đúng XEDAP.OUT. Viết xedap.inp vẫn chạy được trên Windows nhưng sẽ lỗi trên hệ thống chấm chạy Linux, nên hãy viết đúng chữ hoa như đề.
  • In thêm câu thông báo. Các dòng như Nhap n = hay Ket qua la: làm kết quả sai. Chỉ ghi đúng những gì đề yêu cầu.
  • Vẫn nhập từ bàn phím. Dùng input() hay cin mà không mở file thì chương trình sẽ đứng chờ và bị tính quá thời gian.
  • Tràn số với C++. Khi đề cho giá trị tới 109 hoặc 1018, các phép nhân và tổng phải dùng long long.
  • Quá thời gian ở các test lớn. Hãy đọc kỹ phần ràng buộc để chọn thuật toán phù hợp. Thuật toán O(n2) với n = 105 không thể chạy kịp trong 1 giây.

Khung chương trình đọc/ghi file đúng cách:

with open("XEDAP.INP") as f:
m, n = map(int, f.read().split())
# ... tính toán ...
with open("XEDAP.OUT", "w") as f:
f.write(f"{x} {y}\n")
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen("XEDAP.INP", "r", stdin);
freopen("XEDAP.OUT", "w", stdout);
long long m, n;
cin >> m >> n;
// ... tính toán ...
cout << x << " " << y << "\n";
return 0;
}