Haftaları Karşılaştır
Coddy'nin Swift Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 37 / 56.
Son özellik: iki haftalık veriyi alın ve alışkanlık başına değişimi raporlayın.
Her hafta, kendi satırında kendi habit:day işlemleri listesidir. Şimdiye kadar yaptığınız gibi iki sözlük oluşturun, ardından bunları karşılaştırın.
İlginç alışkanlıklar kümesi, her iki hafta boyunca anahtarların birleşimidir (bir alışkanlık bir haftada görünüp diğerinde görünmeyebilir). Bu birleşimi alfabetik olarak sıralanmış şekilde yineleyin.
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)")
}?? 0 ifadesi eksik anahtar durumunu ele alır. weekA[name]?.count, önce açma (unwrapping) işlemi yapmadan bir sayıyı okumanın isteğe bağlı zincirleme (optional-chained) yoludur; anahtar mevcut olmadığında nil döndürür ve ?? 0 bunu sıfıra çevirir.
Görev
OrtaHer biri virgülle ayrılmış habit:day girişlerinden oluşan (her hafta için bir tane) iki satırlık girdi okuyun. Her iki haftada da görünen her alışkanlık için şu formatta bir satır yazdırın:
<habit>: <a> -> <b> <arrow>burada a 1. haftadaki benzersiz gün sayısı, b 2. haftadaki benzersiz gün sayısıdır ve arrow şunlardan biridir:
b > aolduğundaUPb < aolduğundaDOWNb == aolduğundaSAME
Alışkanlıkları alfabetik sırayla yazdırın. Alışkanlık bazındaki satırlardan sonra bir özet satırı yazdırın:
Improved: <n>burada n, oku UP olan alışkanlıkların sayısıdır.
1. satırdaki read:1,read:3,workout:2 ve 2. satırdaki read:1,read:2,read:5,yoga:7 girdisi için çıktı şöyledir:
read: 2 -> 3 UP
workout: 1 -> 0 DOWN
yoga: 0 -> 1 UP
Improved: 2Kopya kağıdı
İki sözlükten anahtarların birleşimini almak ve alfabetik olarak yinelemek için:
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, sayıyı açmadan (unwrapping) almak için isteğe bağlı zincirleme (optional chaining) kullanır; anahtar eksikse nil döndürür. ?? 0 bu nil değerini sıfıra dönüştürür.
Kendin dene
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()!)
// YAPILACAKLAR: anahtarların birleşimi; alışkanlık başına '<name>: a -> b OK'; sonra 'Improved: <n>'
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1Stringler Derinlemesine
Sayma ve İndekslerBüyük-Küçük Harf ve KırpmaStringlerde AramaBölme ve BirleştirmeAlt Stringleri DeğiştirmeÖzet - Kullanıcı Adı Kontrolü4Kümeler
Küme OluşturmaBirleşim ve KesişimFark ve Simetrik FarkAlt Küme ve Üst KümeÖzet - Etiket Filtresi7Proje - Alışkanlık Takibi
Projeye Genel BakışTamamlandı Olarak İşaretle10Proje - Quiz Motoru
Projeye Genel BakışSoruları Sorma2Aralıklar ve Adımlar
Kapalı ve Yarı AçıkStride (Adım)Aralık MetotlarıSwitch İçinde AralıklarÖzet - Takvim Izgarası5Yüksek Mertebeden Fonksiyonlar Bölüm 1
MapFilterReduceMap, filter, reduce zincirlemeÖzet - Kelime İstatistikleri