سلام دوست عزیز😃👋

به «مسابقه ورودی بوت‌کمپ کداستار - Software Engineering» خوش آمدی!

هرگونه ارتباط با سایر شرکت‌کنندگان و یا استفاده از ابزارهای تولید کد، مثل ChatGPT و... در مسابقات کوئرا ممنوع است و بعد از شناسایی از لیست شرکت‌کنندگان مسابقه حذف می‌شوید.

لینک‌های مفید برای شرکت در مسابقه:

سوالات و مشکلات خودتان را می‌توانید از طریق قسمت «سوال بپرسید» با ما در میان بگذارید.

موفق باشید و بهتون خوش بگذره 😉✌

گوگل کلندر CLI


در این سوال شما باید یک تقویم شبیه به Google Calendar طراحی و پیاده‌سازی کنید که فقط با استفاده از دستورات متنی (command line) با آن تعامل می‌شود. این تقویم قادر است رویدادهای روزانه را مدیریت کرده، برخوردهای (conflicts) رویدادها را تشخیص داده و امکان جست‌وجو، ویرایش و گزارش‌گیری از رویدادها را فراهم کند.

اهداف اصلی🔗

  1. اضافه کردن، حذف و ویرایش رویدادها

  2. نمایش برنامه روزانه/هفتگی/ماهانه

  3. تشخیص برخورد زمانی بین رویدادها

  4. جست‌وجوی رویدادها با کلمات کلیدی

فرمت دستورات ورودی🔗

ورودی‌ها به شکل دستورات متنی داده می‌شوند. هر خط یک دستور مجزا است.

دستورات🔗

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>
Plain text

توضیح دستورات:🔗

  • ADD: افزودن یک رویداد با تاریخ، ساعت شروع، ساعت پایان و عنوان.

  • REMOVE: حذف رویدادی که از ساعت مشخص در یک روز آغاز می‌شود.

  • EDIT: تغییر عنوان رویداد مشخص شده.

  • LIST: فهرست رویدادهای یک روز خاص به ترتیب زمان.

  • WEEK: فهرست رویدادهای ۷ روز از تاریخ داده‌شده.

  • MONTH: فهرست رویدادهای یک ماه خاص.

  • SEARCH: جست‌وجوی رویدادهایی که عنوان‌شان شامل کلیدواژه است.

  • CONFLICTS: نمایش تمام رویدادهایی که در تاریخ مشخص با یکدیگر هم‌پوشانی دارند.

راهنمای دستورات🔗

افزودن رویداد
ADD --date <date> --start <start_time> --end <end_time> --title <title>
Plain text

این دستور یک رویداد جدید را با مشخصات زیر به تقویم اضافه می‌کند:

  • <date>: تاریخ رویداد به فرمت yyyy-mm-dd

  • <start_time>: زمان شروع رویداد به فرمت hh:mm (۲۴ ساعته)

  • <end_time>: زمان پایان رویداد به فرمت hh:mm (۲۴ ساعته)

  • <title>: عنوان رویداد (حداکثر ۱۰۰ کاراکتر)

قوانین و شرایط:

  • زمان پایان باید لزوماً بعد از زمان شروع باشد. در غیر این صورت پیام خطای زیر چاپ شود:
    ERROR: end time should be after the start time 
    Plain text
  • در صورت موفقیت، پیام زیر در کنسول چاپ شود:
Created event at <date> <start_time>
Plain text
حذف رویداد
REMOVE --date <date> --start <start_time>
Plain text

این دستور رویدادی را که دقیقاً در تاریخ و ساعت مشخص‌شده شروع می‌شود، از تقویم حذف می‌کند.

  • <date>: تاریخ رویداد به فرمت yyyy-mm-dd

  • <start_time>: زمان شروع رویداد به فرمت hh:mm

قوانین و شرایط:

  • فقط اگر رویدادی دقیقا با این تاریخ و ساعت شروع وجود داشته باشد، حذف انجام می‌شود.

  • در صورت موفقیت:

Removed event at <date> <start_time>
Plain text
  • در صورت عدم وجود رویداد:
ERROR: no event found at <date> <start_time>
Plain text
ویرایش عنوان رویداد
EDIT --date <date> --start <start_time> --title <new_title>
Plain text

این دستور عنوان رویدادی را که در تاریخ و ساعت مشخص‌شده شروع می‌شود، به مقدار جدید تغییر می‌دهد.

  • <date>: تاریخ رویداد به فرمت yyyy-mm-dd

  • <start_time>: زمان شروع رویداد به فرمت hh:mm

  • <new_title>: عنوان جدید (حداکثر ۱۰۰ کاراکتر)

قوانین و شرایط:

  • فقط عنوان قابل تغییر است، زمان شروع یا پایان قابل تغییر نیست.

  • اگر رویداد یافت شود، ویرایش انجام می‌شود و خروجی زیر چاپ می‌شود:

Edited event at <date> <start_time>
Plain text
  • در صورت عدم وجود رویداد:
ERROR: no event found at <date> <start_time>
Plain text
نمایش برنامه روزانه
LIST --date <date>
Plain text

این دستور فهرست تمام رویدادهای ثبت‌شده در یک روز خاص را به ترتیب زمان شروع (رویدادهایی که زمان شروع زودتری دارند، بالاتر چاپ شوند)، نمایش می‌دهد.

  • <date>: تاریخ مورد نظر به فرمت yyyy-mm-dd

