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.
Wyzwanie
ŚredniWczytaj 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, gdyb > aDOWN, gdyb < aSAME, gdyb == 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: 2Spró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>'
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
1Dogłębnie o ciągach znaków
Liczba i indeksyWielkość liter i usuwanie białych znakówWyszukiwanie w ciągach znakówDzielenie i łączenieZastępowanie podciągówPodsumowanie — sprawdzanie nazwy użytkownika4Zbiory
Tworzenie zbiorówSuma i część wspólnaRóżnica i różnica symetrycznaPodzbiór i nadzbiórPowtórka — filtr tagów7Projekt – Śledzenie nawyków
Przegląd projektuOznacz jako wykonane10Projekt — silnik quizów
Przegląd projektuZadawanie pytań2Zakresy i kroki
Zakresy domknięte i półotwarteKrokMetody zakresówZakresy w instrukcji switchPowtórka — siatka kalendarza5Funkcje wyższego rzędu, część 1
MapFilterReduceŁączenie map, filter i reducePodsumowanie – statystyki słówPoćwicz samodzielnie: Edytor online Swift