جواب سوال 19 ProjectEuler: شمارش یکشنبه ها

پروژه اویلر

درود بر دوستان عزیز

هر سوالی که از سایت projecteuler حل می کنم یک شور و شوق جذابی در من ایجاد می شه! سوال 19 هم همینطور!

در این چالش گفته یک سری اطلاعات از تاریخ ها به ما داده شده مثلا گفته یک ژانویه 1900 دوشنبه بوده، تعداد روزهای هرماه چقدر هست و… تا به سوال اصلی برسه که می گه:

در طول قرن بیستم (یک ژانویه 1901 تا 31 دسامبر 2000) چه تعداد یک شنبه در اولین روز ماه قرار گرفته است؟

چیزی که به ذهن من رسید این بود که می تونم برای حل مساله از دو روش پیش برم. اول اینکه توضیحاتی که داده رو بصورت تاریخ پیاده سازی کنم و در آخر تعداد یکشنبه هایی که در اولین روز هرماه بوده اند رو محاسبه کنم. و دوم اینکه از کتابخانه تاریخ که در پایتون بصورت آماده هست استفاده کنم و بدون نیاز به طراحی تقویم قرن بیستم، فقط به شمارش یکشنبه ها بپردازم! خوب مسلما روش دوم رو انتخاب کردم.

پس بریم سراغ کدها:

from datetime import date, timedelta

sundays = 0
startDate = date(1901, 1, 1)
endDate = date(2001, 1, 1)
delta = timedelta(days=1)

while startDate < endDate:
    if startDate.day == 1:
        if startDate.weekday() == 6:
            sundays += 1
    startDate += delta

print(sundays)

برای استفاده از تاریخ من از کتابخانه datetime، date و timedelta رو وارد می کنم. (این کتابخانه برای کارکردن نیاز به نصب ندارد.) شروع قرن رو یک ژانویه 1901 گذاشتم و پایان رو می تونستم 31 دسامبر 2000 بگذارم یا یک ژانویه 2001 که در حلقه این روز رو محاسبه نکنم که روش دوم رو انتخاب کردم. delta که در کدها مشاهده می کنید برای میزان تغییر تاریخ هست که من اون رو یک روز قرار دادم تا در حلقه while بتونم در هر تکرار یک روز به جلو برم. با استفاده از این من نیازی به محاسبه تعداد روزهای هرماه رو ندارم و خود برنامه با پرشدن هر ماه به سراغ ماه بعد رفته و مشکلی برای جلورفتن در تاریخ ها نخواهیم داشت.

بعد از اینها یک حلقه درست کردم که از startDate شروع و تا endDate پیش میره و اول چک می کنه که اگر تاریخی که درحال کنترل اون هستیم روز اول ماه هست، پس باز چک کن اگر یکشنبه هم هست پس یک روز به یکشنبه ها اضافه کن! و تمام! در آخر هم تعداد یکشنبه هارو چاپ می کنه که جواب سوالمون هست.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.