همراه موج

همراه موج

تمرین یادگیری

مقدمه

فیلدهای برچسب‌دار

وقتی گونه‌ای از یک «نوع داده‌ی سفارشی» داده‌ای را در خود نگه می‌دارد، به آن «رکورد» می‌گویند و هر مقدارِ درون آن در یک «فیلد» جای می‌گیرد.

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» باشد
  • تیم ۶۰ بازی یا بیشتر برده باشد
  • باخت‌های تیم بیشتر از بردهایش باشد

تابع 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

آماده‌اید همراه موج را شروع کنید؟

در Exercism ثبت‌نام کنید تا Gleam را همراه با 33 مفهوم122 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.