Hướng dẫn

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

  1. Mở terminal (PowerShell), gõ python --version. Thấy Python 3.12 trở lên là đủ, bỏ qua bước cài.
  2. 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.
  3. 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

  1. Tải bản User Installer ở code.visualstudio.com và cài.
  2. Nhấn Ctrl+Shift+X, cài tiện ích Python do Microsoft phát hành.
  3. 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

  1. 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.
  2. 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.
  3. Đọ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 .py lên, bấm Nộp bài.
  4. 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

qt, ck = input("Nhap diem QT va CK: ").split() hp = round(0.4 * float(qt) + 0.6 * float(ck), 1) print("Diem hoc phan:", hp)
Tính đúng, nhưng in ra Nhap diem QT va CK: Diem hoc phan: 7.8, trong khi đáp án chỉ có 7.8.

Được Accepted

qt, ck = input().split() hp = round(0.4 * float(qt) + 0.6 * float(ck), 1) print(f"{hp:.1f}")
Không lời nhắc, không nhãn, đúng một chữ số thập phân: in 7.8.

Các mẫu đọc dữ liệu hay gặp (Phụ lục D.1)

Đề viếtCá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:

# Command Prompt (cmd), Git Bash, macOS, Linux python bai.py < input.txt # PowerShell (terminal mặc định của VS Code trên Windows) không nhận dấu < Get-Content input.txt | python bai.py

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.

Màn hình trống, con trỏ nhấp nháy khi chạy 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òng print dù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.

AC

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.

WA

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”.

TLE

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.

IR

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.

CE

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.

RTE

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.

MLE

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.

OLE

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áiNghĩ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ểmMáy chấm đang chạy từng test.
SC · Ngắn mạchTest 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ómNộ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átDữ liệu hợp lệ sinh ngẫu nhiên với nhiều kích thước.
03 · BiênGiá 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ệtSố 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ẫyNhữ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?
Ví dụ trong đề chỉ là test đầu tiên. Bài làm còn phải đúng với các ca biên, ca đặc biệt và ca bẫy. Xem bài sai ở test thứ mấy và tên nhóm của test đó, rồi tự dựng ca tương tự để thử. Kiểm tra cả cách in: số chữ số thập phân, nhãn, lời nhắc.
Dấu cách thừa ở cuối dòng có bị tính sai không?
Hệ thống so theo từng dòng và bỏ qua dấu cách thừa ở cuối dòng, dòng trống ở cuối. Tuy vậy, in thiếu hoặc thừa xuống dòng ở giữa (ví dụ in mỗi số một dòng khi đề yêu cầu cả dãy trên một dòng) thì bị Wrong Answer. Hãy tập thói quen in đúng từng ký tự, vì nhiều hệ thống chấm khác chặt hơn.
Tôi có dùng được thư viện ngoài như numpy không?
Không. Máy chấm chỉ có thư viện chuẩn của Python, và các bài trong sách đều giải được bằng kiến thức của chương tương ứng.
Tiếng Việt có dấu trong dữ liệu có sao không?
Dữ liệu vào và ra của các bài chấm là tiếng Việt không dấu (mục 7.6), nên không có vấn đề mã hóa. Tên biến cũng viết không dấu, ví dụ tinh_diem_hp.
Chương 9 đọc và ghi tệp, nộp thế nào?
Một số bài Chương 9 và XS-08 làm việc với tệp. Trên hệ thống, các bài này đã được chuyển sang đọc từ bàn phím và in ra màn hình, hoặc đề ghi rõ tên tệp được phép mở. Làm theo đúng phần Dữ liệu vào của đề trên hệ thống.
Một số bài Chương 1 không có trên hệ thống?
C1-02, C1-03 và C1-08 là bài làm trên giấy (phân tích bài toán, mô tả thuật toán), không chấm tự động được. Hãy làm vào vở và đối chiếu với lời giải của giảng viên.
Bài làm bị TLE dù đã đúng ý tưởng?
Xem ràng buộc lớn nhất của đề và ước lượng số vòng lặp. Python chạy được cỡ mười triệu phép tính đơn giản mỗi giây; vượt mức đó thì phải đổi cách làm, ví dụ kiểm tra ước tới √n thay vì tới n. Cũng kiểm tra xem có vòng lặp nào không dừng ở một ca đặc biệt (n = 0, dữ liệu rỗng) không.
Tôi nghĩ đề hoặc test bị sai thì làm sao?
Bấm nút Báo lỗi ở thanh trên cùng khi đang xem đề, mô tả ngắn gọn bạn nghĩ sai ở đâu, kèm ví dụ dữ liệu. Tác giả và giảng viên sẽ xem và trả lời.
Nộp nhiều lần có bị trừ điểm không?
Không. Bài luyện tập tính theo lần nộp tốt nhất. Dù vậy, hãy tự kiểm tra ở máy trước: nộp thử liên tục để “dò” test không giúp bạn học được gì.