Menu
Coddy logo textTech

Агрегатор логов

Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 55 из 56.

challenge icon

Задание

Средне

Вы обрабатываете журналы доступа. Прочитайте одну строку ввода: список записей level:user:bytes, разделенных запятыми.

Некоторые записи некорректны и должны быть пропущены: любая запись, в которой bytes не могут быть преобразованы в целое число, или чей level не является одним из INFO, WARN, ERROR (с учетом регистра).

Выведите в следующем порядке:

  1. По одной строке для каждого уровня (level), который встретился хотя бы один раз, отсортированных в фиксированном порядке: ERROR, WARN, INFO. Каждая строка имеет формат <level>: <count> (<bytes>), где count — это количество валидных записей на этом уровне, а bytes — сумма их байтов.
  2. Top user: <name> (<bytes>): пользователь с наибольшим общим количеством байтов во всех валидных записях. При равенстве байтов сортируйте по имени в алфавитном порядке.
  3. Skipped: <n> с количеством некорректных записей.

Для входных данных INFO:alice:100,WARN:bob:bad,ERROR:alice:50,INFO:bob:200,DEBUG:cara:10,INFO:alice:75 выводом будет:

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

Попробуйте сами

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

// TODO: разобрать каждую запись, отбросить некорректные, накопить данные по уровням и пользователям;
// вывести уровни в фиксированном порядке (только если они встретились), топового пользователя, затем количество пропущенных (Skipped)

Все уроки раздела Логика и управление потоком