Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مقارنة الأسابيع

جزء من قسم المنطق والتدفق في رحلة 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 إلى صفر.

challenge icon

التحدي

متوسط

اقرأ سطرين من المدخلات، كل منهما عبارة عن قائمة مفصولة بفاصلة من مدخلات habit:day (واحدة لكل أسبوع). لكل عادة تظهر في أي من الأسبوعين، اطبع سطراً واحداً بهذا التنسيق:

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

حيث a هو عدد الأيام الفريدة في الأسبوع الأول، و b هو عدد الأيام الفريدة في الأسبوع الثاني، و arrow هو:

  • UP عندما يكون b > a
  • DOWN عندما يكون b < a
  • SAME عندما يكون 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>'
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق والتدفق