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.
Défi
MoyenLisez 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>où 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 :
UPquandb > aDOWNquandb < aSAMEquandb == a
Affichez les habitudes par ordre alphabétique. Après les lignes par habitude, affichez une ligne de résumé :
Improved: <n>où 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: 2Aide-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>'
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
1Les chaînes de caractères en profondeur
Comptage et indicesCasse et nettoyageRecherche dans les chaînesDécoupage et jointureRemplacement de sous-chaînesRécapitulatif - Vérification du nom d'utilisateur4Ensembles
Création d'ensemblesUnion et intersectionSoustraction et différence symétriqueSous-ensemble et sur-ensembleRécapitulatif - Filtre de tags7Projet - Suivi d'habitudes
Aperçu du projetMarquer comme terminé10Projet - Moteur de quiz
Présentation du projetPoser des questions2Intervalles et Pas
Fermé vs Semi-ouvertLe PasMéthodes d'intervalleIntervalles dans un SwitchRécapitulatif - Grille de calendrier5Fonctions d'ordre supérieur, Partie 1
MapFilterReduceChaînage de map, filter, reduceRécapitulatif - Statistiques de mots