Appearance
Lập trình - Thực hành (Code Practicing)
Code Practicing là loại hoạt động lập trình chấm tự động bằng test cases. Bạn nhận đề bài, viết code trong editor, chạy với test cases — qua hết test = hoàn thành.
Trang này tập trung vào trải nghiệm làm bài. Chi tiết về sandbox bên dưới (giới hạn thời gian, bộ nhớ, encoding, các loại lỗi runtime) xem Thực thi Code.
Ngôn ngữ hỗ trợ
Sandbox chạy được: Python 3.11, JavaScript / Node 20, PHP 8.2, Java 21 (OpenJDK). Một số khóa có thể cấu hình thêm Ruby/Go/C++/C# nếu hạ tầng được mở rộng — kiểm tra phần đầu activity để biết ngôn ngữ thực tế.
Ngôn ngữ được cố định bởi giảng viên — bạn không thể đổi sang ngôn ngữ khác trong cùng activity. Nếu activity yêu cầu Python, bạn phải nộp Python; nộp ngôn ngữ khác sẽ fail compile/parse.
Giao diện
Trang Code Practicing thường chia làm 3 vùng:
Bên trái — Đề bài
- Problem statement — mô tả yêu cầu, input/output mong muốn
- Ví dụ (sample input/output)
- Ràng buộc (constraints) — vd: "n ≤ 10^6", "memory ≤ 256 MB"
- Hint (gợi ý) — nếu giảng viên cung cấp, có thể bị mở dần khi bạn fail nhiều lần
Giữa — Code Editor
Editor (Monaco — engine của VS Code) với:
- Syntax highlight theo ngôn ngữ
- Auto-completion + IntelliSense
- Linting thời gian thực
- Bracket matching, multi-cursor, find & replace
- Theme sáng/tối — tự đồng bộ với theme LMS
- Phím tắt VS Code thường dùng (Ctrl+/, Ctrl+D, Ctrl+F, Alt+↑↓, ...)
Code khởi đầu = starter_code do giảng viên cung cấp (vd: skeleton function với signature đúng).
Bên phải — Output / Test Results
- Tab Console — output khi nhấn Run
- Tab Test cases — danh sách test cases:
- Test public — bạn thấy input/output mong muốn
- Test hidden — chỉ thấy pass/fail, không thấy input
Quy trình làm bài
1. Chạy thử (Run)
- Viết code trong editor.
- (Tùy chọn) Nhập input thủ công vào ô input.
- Nhấn Run (
Ctrl+Enterhoặc nút Play). - Xem output ở tab Console.
TIP
Run dùng để test ý tưởng với input tự định — nhanh, không tính lượt thử.
2. Chạy với test cases
Nhấn Run tests:
- Hệ thống chạy code với từng test case
- Mỗi test: ✅ Pass / ❌ Fail
- Test fail hiển thị: input, expected output, your output, error message (nếu có exception)
- Test hidden chỉ hiển thị Pass/Fail mà không lộ input/output
3. Nộp bài (Submit)
Khi tất cả test pass:
- Nhấn Submit
- Activity được đánh dấu Đã hoàn thành
- Code cuối cùng được lưu
WARNING
Một số bài có giới hạn số lần Submit (không phải Run). Đảm bảo bạn pass hết test cases trước khi Submit.
Lưu code & tiếp tục sau
Code bạn gõ trong Code Practicing được auto-save liên tục theo tài khoản của bạn:
- Refresh trang / đóng tab → mở lại vẫn thấy code lần cuối.
- Đăng nhập từ máy khác → code đồng bộ về tất cả thiết bị.
- Đề bài được đổi (giảng viên cập nhật starter_code) → code cũ vẫn giữ, không bị overwrite. Nếu muốn lấy starter mới, dùng nút Reset.
Reset
Nhấn Reset đưa editor về starter_code ban đầu — xóa hết code bạn đã viết. Cân nhắc copy lưu lại trước khi nhấn.
Các dạng bài theo I/O
Tùy cách giảng viên thiết kế, Code Practicing có 2 dạng chính:
Dạng 1 — stdin/stdout
Code đọc input từ stdin, in kết quả ra stdout. Test case chứa cặp input → expected output.
Ví dụ Python:
python
n = int(input())
print(n * n)- Ưu điểm: đơn giản, ngôn ngữ-agnostic.
- Cẩn thận: format output đúng từng ký tự (kể cả
\ncuối) — xem So sánh output.
Dạng 2 — Function call (function signature)
Giảng viên cấp starter_code với hàm trống; bạn điền body. Hệ thống tự gọi hàm với tham số trong test case và so sánh giá trị return.
Ví dụ Python:
python
def square(n: int) -> int:
# Viết code ở đây
pass- Ưu điểm: không phải parse stdin → ít bug format.
- Cẩn thận: giữ nguyên signature (tên hàm, số tham số, kiểu) — đổi tên hàm = test fail toàn bộ.
TIP
Nhìn starter_code để biết bạn đang làm dạng nào. Nếu có def, function, class Solution mà không có input() → dạng function call. Nếu thấy input() / Scanner → dạng stdin/stdout.
Test cases
Public vs Hidden
| Loại | Bạn thấy | Mục đích |
|---|---|---|
| Public | Input + Expected output | Hiểu yêu cầu, debug |
| Hidden | Chỉ Pass/Fail | Chống hard-code đáp án |
Ví dụ tệ: nếu chỉ có public test "n=5 → 120" và bạn if n==5: return 120 → pass public nhưng fail hidden test "n=10 → 3628800".
Edge cases
Hidden test thường là edge cases:
- Giá trị biên (n=0, n=1, n=max)
- Input rỗng / null
- Input lớn (test performance/timeout)
- Trường hợp đặc biệt theo bài
Khi fail hidden test mà không biết tại sao, hãy nghĩ về edge cases trước khi đoán bừa.
Time / Memory limits
Mỗi test có giới hạn:
- Time limit: mặc định 5 giây/test (giảng viên có thể đặt 1–10s tùy bài)
- Memory limit: mặc định 128 MB (có thể nâng nếu bài cần xử lý dữ liệu lớn)
- Network: tắt — code không thể gọi internet
Vượt giới hạn → test fail với lý do TLE (Time Limit Exceeded), MLE (Memory Limit Exceeded), hoặc RE (Runtime Error). Cần tối ưu thuật toán (vd: dùng dict thay list, tránh O(n²) khi có thể O(n log n)). Xem chi tiết các mã lỗi ở Thực thi Code → Loại lỗi runtime.
Hỗ trợ AI debug
Một số khóa bật AI Code Helper:
- Nhấn Hỏi AI (icon trợ lý) → AI phân tích code của bạn
- AI gợi ý lỗi, đề xuất sửa, giải thích thuật toán
- Tốn AI Credit — xem AI Credits
TIP
AI helper không trả lời thẳng đáp án (giảng viên cấu hình system prompt) — chỉ gợi ý hướng. Vẫn cần bạn tự code.
Khác biệt với các loại lập trình khác
| Code Practicing | Code Interactive | Code Reading | Code Inspection | |
|---|---|---|---|---|
| Có test cases | ✓ | ✗ | ✗ | ✗ |
| Có starter code | ✓ | ✓ | ✓ (đầy đủ) | ✓ |
| Mục tiêu | Pass test | Tự do thực hành | Đọc/chạy hiểu code | AI hướng dẫn debug/review |
Mẹo giải bài hiệu quả
- Đọc đề + sample I/O thật kỹ — đặc biệt biên giá trị, format input/output (case-sensitive, dấu cách, dòng mới?).
- Code đơn giản trước, tối ưu sau — submit version đầu tiên qua tất cả public test, rồi optimize cho hidden test nếu fail.
- Test edge cases tự — thử n=0, n=1, input rỗng, input cực lớn — trước khi submit.
- Đừng hard-code — nếu chỉ pass cho input cụ thể, sẽ fail hidden test.
- Đọc error message kỹ — Python traceback / Java stack trace chỉ chính xác lỗi nằm dòng nào.
Ví dụ làm bài hoàn chỉnh
Đề bài: "Tính tổng các số chẵn từ 1 đến n" (dạng stdin/stdout).
Test cases:
| # | Input | Expected output | Public? |
|---|---|---|---|
| 1 | 10 | 30 | ✓ |
| 2 | 1 | 0 | ✓ |
| 3 | 1000000 | 250000500000 | ✗ |
| 4 | 0 | 0 | ✗ |
Lần 1 — solution naive (Python):
python
n = int(input())
total = 0
for i in range(1, n + 1):
if i % 2 == 0:
total += i
print(total)→ Test 1, 2, 4 pass. Test 3 TLE (n=10⁶, vòng lặp quá chậm với Python).
Lần 2 — tối ưu O(1):
python
n = int(input())
k = n // 2
print(k * (k + 1))→ Tất cả 4 test pass. Submit → activity hoàn thành.
TIP
Trình tự thường gặp: viết solution dễ hiểu trước → public test pass → nếu hidden TLE, mới tối ưu. Đừng tối ưu sớm khi solution naive còn chưa đúng logic.
Câu hỏi thường gặp
Code chạy đúng trên máy tôi nhưng fail trên LMS?
- Khác phiên bản ngôn ngữ (Python 3.8 vs 3.11) — tránh dùng feature quá mới.
- Khác locale / encoding — luôn đặt UTF-8 cho I/O.
- Khác thư viện — LMS sandbox chỉ có standard library, không có numpy/pandas trừ khi giảng viên bật.
- Output có khoảng trắng/xuống dòng thừa (
print("a "); print()thêm dòng trống cuối).
Test bị TLE — tôi không biết bottleneck đâu?
- Profile mental: thử nghĩ Big-O của code bạn.
- Dùng
timeđể đo thời gian từng đoạn (Python:time.time()). - Nếu khó, hỏi AI helper — chỉ gợi ý hướng tối ưu, không cho luôn đáp án.
Code bị "Compilation Error" mà không thấy chi tiết? Click vào test fail → xem tab Stderr để thấy error đầy đủ. Với Java, kiểm tra tên class trùng tên file (class Main ↔ Main.java).
Code tôi đã viết bị mất sau khi giảng viên cập nhật bài? Auto-save lưu code theo cặp (user_id, activity_id) — không bị mất khi giảng viên cập nhật. Nếu thật sự mất, kiểm tra: bạn có vô tình nhấn Reset? đăng nhập đúng tài khoản? Liên hệ giảng viên/admin để khôi phục từ log.
Tôi muốn xem lại các lần submit trước? Tab Lịch sử submit (nếu giảng viên bật) liệt kê các lần nộp + trạng thái + điểm. Click một lần submit để xem lại code đã nộp.
Submit bao nhiêu lần thì hết? Tùy bài. Run (chạy thử) thường không giới hạn. Submit có thể giới hạn (vd: 10 lần). Nếu hết submit mà chưa pass, bài tính là chưa hoàn thành — liên hệ giảng viên để mở thêm lượt.