Menu
CoddyTech

Trình tổng hợp nhật ký

Thuộc phần Logic và luồng thực thi trong hành trình Swift của Coddy. Bài học 55 trên 56.

challenge icon

Thử thách

Trung bình

Bạn đang xử lý nhật ký truy cập. Đọc một dòng đầu vào duy nhất: danh sách các mục level:user:bytes, phân tách bằng dấu phẩy.

Một số mục không hợp lệ và cần được bỏ qua: mọi mục có bytes không thể phân tích thành số nguyên hoặc có level không thuộc INFO, WARN, ERROR (phân biệt chữ hoa chữ thường).

In ra theo thứ tự sau:

  1. Mỗi cấp độ xuất hiện ít nhất một lần có một dòng, sắp xếp theo thứ tự cố định sau: ERROR, WARN, INFO. Mỗi dòng có dạng <level>: <count> (<bytes>), trong đó count là số mục hợp lệ ở cấp độ đó và bytes là tổng số byte của các mục đó.
  2. Top user: <name> (<bytes>): người dùng có tổng số byte lớn nhất trong tất cả các mục hợp lệ. Nếu bằng nhau, xếp tên theo thứ tự bảng chữ cái.
  3. Skipped: <n> cùng số lượng mục sai định dạng.

Với đầu vào INFO:alice:100,WARN:bob:bad,ERROR:alice:50,INFO:bob:200,DEBUG:cara:10,INFO:alice:75, đầu ra là:

ERROR: 1 (50)
INFO: 3 (375)
Top user: alice (225)
Skipped: 2

Tự làm thử

let entries = readLine()!.components(separatedBy: ",")
let order = ["ERROR", "WARN", "INFO"]
let validLevels: Set<String> = ["INFO", "WARN", "ERROR"]

// TODO: phân tích từng mục, bỏ các mục không hợp lệ, thống kê theo từng cấp độ và từng người dùng;
// in ra các cấp độ theo thứ tự cố định (chỉ những cấp độ đã xuất hiện), người dùng đứng đầu, rồi đến số lượng Skipped

Tất cả bài học trong Logic và luồng thực thi

Tự luyện tập: Playground Swift