Bandwagoner

Bandwagoner

تمرين تعلّمي

مقدمة

الحقول المُسمّاة

عندما تحمل إحدى صيغ النوع المخصص بيانات، فإنها تُسمّى سجلًا، وتقع كل قيمة يحتويها في حقل.

pub type Rectangle {
  Rectangle(
    Float, // The first field
    Float, // The second field
  )
}

ولتسهيل القراءة، يسمح Gleam بتسمية الحقول باسم.

pub type Rectangle {
  Rectangle(
    width: Float,
    height: Float,
  )
}

ويمكن استخدام التسميات لتمرير الوسائط إلى مُنشئ السجل بأي ترتيب.

let a = Rectangle(height: 10.0, width: 20.0)
let b = Rectangle(width: 20.0, height: 10.0)

a == b
// -> True

وعندما يكون للنوع المخصص صيغة واحدة فقط، يمكن استخدام صيغة الوصول .label للحصول على حقول السجل.

let rect = Rectangle(height: 10.0, width: 20.0)

rect.height // -> 10.0
rect.width  // -> 20.0

ويمكن استخدام صيغة تحديث السجل عندما يكون للنوع المخصص صيغة واحدة، لإنشاء سجل جديد من سجل موجود، مع استبدال بعض الحقول بقيم جديدة.

let rect = Rectangle(height: 10.0, width: 20.0)
let tall_rect = Rectangle(..rect, height: 50.0)

tall_rect.height // -> 50.0
tall_rect.width  // -> 20.0

ويمكن أيضًا استخدام التسميات عند مطابقة الأنماط لاستخراج القيم من السجلات.

pub fn is_tall(rect: Rectangle) {
  case rect {
    Rectangle(height: h, width: _) if h >. 20.0 -> True
    _ -> False
  }
}

وإذا أردنا المطابقة على بعض الحقول فقط، يمكننا استخدام عامل النشر .. لتجاهل الحقول المتبقية.

pub fn is_tall(rect: Rectangle) {
  case rect {
    Rectangle(height: h, ..) if h >. 20.0 -> True
    _ -> False
  }
}

التعليمات

في هذا التمرين أنت من كبار مشجّعي الرياضة، وقد اكتشفت للتو شغفًا بكرة السلة في الرابطة الوطنية لكرة السلة (NBA). وبما أنك جديد على كرة السلة في NBA، فأنت تتعمّق في تاريخ NBA، وتتابع الفرق والمدرّبين وإحصاءات فوزهم وخسارتهم، وتقارن بعضهم ببعض.

وبما أنه ليس لديك فريق مفضّل بعد، فسوف تطوّر أيضًا خوارزمية لمعرفة ما إذا كان ينبغي أن تشجّع فريقًا بعينه.

لديك سبع مهام تساعدك على تطوير خوارزمية التشجيع على فريق خاصّة بك.

1. عرّف النموذج

عرّف سجل Coach بالحقلين التاليين:

  • name: اسم المدرّب، من النوع String.
  • former_player: يوضّح ما إذا كان المدرّب لاعبًا سابقًا، من النوع Bool.

عرّف سجل Stats بالحقلين التاليين:

  • wins: عدد مرات الفوز، من النوع Int.
  • losses: عدد مرات الخسارة، من النوع Int.

عرّف سجل Team بالحقول الثلاثة التالية:

  • name: اسم الفريق، من النوع String.
  • coach: مدرّب الفريق، من النوع Coach.
  • stats: إحصاءات الفريق، من النوع Stats.

2. أنشئ مدرّب الفريق

نفّذ الدالة create_coach التي تأخذ اسم المدرّب وحالته كلاعب سابق كمعاملات، وتُرجع سجل Coach الخاص به:

create_coach("Larry Bird", True)
// -> Coach(name: "Larry Bird", former_player: True)

3. أنشئ إحصاءات الفريق

نفّذ الدالة create_stats التي تأخذ عدد مرات الفوز وعدد مرات الخسارة كمعاملات، وتُرجع سجل Stats الخاص به:

create_stats(58, 24)
// -> Stats(wins: 58, losses: 24)

4. أنشئ فريقًا

نفّذ الدالة create_team التي تأخذ اسم الفريق والمدرّب والسجل كمعاملات، وتُرجع سجل Team الخاص به:

let coach = create_coach("Larry Bird", True)
let stats = create_stats(58, 24)
create_team("Indiana Pacers", coach, stats)
// -> Team(
//   name: "Indiana Pacers",
//   coach: Coach(name: "Larry Bird", FormerPlayer = True),
//   stats: Stats(wins: 58, losses: 24),
// ) 

5. استبدل المدرّب

بما أن مالكي فرق NBA قليلو الصبر، فقد وجدت أن نتائج الفريق السيئة كثيرًا ما تؤدي إلى استبدال المدرّب. نفّذ الدالة replace_coach التي تأخذ الفريق ومدرّبه الجديد كمعاملات، وتُرجع الفريق لكن مع المدرّب الجديد:

let coach = create_coach("Larry Bird", True)
let record = create_stats(58, 24)
let team = create_team("Indiana Pacers", coach, record)

let new_coach = create_coach("Isiah Thomas", True)
replace_coach(team, new_coach)
// -> Team(
//   name: "Indiana Pacers",
//   coach: Coach(name: "Isiah Thomas", FormerPlayer = True),
//   stats: Stats(wins: 58, losses: 24),
// ) 

6. تحقّق من تطابق الفريقين

بينما تتعمّق في الإحصاءات، تحتفظ بقوائم للفرق وسجلاتها. أحيانًا تخطئ وتظهر إدخالات مكرّرة في قائمتك. نفّذ الدالة is_same_team التي تأخذ فريقين وتُرجع True إذا كانا الفريق نفسه، وإلا فتُرجع False:

let pacers_coach = create_coach("Larry Bird", True)
let pacers_stats = create_stats(58, 24)
let pacers_team = create_team("Indiana Pacers", pacers_coach, pacers_stats)

let lakers_coach = create_coach("Del Harris", False)
let lakers_stats = create_stats(61, 21)
let lakers_team = create_team("LA Lakers", lakers_coach, lakers_stats)

is_same_team(pacers_team, lakers_team)
// -> False

7. تحقّق مما إذا كان ينبغي أن تشجّع فريقًا

بعد النظر في فرق ومباريات كثيرة، توصّلت إلى خوارزمية. إذا تحقّق أحد ما يلي، فإنك تشجّع ذلك الفريق:

  • اسم المدرّب هو "Gregg Popovich"
  • المدرّب لاعب سابق
  • اسم الفريق هو "Chicago Bulls"
  • فاز الفريق بـ60 مباراة أو أكثر
  • عدد مرات خسارة الفريق أكبر من عدد مرات فوزه

نفّذ الدالة root_for_team التي تأخذ فريقًا وتُرجع True إذا كان ينبغي أن تشجّع ذلك الفريق، وإلا فتُرجع False:

let spurs_coach = create_coach("Gregg Popovich", False)
let spurs_stats = create_stats(56, 26)
let spurs_team = create_team("San Antonio Spurs", spurs_coach, spurs_stats)
root_for_team(spurs_team)
// -> True
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Gleam Exercism

مستعد لبدء Bandwagoner؟

سجّل في Exercism لتتعلّم وتتقن Gleam عبر 33 مفهومًا122 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.