Menu
Coddy logo textTech

Agregador de Logs

Parte da seção Lógica e Fluxo do Journey de Swift da Coddy — lição 55 de 56.

challenge icon

Desafio

Médio

Você está processando logs de acesso. Leia uma única linha de entrada: uma lista separada por vírgulas de entradas level:user:bytes.

Algumas entradas são inválidas e devem ser ignoradas: qualquer entrada cujos bytes não possam ser analisados como um número inteiro, ou cujo level não seja um de INFO, WARN, ERROR (sensível a maiúsculas e minúsculas).

Imprima, nesta ordem:

  1. Uma linha por nível que apareceu pelo menos uma vez, ordenada nesta ordem fixa: ERROR, WARN, INFO. Cada linha é <level>: <count> (<bytes>) onde count é o número de entradas válidas naquele nível e bytes é a soma de seus bytes.
  2. Top user: <name> (<bytes>): o usuário com o maior total de bytes em todas as entradas válidas. Desempate pelo nome em ordem alfabética.
  3. Skipped: <n> com a contagem de entradas malformadas.

Para a entrada INFO:alice:100,WARN:bob:bad,ERROR:alice:50,INFO:bob:200,DEBUG:cara:10,INFO:alice:75, a saída é:

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

Experimente você mesmo

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

// TODO: analisar cada entrada, descartar as inválidas, acumular por nível + por usuário;
// imprimir níveis em ordem fixa (apenas se encontrados), o principal usuário e, em seguida, a contagem de Ignorados

Todas as lições de Lógica e Fluxo