فرمت خروجی:

Day View: <date>
| <date> | <start_time>-<end_time> | <title> |
Plain text
  • اگر هیچ رویدادی در آن روز وجود نداشته باشد:
Day View: <date>
No events found.
Plain text
نمایش برنامه هفتگی
WEEK --date <date>
Plain text

این دستور فهرست تمام رویدادهای ۷ روز از تاریخ مشخص‌شده (شامل آن روز) را نمایش می‌دهد. مثلا اگر تاریخ ۷ نوامبر وارد شود، رویدادهای ۷ نوامبر تا ۱۳ نوامبر نمایش داده شوند.

  • <date>: تاریخ شروع بازه به فرمت yyyy-mm-dd

فرمت خروجی:

Week View (<start_date> to <end_date>):
| <date> | <start_time>-<end_time> | <title> |
Plain text
  • اگر هیچ رویدادی در بازه وجود نداشته باشد:
Week View (<start_date> to <end_date>):
No events found.
Plain text
نمایش برنامه ماهانه
MONTH --month <year-month>
Plain text

این دستور فهرست تمام رویدادهای ثبت‌شده در یک ماه مشخص را به ترتیب تاریخ و زمان نمایش می‌دهد.

  • <year-month>: ماه مورد نظر به فرمت yyyy-mm

فرمت خروجی:

Month View: <year-month>
| <date> | <start_time>-<end_time> | <title> |
Plain text
  • اگر هیچ رویدادی در آن ماه وجود نداشته باشد:
Month View: <year-month>
No events found.
Plain text
جست‌وجوی رویداد
SEARCH --keyword <keyword>
Plain text

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

  • <keyword>: کلیدواژه مورد نظر برای جست‌وجو

فرمت خروجی:

Search Results:
| <date> | <start_time>-<end_time> | <title> |
Plain text
  • اگر هیچ عنوانی شامل کلیدواژه نباشد:
Search Results:
No matching events found.
Plain text
بررسی تداخل زمانی رویدادها
CONFLICTS --date <date>
Plain text

این دستور تمام رویدادهایی که در تاریخ مشخص با یکدیگر هم‌پوشانی زمانی دارند را نمایش می‌دهد.

  • <date>: تاریخ مورد نظر به فرمت yyyy-mm-dd

قوانین:

  • تداخل زمانی یعنی دو یا چند رویداد در همان روز بازه‌های زمانی مشترک (حتی جزئی) دارند.

فرمت خروجی:

Conflict Detected:
| <date> | <start_time>-<end_time> | <title> |
Plain text
  • اگر هیچ تداخلی وجود نداشته باشد:
No conflicts found on <date>.
Plain text

نکات قابل توجه🔗

  • ورودی‌ها از طریق فلگ‌های مشخص شده وارد می‌شوند و ترتیب آن‌ها آزاد است و لزوماً به ترتیب ذکر شده در متن وارد نمی‌شوند.

  • در صورتی که هر یک از بخش‌های مسئله را به درستی پیاده‌سازی کردید، امتیاز آن را مستقل از سایر بخش‌ها خواهید گرفت. (البته دقت کنید در صورتی که دستور ADD شما به درستی کار نکند، امتیاز سایر بخش‌های برنامه را نخواهید گرفت.)

  • برای گرفتن امتیاز کامل، به کوچکی یا بزرگی حروف در خروجی دقت کنید.

  • تضمین می‌شود ساختار دستورات و فرمت تاریخ‌ها به درستی وارد خواهد شد. زمان‌ها در قالب ۲۴ ساعته hh:mm و تاریخ‌ها در قالب yyyy-mm-dd یا yyyy-mm هستند.

  • تعداد رویدادها حداکثر ۱۰,۰۰۰ عدد است.

  • عنوان رویداد حداکثر ۱۰۰ کاراکتر دارد.

  • خروجی رویدادها همیشه بر اساس زمان شروع به صورت صعودی مرتب باشد (ابتدا به ترتیب تاریخ، سپس بر اساس زمان شروع در هر روز مرتب شود). رویدادهای ورودی لزوماً به ترتیب زمانی صعودی وارد نمی‌شوند.

  • رعایت اصول و قوانین کد تمیز و شی‌گرایی حائز اهمیت می‌باشد.

ورودی🔗

سطر اول ورودی شامل یک عدد صحیح و مثبت nn است که تعداد دستورهای ورودی را نشان می‌دهد. 1n10001≤n≤1000 در nn سطر بعدی ورودی، هر سطر شامل یکی از دستورهای ذکر شده است.

خروجی🔗

خروجی‌های خواسته شده برای هر دستور را به ترتیب چاپ کنید.

ورودی نمونه ۱🔗

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
Plain text

خروجی نمونه ۱🔗

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 |
Plain text

توضیحات:🔗

  • دو رویداد اول (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
Plain text

خروجی نمونه ۲🔗

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 |
Plain text

توضیحات:🔗

  • سه رویداد اضافه شدند که تداخلی با هم ندارند.

  • دستور EDIT عنوان رویداد دوم را تغییر می‌دهد.

  • با دستور WEEK همه رویدادها بین تاریخ 2025-07-01 تا تاریخ 2025-07-07 به ترتیب زمان نمایش داده می‌شوند.

  • با دستور MONTH همه رویدادها مرتب به ترتیب زمان شروع نمایش داده می‌شوند.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.