Menu
CoddyTech

Bandingkan Minggu

Termasuk bagian Logika dan Alur dalam perjalanan Swift di Coddy. Pelajaran 37 dari 56.

Fitur terakhir: gunakan data dari dua minggu dan laporkan perubahan untuk setiap kebiasaan.

Setiap minggu berupa list operasi habit:day yang ditulis pada baris tersendiri. Buat dua dictionary seperti yang sudah kamu lakukan, lalu bandingkan keduanya.

Kebiasaan yang menarik adalah gabungan kunci dari kedua minggu tersebut (suatu kebiasaan mungkin muncul pada satu minggu, tetapi tidak pada minggu lainnya). Iterasikan gabungan itu dalam urutan alfabetis.

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 menangani kasus kunci yang hilang. weekA[name]?.count adalah cara membaca count dengan optional chaining tanpa melakukan unwrap terlebih dahulu. Ekspresi ini mengembalikan nil saat kuncinya tidak ada, lalu ?? 0 mengubahnya menjadi nol.

challenge icon

Tantangan

Sedang

Baca dua baris input, masing-masing berupa daftar habit:day yang dipisahkan koma (satu untuk setiap minggu). Untuk setiap kebiasaan yang muncul pada salah satu minggu, cetak satu baris dengan format berikut:

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

dengan a adalah jumlah hari unik pada minggu ke-1, b adalah jumlah hari unik pada minggu ke-2, dan arrow adalah:

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

Cetak kebiasaan dalam urutan alfabetis. Setelah baris untuk setiap kebiasaan, cetak satu baris ringkasan:

Improved: <n>

dengan n adalah jumlah kebiasaan dengan panah UP.

Untuk input read:1,read:3,workout:2 pada baris 1 dan read:1,read:2,read:5,yoga:7 pada baris 2, outputnya adalah:

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

Coba sendiri

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: gabungkan semua kunci; untuk setiap kebiasaan, gunakan format '<name>: a -> b ARROW'; lalu 'Improved: <n>'
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Playground Swift