Menu
Coddy logo textTech

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.

challenge icon

Görev

Orta

Her 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 > a olduğunda UP
  • b < a olduğunda DOWN
  • b == a olduğunda SAME

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: 2

Kopya 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>'
quiz iconKendini test et

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