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.
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à:
UPkhib > aDOWNkhib < aSAMEkhib == 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: 2Tự 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>'
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
1Chuỗi chuyên sâu
Đếm và chỉ sốChữ hoa, chữ thường và xóa khoảng trắngTìm kiếm trong chuỗiTách và nối chuỗiThay thế chuỗi conÔn tập: Kiểm tra tên người dùng4Tập hợp
Tạo tập hợpPhép hợp và phép giaoPhép trừ và hiệu đối xứngTập con và tập hợp conÔn tập: Bộ lọc thẻ7Dự án: Theo dõi thói quen
Tổng quan dự ánĐánh dấu hoàn thành10Dự án: bộ máy trắc nghiệm
Tổng quan dự ánĐặt câu hỏiTự luyện tập: Playground Swift