Menu
Coddy logo textTech

Porównaj tygodnie

Część sekcji Logika i przepływ programu ścieżki Swift w Coddy. Lekcja 37 z 56.

Ostatnia funkcja: weź dane z dwóch tygodni i podaj zmianę dla każdego nawyku.

Każdy tydzień to osobna lista operacji habit:day w osobnym wierszu. Zbuduj dwa słowniki tak jak dotychczas, a następnie je porównaj.

Interesujący zbiór nawyków to suma kluczy z obu tygodni (nawyk może występować w jednym tygodniu, ale nie w drugim). Iteruj po tej sumie posortowanej alfabetycznie.

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

Wyrażenie ?? 0 obsługuje przypadek brakującego klucza. Zapis weekA[name]?.count pozwala odczytać liczbę z użyciem łańcuchowego dostępu opcjonalnego, bez wcześniejszego rozpakowywania; zwraca nil, gdy klucza nie ma, a ?? 0 zamienia to na zero.

challenge icon

Wyzwanie

Średni

Wczytaj dwa wiersze danych wejściowych, każdy zawierający listę wpisów habit:day oddzielonych przecinkami (po jednym na tydzień). Dla każdego nawyku, który pojawia się w którymkolwiek tygodniu, wypisz jeden wiersz w tym formacie:

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

gdzie a to liczba unikalnych dni w tygodniu 1, b to liczba unikalnych dni w tygodniu 2, a arrow to:

  • UP, gdy b > a
  • DOWN, gdy b < a
  • SAME, gdy b == a

Wypisz nawyki w kolejności alfabetycznej. Po wierszach dotyczących poszczególnych nawyków wypisz jeden wiersz podsumowania:

Improved: <n>

gdzie n to liczba nawyków ze strzałką UP.

Dla danych wejściowych read:1,read:3,workout:2 w wierszu 1 oraz read:1,read:2,read:5,yoga:7 w wierszu 2 wynikiem jest:

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

Spróbuj swoich sił

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: suma zbiorów kluczy; dla każdego nawyku '<name>: a -> b ARROW'; następnie 'Improved: <n>'
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Edytor online Swift