Menu
Coddy logo textTech

Agrégateur de logs

Fait partie de la section Logique et Flux du Journey Swift de Coddy. Leçon 55 sur 56.

challenge icon

Défi

Moyen

Vous traitez des journaux d’accès. Lisez une seule ligne d’entrée : une liste séparée par des virgules d’entrées level:user:bytes.

Certaines entrées sont incorrectes et doivent être ignorées : toute entrée dont bytes ne peut pas être analysé comme un entier, ou dont le level ne fait pas partie de INFO, WARN, ERROR (sensible à la casse).

Affichez, dans cet ordre :

  1. Une ligne par niveau apparu au moins une fois, triée selon cet ordre fixe : ERROR, WARN, INFO. Chaque ligne est de la forme <level>: <count> (<bytes>), où count est le nombre d’entrées valides pour ce niveau et bytes est la somme de leurs octets.
  2. Top user: <name> (<bytes>) : l’utilisateur ayant le plus grand nombre total d’octets parmi toutes les entrées valides. En cas d’égalité, départagez par ordre alphabétique des noms.
  3. Skipped: <n> avec le nombre d’entrées malformées.

Pour l’entrée INFO:alice:100,WARN:bob:bad,ERROR:alice:50,INFO:bob:200,DEBUG:cara:10,INFO:alice:75, la sortie est :

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

Essayez vous-même

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

// TODO: analyser chaque entrée, ignorer les mauvaises, accumuler par niveau + par utilisateur ;
// afficher les niveaux dans l'ordre fixe (uniquement si vus), l'utilisateur principal, puis le compte Skipped

Toutes les leçons de Logique et Flux

Entraînez-vous par vous-même : Playground Swift