Menu
CoddyTech

So sánh các tuần

Thuộc phần Logic và luồng thực thi trong hành trình Swift của Coddy. Bài học 37 trên 56.

Tính năng cuối cùng: lấy dữ liệu của hai tuần và báo cáo mức thay đổi của từng thói quen.

Mỗi tuần là một danh sách các thao tác habit:day riêng trên một dòng. Tạo hai từ điển như cách bạn vẫn làm, rồi so sánh chúng.

Tập hợp thói quen đáng chú ý là hợp các khóa của cả hai tuần (một thói quen có thể xuất hiện trong tuần này nhưng không xuất hiện trong tuần kia). Duyệt qua hợp đó theo thứ tự bảng chữ cái.

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 xử lý trường hợp thiếu khóa (key). weekA[name]?.count là cách dùng optional chaining để đọc số đếm mà không cần mở gói giá trị trước. Cách này trả về nil khi không có khóa, và ?? 0 chuyển giá trị đó thành 0.

challenge icon

Thử thách

Trung bình

Đọc hai dòng đầu vào, mỗi dòng là danh sách các mục habit:day được phân tách bằng dấu phẩy (mỗi tuần một dòng). Với mỗi thói quen xuất hiện trong một trong hai tuần, hãy in một dòng theo định dạng sau:

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

Trong đó, a là số ngày riêng biệt trong tuần 1, b là số ngày riêng biệt trong tuần 2, còn arrow là:

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

In các thói quen theo thứ tự bảng chữ cái. Sau các dòng cho từng thói quen, in một dòng tổng kết:

Improved: <n>

Trong đó, n là số thói quen có mũi tên UP.

Với đầu vào read:1,read:3,workout:2 ở dòng 1 và read:1,read:2,read:5,yoga:7 ở dòng 2, đầu ra là:

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

Tự làm thử

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: lấy hợp các khóa; với mỗi thói quen, in '<name>: a -> b ARROW'; sau đó in 'Improved: <n>'
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng thực thi

Tự luyện tập: Playground Swift