دورهمی

دورهمی

متوسط

مقدمه

هر ماه، همسرتان با بهترین دوستش ملاقات می‌کند. هر دوی آن‌ها برنامه‌های بسیار پرمشغله‌ای دارند و همین پیدا کردن یک تاریخ مناسب را دشوار می‌کند! با توجه به برنامه‌ی پرمشغله‌ی خودتان، همسرتان همیشه تاریخ‌های احتمالی ملاقات را با شما دوباره بررسی می‌کند:

  • «آیا می‌توانم جمعه‌ی اول ماه بعد ملاقات کنم؟»
  • «چهارشنبه‌ی سوم چطور؟»
  • «شاید یکشنبه‌ی آخر؟»

در تماس این ماه، همسرتان این سؤال را از شما پرسید:

  • «دوست دارم در پنجشنبه‌ی teenth ملاقات کنم؛ اشکالی ندارد؟»

گیج می‌شوید و می‌پرسید روز «teenth» چیست. همسرتان توضیح می‌دهد که روز teenth، مفهومی که خودش از خودش درآورده است، به روزهایی از ماه اشاره دارد که به «-teenth» ختم می‌شوند:

  • 13th (thirteenth)
  • 14th (fourteenth)
  • 15th (fifteenth)
  • 16th (sixteenth)
  • 17th (seventeenth)
  • 18th (eighteenth)
  • 19th (nineteenth)

از آنجا که هفت روز هفته هم وجود دارد، تضمین می‌شود که هر روز هفته در هر ماه دقیقاً یک روز teenth دارد.

حالا که مفهوم روز teenth را می‌فهمید، تقویم‌تان را نگاه می‌کنید. برای پنجشنبه‌ی teenth هیچ برنامه‌ای ندارید، پس با خوشحالی تاریخ را با همسرتان تأیید می‌کنید.

دستورالعمل‌ها

وظیفه‌ی شما این است که با داشتن ماه، سال، روز هفته و هفته، تاریخ دقیق یک دورهمی را پیدا کنید.

شش مقدار برای هفته وجود دارد که باید در نظر بگیرید: first، second، third، fourth، last، teenth.

برای مثال، ممکن است از شما خواسته شود تاریخ دورهمی در اولین دوشنبه‌ی ژانویه ۲۰۱۸ (۱ ژانویه ۲۰۱۸) را پیدا کنید.

به همین ترتیب، ممکن است از شما خواسته شود که موارد زیر را پیدا کنید:

  • سومین سه‌شنبه‌ی اوت ۲۰۱۹ (۲۰ اوت ۲۰۱۹)
  • چهارشنبه‌ی teenth مه ۲۰۲۰ (۱۳ مه ۲۰۲۰)
  • چهارمین یکشنبه‌ی ژوئیه ۲۰۲۱ (۲۵ ژوئیه ۲۰۲۱)
  • آخرین پنجشنبه‌ی نوامبر ۲۰۲۲ (۲۴ نوامبر ۲۰۲۲)
  • شنبه‌ی teenth اوت ۱۹۵۳ (۱۵ اوت ۱۹۵۳)

هفته‌ی teenth

هفته‌ی teenth به هفت روز در ماه اشاره دارد که به «-teenth» ختم می‌شوند (روزهای ۱۳، ۱۴، ۱۵، ۱۶، ۱۷، ۱۸ و ۱۹).

اگر از ما خواسته شود شنبه‌ی teenth اوت ۱۹۵۳ را پیدا کنیم، تقویم آن را بررسی می‌کنیم:

    August 1953
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

از این تقویم درمی‌یابیم که شنبه‌ی teenth، ۱۵ اوت ۱۹۵۳ است.

ساختار این تمرین در Python

ما یک توصیفگر هفته‌ی دیگر (fifth) هم اضافه کرده‌ایم که به پنجمین روز هفته در ماه اشاره می‌کند، به شرط آنکه وجود داشته باشد.
اگر پنجمین روز هفته در یک ماه وجود نداشته باشد، باید یک «استثنا» پرتاب کنید.

سفارشی‌سازی و پرتاب استثناها

گاهی لازم است در code خودتان، استثناها را هم سفارشی‌سازی کنید و هم raise کنید. وقتی این کار را می‌کنید، همیشه باید یک پیام خطای معنادار را بگنجانید تا نشان دهد منبع خطا چیست. این کار code شما را خواناتر می‌کند و کمک چشمگیری به debug می‌کند.

استثناهای سفارشی را می‌توان از طریق کلاس‌های استثنای تازه ساخت (برای جزئیات بیشتر classes را ببینید.) که معمولاً زیرکلاس‌های Exception هستند.

در موقعیت‌هایی که می‌دانید منبع خطا مشتق‌شده از یک نوع استثنای خاص خواهد بود، می‌توانید انتخاب کنید که از یکی از built in error types زیر کلاس Exception ارث‌بری کنید. هنگام پرتاب خطا هم همچنان باید یک پیام معنادار را بگنجانید.

این تمرین خاص می‌خواهد که شما یک استثنای سفارشی بسازید تا وقتی تابع meetup() شما ترکیب نامعتبری از اسم روز هفته و شماره دریافت می‌کند، پرتاب/«thrown» شود. تست‌ها تنها در صورتی پاس می‌شوند که استثناهای مناسب را سفارشی‌سازی کنید، آن استثناها را raise کنید و پیام‌های خطای مناسب را هم بگنجانید.

برای سفارشی‌سازی یک built-in exception، یک class بسازید که از آن استثنا ارث‌بری می‌کند. وقتی استثنای سفارشی را همراه با یک پیام پرتاب می‌کنید، پیام را به‌عنوان آرگومان برای نوع exception بنویسید:

# subclassing the built-in ValueError to create MeetupDayException
class MeetupDayException(ValueError):
    """Exception raised when the Meetup weekday and count do not result in a valid date.

    message: explanation of the error.

    """
    def __init__(self, message):
        self.message = message

        
# raising a MeetupDayException
raise MeetupDayException("That day does not exist.")

منبع

جرمی هاینگاردنر به دورهمی‌ای در Boulder اشاره کرد که هر ماه در «Wednesteenth» برگزار می‌شود
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Python Exercism

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

در Exercism ثبت‌نام کنید تا Python را همراه با 17 مفهوم146 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.