در این سوال شما باید یک تقویم شبیه به Google Calendar طراحی و پیادهسازی کنید که فقط با استفاده از دستورات متنی (command line) با آن تعامل میشود. این تقویم قادر است رویدادهای روزانه را مدیریت کرده، برخوردهای (conflicts) رویدادها را تشخیص داده و امکان جستوجو، ویرایش و گزارشگیری از رویدادها را فراهم کند.
اهداف اصلی
-
اضافه کردن، حذف و ویرایش رویدادها
-
نمایش برنامه روزانه/هفتگی/ماهانه
-
تشخیص برخورد زمانی بین رویدادها
-
جستوجوی رویدادها با کلمات کلیدی
فرمت دستورات ورودی
ورودیها به شکل دستورات متنی داده میشوند. هر خط یک دستور مجزا است.
دستورات
ADD --date <yyyy-mm-dd> --start <hh:mm> --end <hh:mm> --title <event_title>
REMOVE --date <yyyy-mm-dd> --start <hh:mm>
EDIT --date <yyyy-mm-dd> --start <hh:mm> --title <new_title>
LIST --date <yyyy-mm-dd>
WEEK --date <yyyy-mm-dd>
MONTH --month <yyyy-mm>
SEARCH --keyword <search_term>
CONFLICTS --date <yyyy-mm-dd>
توضیح دستورات:
-
ADD
: افزودن یک رویداد با تاریخ، ساعت شروع، ساعت پایان و عنوان. -
REMOVE
: حذف رویدادی که از ساعت مشخص در یک روز آغاز میشود. -
EDIT
: تغییر عنوان رویداد مشخص شده. -
LIST
: فهرست رویدادهای یک روز خاص به ترتیب زمان. -
WEEK
: فهرست رویدادهای ۷ روز از تاریخ دادهشده. -
MONTH
: فهرست رویدادهای یک ماه خاص. -
SEARCH
: جستوجوی رویدادهایی که عنوانشان شامل کلیدواژه است. -
CONFLICTS
: نمایش تمام رویدادهایی که در تاریخ مشخص با یکدیگر همپوشانی دارند.
راهنمای دستورات
افزودن رویداد
ADD --date <date> --start <start_time> --end <end_time> --title <title>
این دستور یک رویداد جدید را با مشخصات زیر به تقویم اضافه میکند:
-
<date>
: تاریخ رویداد به فرمتyyyy-mm-dd
-
<start_time>
: زمان شروع رویداد به فرمتhh:mm
(۲۴ ساعته) -
<end_time>
: زمان پایان رویداد به فرمتhh:mm
(۲۴ ساعته) -
<title>
: عنوان رویداد (حداکثر ۱۰۰ کاراکتر)
قوانین و شرایط:
- زمان پایان باید لزوماً بعد از زمان شروع باشد. در غیر این صورت پیام خطای زیر چاپ شود:
ERROR: end time should be after the start time
- در صورت موفقیت، پیام زیر در کنسول چاپ شود:
Created event at <date> <start_time>
حذف رویداد
REMOVE --date <date> --start <start_time>
این دستور رویدادی را که دقیقاً در تاریخ و ساعت مشخصشده شروع میشود، از تقویم حذف میکند.
-
<date>
: تاریخ رویداد به فرمتyyyy-mm-dd
-
<start_time>
: زمان شروع رویداد به فرمتhh:mm
قوانین و شرایط:
-
فقط اگر رویدادی دقیقا با این تاریخ و ساعت شروع وجود داشته باشد، حذف انجام میشود.
-
در صورت موفقیت:
Removed event at <date> <start_time>
- در صورت عدم وجود رویداد:
ERROR: no event found at <date> <start_time>
ویرایش عنوان رویداد
EDIT --date <date> --start <start_time> --title <new_title>
این دستور عنوان رویدادی را که در تاریخ و ساعت مشخصشده شروع میشود، به مقدار جدید تغییر میدهد.
-
<date>
: تاریخ رویداد به فرمتyyyy-mm-dd
-
<start_time>
: زمان شروع رویداد به فرمتhh:mm
-
<new_title>
: عنوان جدید (حداکثر ۱۰۰ کاراکتر)
قوانین و شرایط:
-
فقط عنوان قابل تغییر است، زمان شروع یا پایان قابل تغییر نیست.
-
اگر رویداد یافت شود، ویرایش انجام میشود و خروجی زیر چاپ میشود:
Edited event at <date> <start_time>
- در صورت عدم وجود رویداد:
ERROR: no event found at <date> <start_time>
نمایش برنامه روزانه
LIST --date <date>
این دستور فهرست تمام رویدادهای ثبتشده در یک روز خاص را به ترتیب زمان شروع (رویدادهایی که زمان شروع زودتری دارند، بالاتر چاپ شوند)، نمایش میدهد.
<date>
: تاریخ مورد نظر به فرمتyyyy-mm-dd
فرمت خروجی:
Day View: <date>
| <date> | <start_time>-<end_time> | <title> |
- اگر هیچ رویدادی در آن روز وجود نداشته باشد:
Day View: <date>
No events found.
نمایش برنامه هفتگی
WEEK --date <date>
این دستور فهرست تمام رویدادهای ۷ روز از تاریخ مشخصشده (شامل آن روز) را نمایش میدهد. مثلا اگر تاریخ ۷ نوامبر وارد شود، رویدادهای ۷ نوامبر تا ۱۳ نوامبر نمایش داده شوند.
<date>
: تاریخ شروع بازه به فرمتyyyy-mm-dd
فرمت خروجی:
Week View (<start_date> to <end_date>):
| <date> | <start_time>-<end_time> | <title> |
- اگر هیچ رویدادی در بازه وجود نداشته باشد:
Week View (<start_date> to <end_date>):
No events found.
نمایش برنامه ماهانه
MONTH --month <year-month>
این دستور فهرست تمام رویدادهای ثبتشده در یک ماه مشخص را به ترتیب تاریخ و زمان نمایش میدهد.
<year-month>
: ماه مورد نظر به فرمتyyyy-mm
فرمت خروجی:
Month View: <year-month>
| <date> | <start_time>-<end_time> | <title> |
- اگر هیچ رویدادی در آن ماه وجود نداشته باشد:
Month View: <year-month>
No events found.
جستوجوی رویداد
SEARCH --keyword <keyword>
این دستور رویدادهایی را نمایش میدهد که عنوان آنها شامل کلیدواژه دادهشده است و حساس به بزرگی و کوچکی حروف نیست. خروجی ابتدا به ترتیب تاریخ، سپس بر اساس زمان شروع در هر روز مرتب شود.
<keyword>
: کلیدواژه مورد نظر برای جستوجو
فرمت خروجی:
Search Results:
| <date> | <start_time>-<end_time> | <title> |
- اگر هیچ عنوانی شامل کلیدواژه نباشد:
Search Results:
No matching events found.
بررسی تداخل زمانی رویدادها
CONFLICTS --date <date>
این دستور تمام رویدادهایی که در تاریخ مشخص با یکدیگر همپوشانی زمانی دارند را نمایش میدهد.
<date>
: تاریخ مورد نظر به فرمتyyyy-mm-dd
قوانین:
- تداخل زمانی یعنی دو یا چند رویداد در همان روز بازههای زمانی مشترک (حتی جزئی) دارند.
فرمت خروجی:
Conflict Detected:
| <date> | <start_time>-<end_time> | <title> |
- اگر هیچ تداخلی وجود نداشته باشد:
No conflicts found on <date>.
نکات قابل توجه
-
ورودیها از طریق فلگهای مشخص شده وارد میشوند و ترتیب آنها آزاد است و لزوماً به ترتیب ذکر شده در متن وارد نمیشوند.
-
در صورتی که هر یک از بخشهای مسئله را به درستی پیادهسازی کردید، امتیاز آن را مستقل از سایر بخشها خواهید گرفت. (البته دقت کنید در صورتی که دستور
ADD
شما به درستی کار نکند، امتیاز سایر بخشهای برنامه را نخواهید گرفت.) -
برای گرفتن امتیاز کامل، به کوچکی یا بزرگی حروف در خروجی دقت کنید.
-
تضمین میشود ساختار دستورات و فرمت تاریخها به درستی وارد خواهد شد. زمانها در قالب ۲۴ ساعته
hh:mm
و تاریخها در قالبyyyy-mm-dd
یاyyyy-mm
هستند. -
تعداد رویدادها حداکثر ۱۰,۰۰۰ عدد است.
-
عنوان رویداد حداکثر ۱۰۰ کاراکتر دارد.
-
خروجی رویدادها همیشه بر اساس زمان شروع به صورت صعودی مرتب باشد (ابتدا به ترتیب تاریخ، سپس بر اساس زمان شروع در هر روز مرتب شود). رویدادهای ورودی لزوماً به ترتیب زمانی صعودی وارد نمیشوند.
-
رعایت اصول و قوانین کد تمیز و شیگرایی حائز اهمیت میباشد.
ورودی
سطر اول ورودی شامل یک عدد صحیح و مثبت $n$ است که تعداد دستورهای ورودی را نشان میدهد. $$1≤n≤1000$$ در $n$ سطر بعدی ورودی، هر سطر شامل یکی از دستورهای ذکر شده است.
خروجی
خروجیهای خواسته شده برای هر دستور را به ترتیب چاپ کنید.
ورودی نمونه ۱
7
ADD --date 2025-06-01 --start 09:00 --end 10:00 --title "Morning Standup"
ADD --start 09:30 --end 11:00 --date 2025-06-01 --title "Client Call"
ADD --date 2025-06-01 --start 13:00 --end 14:00 --title "Lunch with Team"
CONFLICTS --date 2025-06-01
SEARCH --keyword call
REMOVE --date 2025-06-01 --start 09:30
LIST --date 2025-06-01
خروجی نمونه ۱
Created event at 2025-06-01 09:00
Created event at 2025-06-01 09:30
Created event at 2025-06-01 13:00
Conflict Detected:
| 2025-06-01 | 09:00-10:00 | Morning Standup |
| 2025-06-01 | 09:30-11:00 | Client Call |
Search Results:
| 2025-06-01 | 09:30-11:00 | Client Call |
Removed event at 2025-06-01 09:30
Day View: 2025-06-01
| 2025-06-01 | 09:00-10:00 | Morning Standup |
| 2025-06-01 | 13:00-14:00 | Lunch with Team |
توضیحات:
-
دو رویداد اول (09:00–10:00 و 09:30–11:00) بازهی زمانی مشترک دارند.
-
جستجوی واژهی «call» فقط یک مورد پیدا میکند.
-
حذف انجام میشود، چون تاریخ و ساعت شروع دقیقاً مشخص شده.
-
خروجی
LIST
فقط رویدادهای باقیمانده را نشون میدهد.
ورودی نمونه ۲
6
ADD --title "Project Kickoff" --date 2025-07-01 --start 10:00 --end 11:00
ADD --date 2025-07-03 --start 14:00 --end 15:00 --title "Code Review"
ADD --start 09:00 --end 10:30 --title "Client Feedback" --date 2025-07-10
EDIT --date 2025-07-03 --start 14:00 --title "Team Sync"
WEEK --date 2025-07-01
MONTH --month 2025-07
خروجی نمونه ۲
Created event at 2025-07-01 10:00
Created event at 2025-07-03 14:00
Created event at 2025-07-10 09:00
Edited event at 2025-07-03 14:00
Week View (2025-07-01 to 2025-07-07):
| 2025-07-01 | 10:00-11:00 | Project Kickoff |
| 2025-07-03 | 14:00-15:00 | Team Sync |
Month View: 2025-07
| 2025-07-01 | 10:00-11:00 | Project Kickoff |
| 2025-07-03 | 14:00-15:00 | Team Sync |
| 2025-07-10 | 09:00-10:30 | Client Feedback |
توضیحات:
-
سه رویداد اضافه شدند که تداخلی با هم ندارند.
-
دستور
EDIT
عنوان رویداد دوم را تغییر میدهد. -
با دستور
WEEK
همه رویدادها بین تاریخ2025-07-01
تا تاریخ2025-07-07
به ترتیب زمان نمایش داده میشوند. -
با دستور
MONTH
همه رویدادها مرتب به ترتیب زمان شروع نمایش داده میشوند.
ارسال پاسخ برای این سؤال