[Buổi 20][Chuỗi][HW] Bài 5: Chuẩn hóa địa chỉ email cơ bản
Chuẩn hóa địa chỉ email cơ bản
Bối cảnh
Một hệ thống nội bộ nhận địa chỉ email dạng đơn giản và cần tạo canonical form. Luật của phiên bản Foundation:
- Phải có đúng một ký tự
@. - Phần local trước
@không rỗng và chỉ chứa chữ cái, chữ số,.,_,-. - Domain sau
@không rỗng, chỉ chứa chữ cái, chữ số,.,-. - Domain phải có ít nhất một dấu
., không bắt đầu/kết thúc bằng., và không chứa... - Local được giữ nguyên casing; domain chuyển toàn bộ về lowercase.
Nếu sai in INVALID, nếu đúng in canonical email. Bài Medium yêu cầu dùng find() để xác định delimiter và substr() để tách hai state, sau đó validation riêng từng phần. Đây chưa phải parser email đầy đủ theo RFC; mục tiêu là học chia nhỏ requirement và tránh thao tác chuỗi mơ hồ.
Bài cũng kiểm tra ranh giới giữa validation và canonicalization. Một domain uppercase vẫn hợp lệ và chỉ được lowercase sau khi đã qua các luật cấu trúc. Ngược lại, không được "sửa" một domain sai như .Example..COM bằng cách normalize rồi cho qua. Pipeline nên giữ dữ liệu thô đủ lâu để phát hiện lỗi trước khi biến đổi.
Yêu cầu
- Đọc một dòng email.
- Xác nhận đúng một @.
- Validate local và domain theo luật.
- Lowercase domain, giữ local.
- In canonical hoặc INVALID.
Input
Một dòng email.
Output
INVALID hoặc email canonical.
Ràng buộc
|s|≤500.
Ví dụ 1
Input
User.Name@TNUT.EDU.VN
Output
User.Name@tnut.edu.vn
Giải thích
Chuỗi có đúng một @. Local User.Name chỉ chứa chữ và dấu chấm nên hợp lệ. Domain TNUT.EDU.VN có dấu chấm hợp lệ, không có ..; sau lowercase trở thành tnut.edu.vn. Local giữ nguyên casing, nên output canonical là User.Name@tnut.edu.vn.
Ví dụ 2
Input
abc@@example.com
Output
INVALID
Giải thích
Input có hai ký tự @. Ngay bước tách delimiter, chương trình phát hiện một @ thứ hai sau vị trí đầu tiên, nên cấu trúc không thể chia thành đúng local/domain. Không cần kiểm tra các rule khác và output là INVALID.
Thông tin học tập
- Module: M06
- Buổi: B20
- Loại bài: HOMEWORK
- Độ khó: Medium
- Concepts: std::string, find, substr, validation, lowercase domain
- Giới hạn kiến thức: B01-B20
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments