Nộp bài và đọc kết quả chấm
Trang này tóm tắt những gì cần biết để nộp bài tập của giáo trình lên hệ thống: chuẩn bị máy, quy ước nhập/xuất, cách tự kiểm tra ở máy và ý nghĩa từng kết quả chấm. Chi tiết đầy đủ nằm ở mục 2.4, 2.5, 9.3, 9.6 và Phụ lục A, D của sách.
1. Chuẩn bị máy
Cài Python
- Mở terminal (PowerShell), gõ
python --version. ThấyPython 3.12trở lên là đủ, bỏ qua bước cài. - Chưa có thì vào python.org → Downloads → Windows, tải Python install manager, cài, rồi mở terminal mới và gõ
py install 3.14. - Dùng bộ cài đầy đủ (
python-3.x.y-amd64.exe) thì nhớ đánh dấu ô Add python.exe to PATH.
Cài VS Code
- Tải bản User Installer ở code.visualstudio.com và cài.
- Nhấn Ctrl+Shift+X, cài tiện ích Python do Microsoft phát hành.
- File → Open Folder, mở một thư mục tên không dấu, ví dụ
D:\LapTrinhPython; Ctrl+Shift+P → Python: Select Interpreter để chọn bản Python vừa cài.
Hệ thống chấm chạy CPython 3.12. Mọi chương trình trong sách chạy được trên 3.12, 3.13 và 3.14, nên bạn dùng bản nào trong ba bản này ở máy cũng được.
2. Nộp bài lần đầu
- Tạo tài khoản (nút Đăng ký ở góc phải) và đăng nhập. Tên đăng nhập nên là mã sinh viên để giảng viên dễ theo dõi.
- Vào Bài tập, lọc theo chương hoặc gõ mã bài trong ô tìm kiếm, ví dụ
C4-07. - Đọc đề, rồi bấm Gửi bài giải. Ở ô ngôn ngữ chọn Python 3 (đã chọn sẵn), dán mã hoặc tải tệp
.pylên, bấm Nộp bài. - Trang kết quả hiện từng test với thời gian chạy và bộ nhớ. Đợi vài giây cho tới khi có kết quả cuối cùng.
Nộp lại bao nhiêu lần cũng được; điểm của bài tính theo lần nộp tốt nhất. Danh sách bài đã nộp nằm ở mục Bài nộp.
3. Quy ước nhập/xuất
Hệ thống chấm không “đọc” chương trình. Nó đưa dữ liệu của từng test vào chương trình như thể có người gõ phím, rồi so toàn bộ những gì chương trình in ra với đáp án, theo từng dòng. Vì vậy:
Nhập
input()không có lời nhắc. Lời nhắc cũng là chữ in ra, nên sẽ lệch đáp án.- Mỗi lần gọi
input()lấy đúng một dòng. Đọc theo đúng thứ tự đề mô tả. - Hai giá trị trên một dòng:
a, b = input().split()rồi chuyển kiểu từng biến. - n số trên một dòng:
ds = list(map(int, input().split()))(mục 6.4).
Xuất
- Không in nhãn như
Ket qua:,Tong =. - Số thực in đúng số chữ số thập phân đề yêu cầu:
print(f"{x:.2f}"); điểm học phần:.1f. - Nhiều giá trị trên một dòng thì cách nhau một dấu cách:
print(a, b),print(*ds). - Đề yêu cầu mỗi kết quả một dòng thì in đúng mỗi kết quả một dòng.
Ví dụ: XS-01 Tính điểm học phần (mục 2.7), dữ liệu vào 7.5 8.0
Bị Wrong Answer
Nhap diem QT va CK: Diem hoc phan: 7.8, trong khi đáp án chỉ có 7.8.Được Accepted
7.8.Các mẫu đọc dữ liệu hay gặp (Phụ lục D.1)
| Đề viết | Cách đọc |
|---|---|
| “Một dòng chứa số nguyên n” | n = int(input()) |
| “Một dòng chứa hai số a, b” | a, b = input().split() rồi a, b = int(a), int(b) |
| “Dòng đầu chứa n, n dòng tiếp theo…” | for _ in range(n): mỗi vòng đọc một dòng |
| “Dòng đầu chứa T là số bộ test” | for _ in range(t): đọc, tính và in ngay kết quả từng bộ |
| “Mỗi dòng một số, dòng cuối là 0” | đọc mồi trước vòng while, đọc lại ở cuối thân vòng lặp |
| “Đọc đến hết dữ liệu” | import sys, for dong in sys.stdin: rồi dong.strip() |
4. Tự kiểm tra ở máy trước khi nộp
Đừng gõ tay dữ liệu mỗi lần chạy thử. Chép phần “Dữ liệu vào” của ví dụ vào tệp input.txt cùng thư mục với bài làm, rồi cho chương trình đọc từ tệp:
So kết quả in ra với phần “Kết quả” của đề từng ký tự. Sau đó tự làm thêm vài tệp input2.txt, input3.txt cho các ca biên:
giá trị nhỏ nhất, lớn nhất, đúng ngưỡng (8,5 hay 8,48 với bài xếp loại), n = 1, dữ liệu toàn số bằng nhau.
python bai.py không có < input.txt: chương trình đang chờ bạn gõ dữ liệu, không phải bị treo.
Gõ dữ liệu rồi Enter, hoặc nhấn Ctrl+C để dừng.Danh sách kiểm tra trước khi bấm Nộp:
- Đã xóa lời nhắc trong mọi
input(...)và các dòngprintdùng để gỡ lỗi. - Đúng số chữ số thập phân; không in thêm dòng trống hay nhãn.
- Đã chạy với ví dụ của đề và ít nhất một ca biên tự tính tay.
- Chỉ dùng thư viện chuẩn của Python (sách không dùng thư viện ngoài).
5. Kết quả chấm: nghĩa, nguyên nhân và cách sửa
Mỗi lần nộp nhận một kết quả chung (mã viết tắt hiện ở danh sách bài nộp) và kết quả của từng test. Hệ thống dừng ở test sai đầu tiên; các test sau không chạy nữa. Sách dùng tên tiếng Anh đầy đủ, hệ thống dùng mã viết tắt; bảng dưới đối chiếu cả hai.
Accepted · trên trang kết quả: “Kết quả đúng (AC)”
Chương trình in đúng đáp án ở mọi test, trong giới hạn thời gian và bộ nhớ.
Nên làm thêm: Không cần sửa. Nên đọc lại mã một lần: đặt tên biến rõ chưa, có đoạn nào thừa không.
Wrong Answer · trên trang kết quả: “Kết quả sai (WA)”
Chương trình chạy xong, nhưng những gì in ra khác đáp án ở ít nhất một test.
Hay gặp: in lời nhắc hoặc nhãn; sai số chữ số thập phân (print(x) in 6.800000000000001); dùng > thay >= ở ngưỡng; xếp loại trước khi làm tròn; quên ca biên (n = 1, số âm, số 0); in cả danh sách bằng print(ds) thay vì print(*ds).
Cách sửa: chạy lại với ví dụ của đề và so từng ký tự; xem test sai là test thứ mấy (test đầu là ví dụ trong đề); tự dựng ca biên đúng mốc đề cho và tính tay; đọc mục 9.6 “Gỡ lỗi khi Wrong Answer”.
Time Limit (Exceeded) · trên trang kết quả: “Quá thời gian (TLE)”
Chương trình chạy quá giới hạn thời gian của bài (thường 1 giây mỗi test) và bị dừng.
Hay gặp: điều kiện của while không bao giờ sai; quên cập nhật biến lặp; continue đặt trước lệnh đọc dữ liệu; đọc thiếu dữ liệu nên chờ mãi; thuật toán quá chậm, ví dụ thử ước tới n thay vì tới √n với n lớn.
Cách sửa: lập bảng vết vài vòng đầu để xem biến lặp có tiến về điều kiện dừng không; thử với dữ liệu lớn nhất theo ràng buộc; nghĩ cách giảm số vòng lặp.
Runtime Error · trên trang kết quả: “Lỗi khi chạy chương trình (IR)”
Chương trình dừng giữa chừng vì một ngoại lệ không được bắt (Python trả mã thoát khác 0). Sách gọi trường hợp này là Runtime Error; hệ thống báo IR (Invalid Return) kèm tên ngoại lệ, ví dụ EOFError.
Hay gặp: EOFError: đọc thừa dòng, nhiều lần gọi input() hơn số dòng dữ liệu; ValueError: quên tách dòng, int("3 4"); IndexError: vượt chỉ số danh sách; KeyError: khóa không có trong từ điển; ZeroDivisionError; TypeError khi cộng chuỗi với số hoặc join danh sách số.
Cách sửa: đọc tên ngoại lệ ở phần chi tiết, tra dòng cuối của thông báo lỗi trong Phụ lục C; chạy lại ở máy với < input.txt để thấy dòng gây lỗi; đếm lại số lần input() so với số dòng dữ liệu.
Compile Error · trên trang kết quả: “Lỗi dịch (CE)”
Python không dịch được tệp vì sai cú pháp, nên không dòng nào được chạy. Trang kết quả có thông báo chỉ ra dòng lỗi.
Hay gặp: SyntaxError: thiếu dấu : sau if, for, def; thiếu ngoặc; dấu nháy cong “ ” chép từ Word; IndentationError: thụt lề lệch, lẫn tab và dấu cách; chọn nhầm ngôn ngữ khác Python 3.
Cách sửa: mở tệp trong VS Code, chỗ lỗi có gạch đỏ; chạy thử ở máy trước khi nộp; kiểm tra ô ngôn ngữ là Python 3.
Runtime Error (mức hệ thống) · trên trang kết quả: “Lỗi Runtime (RE)”
Tiến trình bị hệ điều hành dừng, khác với IR (ngoại lệ của Python). Với bài Python hiếm gặp.
Hay gặp: đệ quy quá sâu làm tràn ngăn xếp; gọi chức năng mà máy chấm cấm (mở mạng, tạo tiến trình, ghi tệp ngoài thư mục được phép).
Cách sửa: chuyển đệ quy sâu sang vòng lặp (mục 5.6.2); chỉ đọc từ bàn phím (stdin) và in ra màn hình (stdout), trừ khi đề nói khác.
Memory Limit Exceeded · trên trang kết quả: “Tràn bộ nhớ (MLE)”
Chương trình dùng quá giới hạn bộ nhớ của bài (thường 256 MB).
Hay gặp: tạo danh sách khổng lồ, ví dụ list(range(10**9)); vòng lặp vô hạn liên tục append.
Cách sửa: chỉ giữ những gì cần; tính dồn trong vòng lặp thay vì lưu hết rồi mới tính.
Output Limit Exceeded · trên trang kết quả: “Kết xuất dữ liệu ra quá nhiều (OLE)”
Chương trình in ra quá nhiều dữ liệu.
Hay gặp: print đặt trong vòng lặp vô hạn; quên xóa print gỡ lỗi trong vòng lặp lớn.
Cách sửa: xem lại điều kiện dừng và các lệnh print trong vòng lặp.
Các trạng thái khác
| Trạng thái | Nghĩa |
|---|---|
| QU · Đang chờ | Bài nộp đang xếp hàng chờ máy chấm. Đợi vài giây; mỗi người chỉ có tối đa 2 bài đang chờ cùng lúc. |
| G · Chấm điểm | Máy chấm đang chạy từng test. |
| SC · Ngắn mạch | Test không được chạy vì một test trước đó đã sai. Không phải lỗi riêng; hãy sửa test sai đầu tiên. |
| IE · Lỗi nội bộ | Lỗi của hệ thống, không phải của bài làm. Hãy báo giảng viên hoặc dùng nút “Báo lỗi”. |
6. Bộ test của mỗi bài gồm những gì
Mỗi bài có từ khoảng mười đến vài chục test, chia thành năm nhóm. Tên test cho biết nhóm của nó, nên khi bị sai ở test nào bạn đoán được mình sai loại lỗi gì.
| Nhóm | Nội dung |
|---|---|
| 01 · Mẫu | Đúng ví dụ in trong đề. Sai ở đây nghĩa là chương trình chưa chạy đúng ngay cả ví dụ; hãy chạy lại ở máy. |
| 02 · Tổng quát | Dữ liệu hợp lệ sinh ngẫu nhiên với nhiều kích thước. |
| 03 · Biên | Giá trị nhỏ nhất, lớn nhất theo ràng buộc; đúng ngưỡng (8,5; 7,0; 4,0…); n = 1. |
| 04 · Đặc biệt | Số 0, số âm nếu đề cho phép, các giá trị bằng nhau, dãy đã sắp xếp hoặc sắp ngược, chuỗi có khoảng trắng thừa. |
| 05 · Bẫy | Những ca dựng riêng để bắt lỗi người mới hay mắc ở bài đó: lệch một, < thay <=, xếp loại trước khi làm tròn, chia nguyên thay chia thực, thuật toán quá chậm. |
Dữ liệu các test ẩn không được công bố. Nếu bị sai ở nhóm biên hay bẫy, hãy đọc lại phần Ràng buộc và mục “Lỗi thường gặp” của chương.
7. Câu hỏi thường gặp
Ở máy tôi chạy đúng ví dụ, sao vẫn bị Wrong Answer?
Dấu cách thừa ở cuối dòng có bị tính sai không?
Tôi có dùng được thư viện ngoài như numpy không?
Tiếng Việt có dấu trong dữ liệu có sao không?
tinh_diem_hp.