در این سوال شما باید یک تقویم شبیه به Google Calendar طراحی و پیادهسازی کنید که فقط با استفاده از دستورات متنی (command line) با آن تعامل میشود. این تقویم قادر است رویدادهای روزانه را مدیریت کرده، برخوردهای (conflicts) رویدادها را تشخیص داده و امکان جستوجو، ویرایش و گزارشگیری از رویدادها را فراهم کند.
اهداف اصلی
-
اضافه کردن، حذف و ویرایش رویدادها
-
نمایش برنامه روزانه/هفتگی/ماهانه
-
تشخیص برخورد زمانی بین رویدادها
-
جستوجوی رویدادها با کلمات کلیدی
فرمت دستورات ورودی
ورودیها به شکل دستورات متنی داده میشوند. هر خط یک دستور مجزا است.
دستورات
توضیح دستورات:
-
ADD
: افزودن یک رویداد با تاریخ، ساعت شروع، ساعت پایان و عنوان. -
REMOVE
: حذف رویدادی که از ساعت مشخص در یک روز آغاز میشود. -
EDIT
: تغییر عنوان رویداد مشخص شده. -
LIST
: فهرست رویدادهای یک روز خاص به ترتیب زمان. -
WEEK
: فهرست رویدادهای ۷ روز از تاریخ دادهشده. -
MONTH
: فهرست رویدادهای یک ماه خاص. -
SEARCH
: جستوجوی رویدادهایی که عنوانشان شامل کلیدواژه است. -
CONFLICTS
: نمایش تمام رویدادهایی که در تاریخ مشخص با یکدیگر همپوشانی دارند.
راهنمای دستورات
افزودن رویداد
این دستور یک رویداد جدید را با مشخصات زیر به تقویم اضافه میکند:
-
<date>
: تاریخ رویداد به فرمتyyyy-mm-dd
-
<start_time>
: زمان شروع رویداد به فرمتhh:mm
(۲۴ ساعته) -
<end_time>
: زمان پایان رویداد به فرمتhh:mm
(۲۴ ساعته) -
<title>
: عنوان رویداد (حداکثر ۱۰۰ کاراکتر)
قوانین و شرایط:
- زمان پایان باید لزوماً بعد از زمان شروع باشد. در غیر این صورت پیام خطای زیر چاپ شود:
- در صورت موفقیت، پیام زیر در کنسول چاپ شود:
حذف رویداد
این دستور رویدادی را که دقیقاً در تاریخ و ساعت مشخصشده شروع میشود، از تقویم حذف میکند.
-
<date>
: تاریخ رویداد به فرمتyyyy-mm-dd
-
<start_time>
: زمان شروع رویداد به فرمتhh:mm
قوانین و شرایط:
-
فقط اگر رویدادی دقیقا با این تاریخ و ساعت شروع وجود داشته باشد، حذف انجام میشود.
-
در صورت موفقیت:
- در صورت عدم وجود رویداد:
ویرایش عنوان رویداد
این دستور عنوان رویدادی را که در تاریخ و ساعت مشخصشده شروع میشود، به مقدار جدید تغییر میدهد.
-
<date>
: تاریخ رویداد به فرمتyyyy-mm-dd
-
<start_time>
: زمان شروع رویداد به فرمتhh:mm
-
<new_title>
: عنوان جدید (حداکثر ۱۰۰ کاراکتر)
قوانین و شرایط:
-
فقط عنوان قابل تغییر است، زمان شروع یا پایان قابل تغییر نیست.
-
اگر رویداد یافت شود، ویرایش انجام میشود و خروجی زیر چاپ میشود:
- در صورت عدم وجود رویداد:
نمایش برنامه روزانه
این دستور فهرست تمام رویدادهای ثبتشده در یک روز خاص را به ترتیب زمان شروع (رویدادهایی که زمان شروع زودتری دارند، بالاتر چاپ شوند)، نمایش میدهد.
<date>
: تاریخ مورد نظر به فرمتyyyy-mm-dd
فرمت خروجی:
- اگر هیچ رویدادی در آن روز وجود نداشته باشد:
نمایش برنامه هفتگی
این دستور فهرست تمام رویدادهای ۷ روز از تاریخ مشخصشده (شامل آن روز) را نمایش میدهد. مثلا اگر تاریخ ۷ نوامبر وارد شود، رویدادهای ۷ نوامبر تا ۱۳ نوامبر نمایش داده شوند.
<date>
: تاریخ شروع بازه به فرمتyyyy-mm-dd
فرمت خروجی:
- اگر هیچ رویدادی در بازه وجود نداشته باشد:
نمایش برنامه ماهانه
این دستور فهرست تمام رویدادهای ثبتشده در یک ماه مشخص را به ترتیب تاریخ و زمان نمایش میدهد.
<year-month>
: ماه مورد نظر به فرمتyyyy-mm
فرمت خروجی:
- اگر هیچ رویدادی در آن ماه وجود نداشته باشد:
جستوجوی رویداد
این دستور رویدادهایی را نمایش میدهد که عنوان آنها شامل کلیدواژه دادهشده است و حساس به بزرگی و کوچکی حروف نیست. خروجی ابتدا به ترتیب تاریخ، سپس بر اساس زمان شروع در هر روز مرتب شود.
<keyword>
: کلیدواژه مورد نظر برای جستوجو
فرمت خروجی:
- اگر هیچ عنوانی شامل کلیدواژه نباشد:
بررسی تداخل زمانی رویدادها
این دستور تمام رویدادهایی که در تاریخ مشخص با یکدیگر همپوشانی زمانی دارند را نمایش میدهد.
<date>
: تاریخ مورد نظر به فرمتyyyy-mm-dd
قوانین:
- تداخل زمانی یعنی دو یا چند رویداد در همان روز بازههای زمانی مشترک (حتی جزئی) دارند.
فرمت خروجی:
- اگر هیچ تداخلی وجود نداشته باشد:
نکات قابل توجه
-
ورودیها از طریق فلگهای مشخص شده وارد میشوند و ترتیب آنها آزاد است و لزوماً به ترتیب ذکر شده در متن وارد نمیشوند.
-
در صورتی که هر یک از بخشهای مسئله را به درستی پیادهسازی کردید، امتیاز آن را مستقل از سایر بخشها خواهید گرفت. (البته دقت کنید در صورتی که دستور
ADD
شما به درستی کار نکند، امتیاز سایر بخشهای برنامه را نخواهید گرفت.) -
برای گرفتن امتیاز کامل، به کوچکی یا بزرگی حروف در خروجی دقت کنید.
-
تضمین میشود ساختار دستورات و فرمت تاریخها به درستی وارد خواهد شد. زمانها در قالب ۲۴ ساعته
hh:mm
و تاریخها در قالبyyyy-mm-dd
یاyyyy-mm
هستند. -
تعداد رویدادها حداکثر ۱۰,۰۰۰ عدد است.
-
عنوان رویداد حداکثر ۱۰۰ کاراکتر دارد.
-
خروجی رویدادها همیشه بر اساس زمان شروع به صورت صعودی مرتب باشد (ابتدا به ترتیب تاریخ، سپس بر اساس زمان شروع در هر روز مرتب شود). رویدادهای ورودی لزوماً به ترتیب زمانی صعودی وارد نمیشوند.
-
رعایت اصول و قوانین کد تمیز و شیگرایی حائز اهمیت میباشد.
ورودی
سطر اول ورودی شامل یک عدد صحیح و مثبت است که تعداد دستورهای ورودی را نشان میدهد. در سطر بعدی ورودی، هر سطر شامل یکی از دستورهای ذکر شده است.
خروجی
خروجیهای خواسته شده برای هر دستور را به ترتیب چاپ کنید.
ورودی نمونه ۱
خروجی نمونه ۱
توضیحات:
-
دو رویداد اول (09:00–10:00 و 09:30–11:00) بازهی زمانی مشترک دارند.
-
جستجوی واژهی «call» فقط یک مورد پیدا میکند.
-
حذف انجام میشود، چون تاریخ و ساعت شروع دقیقاً مشخص شده.
-
خروجی
LIST
فقط رویدادهای باقیمانده را نشون میدهد.
ورودی نمونه ۲
خروجی نمونه ۲
توضیحات:
-
سه رویداد اضافه شدند که تداخلی با هم ندارند.
-
دستور
EDIT
عنوان رویداد دوم را تغییر میدهد. -
با دستور
WEEK
همه رویدادها بین تاریخ2025-07-01
تا تاریخ2025-07-07
به ترتیب زمان نمایش داده میشوند. -
با دستور
MONTH
همه رویدادها مرتب به ترتیب زمان شروع نمایش داده میشوند.
ارسال پاسخ برای این سؤال