[Buổi 20][Chuỗi][HW] Bài 4: Kiểm tra username nhiều luật
Kiểm tra username nhiều luật
Bối cảnh
Một cổng đăng ký áp dụng các luật username theo thứ tự ưu tiên. Khi dữ liệu sai, hệ thống chỉ trả lỗi đầu tiên để giao diện hiển thị đúng thông báo:
LENGTH: độ dài phải từ 5 đến 20.START: ký tự đầu phải là chữ cái.CHAR: mọi ký tự chỉ được là chữ cái, chữ số hoặc_.DOUBLE_UNDERSCORE: không được chứa__.NEED_DIGIT: phải có ít nhất một chữ số.
Nếu qua hết, in VALID. Bài Medium kiểm tra thiết kế validation pipeline: cùng một username có thể vi phạm nhiều luật, nhưng output phụ thuộc thứ tự rule chứ không chỉ phụ thuộc "có lỗi hay không". Không dùng regex; hãy duyệt string và dùng find()/cctype trong phạm vi B20.
Các hệ thống thực tế thường cố ý trả một mã lỗi duy nhất thay vì danh sách lỗi để giao diện có thông điệp ổn định. Vì vậy thứ tự rule phải được xem như dữ liệu của đề: nếu username vừa quá ngắn vừa bắt đầu bằng số, kết quả vẫn là LENGTH. Hãy viết test chồng nhiều lỗi để chắc chắn early-return của bạn đúng priority.
Yêu cầu
- Đọc một dòng username.
- Kiểm tra 5 luật đúng thứ tự.
- In lỗi đầu tiên hoặc
VALID.
Input
Một dòng username.
Output
Một trong LENGTH, START, CHAR, DOUBLE_UNDERSCORE, NEED_DIGIT, VALID.
Ràng buộc
|s|≤100.
Ví dụ 1
Input
abc1
Output
LENGTH
Giải thích
Username abc1 có độ dài 4, nhỏ hơn minimum 5. Rule LENGTH đứng đầu pipeline nên chương trình trả ngay lỗi này mà không cần xét START, CHAR hay NEED_DIGIT. Mặc dù chuỗi bắt đầu bằng chữ và có digit, priority của rule khiến output vẫn bắt buộc là LENGTH.
Ví dụ 2
Input
1abcd
Output
START
Giải thích
1abcd có độ dài đúng 5 nên qua rule LENGTH. Tuy nhiên ký tự đầu tiên là digit 1, không phải chữ cái, nên rule START fail. Pipeline dừng ngay ở đây; việc các ký tự còn lại đều alphanumeric không làm thay đổi lỗi đầu tiên. Output là START.
Thông tin học tập
- Module: M06
- Buổi: B20
- Loại bài: HOMEWORK
- Độ khó: Medium
- Concepts: std::string, validation pipeline, cctype, first error code
- Giới hạn kiến thức: B01-B20
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments