توضیحات


کارواش🔗

در این بخش از مسابقه می‌خواهیم یک پروژه را مرحله به مرحله توسعه دهیم و در هر بخش آن ویژگی‌های جدیدی اضافه کنیم. دقت داشته باشید که در این قسمت تمرکز بر روی طراحی، نحوه‌ی پیاده‌سازی و خوانایی کد شماست. در انتهای هر مرحله تمامی کدهای خود را در قالب یک فایل zip آپلود کنید (هر بخش نمره‌‌ی خود را دارد). در انتخاب زبان برنامه نویسی و ساختاربندی فایل‌ها کاملا آزادانه می‌توانید عمل کنید.

صورت سوال🔗

می‌خواهیم برنامه‌ای برای زمان‌بندی خدمات یک کارواش بنویسیم. ساعت کاری این کارواش از ۹ صبح تا ۹ شب است.

این کارواش خدمات زیر را ارائه می‌کند:

  1. روشویی (شستشوی بدنهٔ خودرو)
  2. نظافت داخل (جاروکشی داخل خودرو)
  3. صفرشویی

قصد داریم در سه بخش برنامه را گسترش دهیم:

  • رزرو نوبت‌ها در طول یک ماه
  • اضافه کردن چند صف شست‌و‌شو و صدور فاکتور
  • معرفی کردن مشتریان VIP

بخش اول: نوبت دهی


در این بخش، می‌خواهیم برنامه‌ای بنویسیم که به‌صورت تعاملی (interactive) درخواست نوبت‌دهی کاربران را در بازه‌ی زمانی یک ماهه بگیرد و زمانی به آن‌ها اختصاص دهد. اولین دستور را ۹ صبح اولین روز ماه در نظر بگیرید (ماه‌ها ۳۰ روز هستند).

زمان مورد نیاز برای ارائهٔ خدمت‌های کارواش به شرح زیر است:

  1. روشویی (rooshooyi): ۱۵ دقیقه
  2. نظافت داخل (nezafat): ۲۰ دقیقه
  3. صفرشویی (sefrshooyi): ۱ ساعت

دو نوع رزرو در این کارواش ممکن است:

  • رزرو earliest: که اولین بازه زمانی ممکن را به کاربر اختصاص می‌دهد.
  • رزرو با مشخص‌کردن روز و ساعت: که در صورت خالی‌بودن بازه مورد نیاز، زمان را اختصاص می‌دهد و در غیر این صورت خطا گزارش می‌دهد.

فرمت ورودی خروجی🔗

فرمت ورودی

reserve earliest <list-of-services>
Plain text

توجه فرمایید منظور از <list-of-services> لیستی از سرویس‌هاست که با + از هم جدا می‌شود؛ مثلا nezafat+sefrshooyi. در یک دستور سرویس تکراری درخواست نخواهد شد.

فرمت خروجی

reserved (<day-number> <time>)
Plain text

فرمت ورودی

reserve <day-number> <time> <list-of-services>
Plain text

فرمت خروجی

reserved (<day-number> <time>)
Plain text

ورودی/خروجی نمونه برنامه🔗

ورودی نمونه

reserve earliest rooshooyi
Plain text

خروجی نمونه

reserved (1 18:00)
Plain text

ورودی نمونه

reserve 2 19:00 rooshooyi
Plain text

خروجی نمونه

reserved (2 19:00)
Plain text

ورودی نمونه

reserve 2 19:00 rooshooyi+nezafat
Plain text

خروجی نمونه

cannot be reserved
Plain text

بخش دوم: صدور فاکتور


ويژگي‌های جدیدی که در این مرحله برای کارواش می‌خواهیم:

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

  • می‌خواهیم هنگام رزرو وقت، برای مشتری فاکتور صادر کنیم. جدول هزینه‌های امسال به شکل زیر است:

نوع خودرو روشویی rooshooyi نظافت nezafat صفرشویی sefrshooyi
sedan 30T 15T 80T
hatchback 30T 10T 70T
suv 40T 20T 100T

فرمت ورودی خروجی🔗

فرمت ورودی

reserve earliest <car-type> <list-of-services>
Plain text

فرمت خروجی

reserved (<day-number> <time>)
Line: <line-number>
Car Type: <car-type>
Services:
- <service> (<cost>)
Total Cost: <total-cost>
Plain text

فرمت ورودی

reserve <day-number> <time> <car-type> <list-of-services>
Plain text

فرمت خروجی

reserved (<day-number> <time>)
Line: <line-number>
Car Type: <car-type>
Services:
- <service> (<cost>)
Total Cost: <total-cost>
Plain text

ورودی/خروجی نمونه برنامه🔗

ورودی نمونه

reserve earliest sedan sefrshooyi
Plain text

خروجی نمونه

reserved (2 18:00)
Line: 05
Car Type: sedan
Services:
- sefrshooyi (80T)
Total Cost: 80T
Plain text

ورودی نمونه

reserve 7 18:00 suv rooshooyi+nezafat
Plain text

خروجی نمونه

reserved (7 18:00)
Line: 05
Car Type: suv
Services:
- rooshooyi (40T)
- nezafat (20T)
Total Cost: 60T
Plain text

بخش سوم: مشتری‌های VIP


به‌منظور توجه بیشتر به مشتریان برتر،‌ برخی از کاربران را VIP لحاظ می‌کنیم. اگر یک مشتری بیشتر از ۴ بار از خدمات کارواش استفاده کند، به‌صورت خودکار در ردهٔ VIP قرار می‌گیرد.

مشتریان VIP، یک بخش جداگانه با ۵ جایگاه شست‌وشو دارند (که برای نوبت‌دهی به کاربران عادی استفاده نمی‌شوند). شماره‌ی این جایگاه‌ها از ۱۱ تا ۱۵ است. هنگام نوبت‌دهی به این مشتریان تا جای ممکن از این جایگاه‌ها استفاده می‌شود؛ مگر اینکه

  • در رزرو earliest، جایگاه‌های عادی برای زمان نزدیک‌تری قابل رزرو بودند.

  • در رزرو با روز و ساعت مشخص، هیچ جایگاه VIP، خالی نباشد.

بدین منظور یک دستور اضافه هم نیاز خواهیم داشت که لیست مشتریان VIP را اعلام کند.

فرمت ورودی خروجی🔗

فرمت ورودی

reserve earliest <car-type> <list-of-services> user#<user-id>
Plain text

توجه فرمایید که <user-id> به شکل یک عدد سه رقمی از 000 تا 999 گزارش می‌شود.

فرمت خروجی

reserved (<day-number> <time>)
Line: <line-number>
Car Type: <car-type>
User: <user-id>
Services:
- <service> (<cost>)
Total Cost: <total-cost>
Plain text

فرمت ورودی

reserve <day-number> <time> <car-type> <list-of-services> user#<user-id>
Plain text

فرمت خروجی

reserved (<day-number> <time>)
Line: <line-number>
Car Type: <car-type>
User: <user-id>
Services:
- <service> (<cost>)
Total Cost: <total-cost>
Plain text

فرمت ورودی

vip-list
Plain text

فرمت خروجی

user#<user-id> user#<user-id> user#<user-id> …
Plain text

ورودی/خروجی نمونه برنامه🔗

ورودی نمونه

reserve earliest sedan rooshooyi user#007
Plain text

خروجی نمونه

reserved (7 18:00)
Line: 05
Car Type: Sedan
User: 007
Services:
- rooshooyi (30T)
Total Cost: 30T
Plain text

ورودی نمونه

reserve earliest suv rooshooyi+nezafat user#025
Plain text

خروجی نمونه

reserved (6 18:00)
Line: 05
Car Type: suv
User: 025
Services:
- rooshooyi (40T)
- nezafat (20T)
Total Cost: 60T
Plain text

ورودی نمونه

vip-list
Plain text

خروجی نمونه

با این فرض که هر کدام از این کاربران، در رده‌ی VIP قرار گرفته‌اند.

user#008 user#143 user#167
Plain text