Menu
Coddy logo textTech

Comparer les semaines

Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 37 sur 56.

Fonctionnalité finale : prenez deux semaines de données et signalez le changement par habitude.

Chaque semaine est sa propre liste d'opérations habit:day sur sa propre ligne. Construisez deux dictionnaires de la même manière que vous l'avez fait, puis comparez-les.

L'ensemble intéressant d'habitudes est l'union des clés sur les deux semaines (une habitude peut apparaître dans une semaine mais pas dans l'autre). Parcourez cette union triée par ordre alphabétique.

let allKeys = Set(weekA.keys).union(weekB.keys).sorted()
for name in allKeys {
    let a = weekA[name]?.count ?? 0
    let b = weekB[name]?.count ?? 0
    print("\(name): \(a) -> \(b)")
}

Le ?? 0 gère le cas de la clé manquante. Le weekA[name]?.count est la méthode par chaînage optionnel pour lire un compte sans déballage préalable, il renvoie nil lorsque la clé n'est pas présente, ce que le ?? 0 transforme en zéro.

challenge icon

Défi

Moyen

Lisez deux lignes d'entrée, chacune étant une liste séparée par des virgules d'entrées habit:day (une par semaine). Pour chaque habitude qui apparaît dans l'une ou l'autre semaine, affichez une ligne dans ce format :

<habit>: <a> -> <b> <arrow>

a est le nombre de jours uniques de la semaine 1, b est le nombre de jours uniques de la semaine 2, et arrow est :

  • UP quand b > a
  • DOWN quand b < a
  • SAME quand b == a

Affichez les habitudes par ordre alphabétique. Après les lignes par habitude, affichez une ligne de résumé :

Improved: <n>

n est le nombre d'habitudes avec la flèche UP.

Pour l'entrée read:1,read:3,workout:2 sur la ligne 1 et read:1,read:2,read:5,yoga:7 sur la ligne 2, la sortie est :

read: 2 -> 3 UP
workout: 1 -> 0 DOWN
yoga: 0 -> 1 UP
Improved: 2

Aide-mémoire

Pour obtenir l'union des clés de deux dictionnaires et itérer par ordre alphabétique :

let allKeys = Set(weekA.keys).union(weekB.keys).sorted()
for name in allKeys {
    let a = weekA[name]?.count ?? 0
    let b = weekB[name]?.count ?? 0
    print("\(name): \(a) -> \(b)")
}

weekA[name]?.count utilise le chaînage optionnel pour obtenir le compte sans déballage ; renvoie nil si la clé est manquante. ?? 0 convertit ce nil en zéro.

Essayez vous-même

func parse(_ line: String) -> [String: [Int]] {
    var habits: [String: [Int]] = [:]
    if line.isEmpty { return habits }
    for op in line.components(separatedBy: ",") {
        let parts = op.components(separatedBy: ":")
        let day = Int(parts[1])!
        if !(habits[parts[0], default: []].contains(day)) {
            habits[parts[0], default: []].append(day)
        }
    }
    return habits
}
let weekA = parse(readLine()!)
let weekB = parse(readLine()!)

// TODO : union des clés ; par habitude '<nom> : a -> b FLÈCHE' ; puis 'Amélioré : <n>'
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et Flux