مقارنة الأسابيع
جزء من قسم المنطق والتدفق في رحلة Swift على Coddy — الدرس 37 من 56.
الميزة النهائية: خذ بيانات أسبوعين وأبلغ عن التغيير لكل عادة.
كل أسبوع عبارة عن قائمة خاصة به من عمليات habit:day في سطر منفصل. قم ببناء قاموسين بنفس الطريقة التي كنت تتبعها، ثم قارن بينهما.
مجموعة العادات المثيرة للاهتمام هي اتحاد المفاتيح عبر كلا الأسبوعين (قد تظهر عادة في أسبوع واحد ولكن ليس في الآخر). قم بالتكرار عبر ذلك الاتحاد مرتباً أبجدياً.
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 حالة المفتاح المفقود. تعد weekA[name]?.count هي الطريقة المتسلسلة اختيارياً (optional-chained) لقراءة عدد دون فك التغليف (unwrapping) أولاً، فهي تعيد nil عندما لا يكون المفتاح موجوداً، وهو ما يحوله ?? 0 إلى صفر.
التحدي
متوسطاقرأ سطرين من المدخلات، كل منهما عبارة عن قائمة مفصولة بفاصلة من مدخلات habit:day (واحدة لكل أسبوع). لكل عادة تظهر في أي من الأسبوعين، اطبع سطراً واحداً بهذا التنسيق:
<habit>: <a> -> <b> <arrow>حيث a هو عدد الأيام الفريدة في الأسبوع الأول، و b هو عدد الأيام الفريدة في الأسبوع الثاني، و arrow هو:
UPعندما يكونb > aDOWNعندما يكونb < aSAMEعندما يكونb == a
اطبع العادات بترتيب أبجدي. بعد الأسطر الخاصة بكل عادة، اطبع سطر ملخص واحداً:
Improved: <n>حيث n هو عدد العادات التي لها السهم UP.
للمدخلات read:1,read:3,workout:2 في السطر الأول و read:1,read:2,read:5,yoga:7 في السطر الثاني، تكون المخرجات:
read: 2 -> 3 UP
workout: 1 -> 0 DOWN
yoga: 0 -> 1 UP
Improved: 2ورقة مرجعية
للحصول على اتحاد المفاتيح من قاموسين والتكرار أبجدياً:
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 التسلسل الاختياري (optional chaining) للحصول على العدد دون فك التغليف (unwrapping)؛ ويعيد nil إذا كان المفتاح مفقوداً. أما ?? 0 فيقوم بتحويل قيمة nil تلك إلى صفر.
جرّب بنفسك
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: اتحاد المفاتيح؛ لكل عادة '<name>: a -> b ARROW'؛ ثم 'Improved: <n>'
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتدفق
1النصوص بعمق
العد والفهارسحالة الأحرف وإزالة الفراغاتالبحث في النصوصتقسيم ودمج النصوصاستبدال النصوص الفرعيةمراجعة - التحقق من اسم المستخدم4المجموعات
إنشاء المجموعاتالاتحاد والتقاطعالطرح والفرق المتماثلالمجموعات الجزئية والشاملةمراجعة - تصفية الـ Tag7مشروع - متتبع العادات
نظرة عامة على المشروعتحديد كمكتمل2النطاقات والخطوات
المغلقة مقابل نصف المفتوحةالخطوة (Stride)دوال النطاقاتالنطاقات في Switchملخص - شبكة التقويم5الدوال من الرتبة العليا - الجزء الأول
MapFilterReduceربط Map و Filter و Reduceمراجعة - إحصائيات الكلمات