Menu
Coddy logo textTech

Wochen vergleichen

Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy — Lektion 37 von 56.

Letztes Feature: Nimm Daten aus zwei Wochen und berichte die Änderung pro Gewohnheit.

Jede Woche ist eine eigene Liste von habit:day-Operationen in einer eigenen Zeile. Erstelle zwei Dictionaries auf die gleiche Weise wie bisher und vergleiche sie dann.

Die interessante Menge an Gewohnheiten ist die Vereinigung der Schlüssel über beide Wochen hinweg (eine Gewohnheit könnte in einer Woche erscheinen, aber nicht in der anderen). Iterieren Sie über diese alphabetisch sortierte Vereinigung.

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)")
}

Das ?? 0 behandelt den Fall eines fehlenden Schlüssels. Das weekA[name]?.count ist die optional-verkettete Methode, um einen Zähler zu lesen, ohne ihn vorher zu entpacken; es gibt nil zurück, wenn der Schlüssel nicht vorhanden ist, was das ?? 0 in Null umwandelt.

challenge icon

Aufgabe

Mittel

Lies zwei Eingabezeilen ein, die jeweils eine kommagetrennte Liste von habit:day Einträgen enthalten (einer pro Woche). Für jede Gewohnheit, die in einer der beiden Wochen vorkommt, gib eine Zeile in diesem Format aus:

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

wobei a die Anzahl der eindeutigen Tage in Woche 1 ist, b die Anzahl der eindeutigen Tage in Woche 2 ist und arrow folgendes ist:

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

Gib die Gewohnheiten in alphabetischer Reihenfolge aus. Gib nach den zeilenweisen Angaben für jede Gewohnheit eine Zusammenfassungszeile aus:

Improved: <n>

wobei n die Anzahl der Gewohnheiten mit dem Pfeil UP ist.

Für die Eingabe read:1,read:3,workout:2 in Zeile 1 und read:1,read:2,read:5,yoga:7 in Zeile 2 lautet die Ausgabe:

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

Spickzettel

Um die Vereinigung der Schlüssel aus zwei Dictionaries zu erhalten und alphabetisch zu iterieren:

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 verwendet Optional Chaining, um die Anzahl ohne Unwrapping zu erhalten; es gibt nil zurück, wenn der Schlüssel fehlt. ?? 0 konvertiert dieses nil in Null.

Probier es selbst

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: Vereinigung der Schlüssel; pro Gewohnheit '<name>: a -> b ARROW'; dann 'Improved: <n>'
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Kontrollfluss