# کارواش
در این بخش از مسابقه میخواهیم یک پروژه را مرحله به مرحله توسعه دهیم و در هر بخش آن ویژگیهای جدیدی اضافه کنیم. دقت داشته باشید که در این قسمت تمرکز بر روی طراحی، نحوهی پیادهسازی و خوانایی کد شماست. در انتهای هر مرحله تمامی کدهای خود را در قالب یک فایل zip آپلود کنید (هر بخش نمرهی خود را دارد). در انتخاب زبان برنامه نویسی و ساختاربندی فایلها کاملا آزادانه میتوانید عمل کنید.
## صورت سوال
میخواهیم برنامهای برای زمانبندی خدمات یک کارواش بنویسیم. ساعت کاری این کارواش از ۹ صبح تا ۹ شب است.
این کارواش خدمات زیر را ارائه میکند:
1. روشویی (شستشوی بدنهٔ خودرو)
2. نظافت داخل (جاروکشی داخل خودرو)
3. صفرشویی
قصد داریم در سه بخش برنامه را گسترش دهیم:
+ رزرو نوبتها در طول یک ماه
+ اضافه کردن چند صف شستوشو و صدور فاکتور
+ معرفی کردن مشتریان VIP
در این بخش، میخواهیم برنامهای بنویسیم که بهصورت تعاملی (interactive) درخواست نوبتدهی کاربران را در بازهی زمانی یک ماهه بگیرد و زمانی به آنها اختصاص دهد. اولین دستور را ۹ صبح اولین روز ماه در نظر بگیرید (ماهها ۳۰ روز هستند).
زمان مورد نیاز برای ارائهٔ خدمتهای کارواش به شرح زیر است:
1. روشویی (`rooshooyi`): ۱۵ دقیقه
2. نظافت داخل (`nezafat`): ۲۰ دقیقه
3. صفرشویی (`sefrshooyi`): ۱ ساعت
دو نوع رزرو در این کارواش ممکن است:
+ رزرو earliest: که اولین بازه زمانی ممکن را به کاربر اختصاص میدهد.
+ رزرو با مشخصکردن روز و ساعت: که در صورت خالیبودن بازه مورد نیاز، زمان را اختصاص میدهد و در غیر این صورت خطا گزارش میدهد.
## فرمت ورودی خروجی
فرمت ورودی
```
reserve earliest <list-of-services>
```
توجه فرمایید منظور از `<list-of-services>` لیستی از سرویسهاست که با `+` از هم جدا میشود؛ مثلا `nezafat+sefrshooyi`. در یک دستور سرویس تکراری درخواست نخواهد شد.
فرمت خروجی
```
reserved (<day-number> <time>)
```
فرمت ورودی
```
reserve <day-number> <time> <list-of-services>
```
فرمت خروجی
```
reserved (<day-number> <time>)
```
## ورودی/خروجی نمونه برنامه
ورودی نمونه
```
reserve earliest rooshooyi
```
خروجی نمونه
```
reserved (1 18:00)
```
ورودی نمونه
```
reserve 2 19:00 rooshooyi
```
خروجی نمونه
```
reserved (2 19:00)
```
ورودی نمونه
```
reserve 2 19:00 rooshooyi+nezafat
```
خروجی نمونه
```
cannot be reserved
```
ويژگيهای جدیدی که در این مرحله برای کارواش میخواهیم:
+ برای شستوشو ده جایگاه مجزا خواهیم داشت که هنگام رزرو، ماشینها به اولین جایگاه ممکن وارد میشوند.
+ میخواهیم هنگام رزرو وقت، برای مشتری فاکتور صادر کنیم. جدول هزینههای امسال به شکل زیر است:
|نوع خودرو|روشویی `rooshooyi`|نظافت `nezafat`|صفرشویی `sefrshooyi`|
| ------- | ---------------- | ------------- | ------------------ |
| sedan | 30T | 15T | 80T |
| hatchback | 30T | 10T | 70T |
| suv | 40T | 20T | 100T |
## فرمت ورودی خروجی
فرمت ورودی
```
reserve earliest <car-type> <list-of-services>
```
فرمت خروجی
```
reserved (<day-number> <time>)
Line: <line-number>
Car Type: <car-type>
Services:
- <service> (<cost>)
Total Cost: <total-cost>
```
فرمت ورودی
```
reserve <day-number> <time> <car-type> <list-of-services>
```
فرمت خروجی
```
reserved (<day-number> <time>)
Line: <line-number>
Car Type: <car-type>
Services:
- <service> (<cost>)
Total Cost: <total-cost>
```
## ورودی/خروجی نمونه برنامه
ورودی نمونه
```
reserve earliest sedan sefrshooyi
```
خروجی نمونه
```
reserved (2 18:00)
Line: 05
Car Type: sedan
Services:
- sefrshooyi (80T)
Total Cost: 80T
```
ورودی نمونه
```
reserve 7 18:00 suv rooshooyi+nezafat
```
خروجی نمونه
```
reserved (7 18:00)
Line: 05
Car Type: suv
Services:
- rooshooyi (40T)
- nezafat (20T)
Total Cost: 60T
```
بهمنظور توجه بیشتر به مشتریان برتر، برخی از کاربران را VIP لحاظ میکنیم. اگر یک مشتری بیشتر از ۴ بار از خدمات کارواش استفاده کند، بهصورت خودکار در ردهٔ VIP قرار میگیرد.
مشتریان VIP، یک بخش جداگانه با ۵ جایگاه شستوشو دارند (که برای نوبتدهی به کاربران عادی استفاده نمیشوند). شمارهی این جایگاهها از ۱۱ تا ۱۵ است. هنگام نوبتدهی به این مشتریان تا جای ممکن از این جایگاهها استفاده میشود؛ مگر اینکه
+ در رزرو earliest، جایگاههای عادی برای زمان نزدیکتری قابل رزرو بودند.
+ در رزرو با روز و ساعت مشخص، هیچ جایگاه VIP، خالی نباشد.
بدین منظور یک دستور اضافه هم نیاز خواهیم داشت که لیست مشتریان VIP را اعلام کند.
## فرمت ورودی خروجی
فرمت ورودی
```
reserve earliest <car-type> <list-of-services> user#<user-id>
```
توجه فرمایید که `<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>
```
فرمت ورودی
```
reserve <day-number> <time> <car-type> <list-of-services> user#<user-id>
```
فرمت خروجی
```
reserved (<day-number> <time>)
Line: <line-number>
Car Type: <car-type>
User: <user-id>
Services:
- <service> (<cost>)
Total Cost: <total-cost>
```
فرمت ورودی
```
vip-list
```
فرمت خروجی
```
user#<user-id> user#<user-id> user#<user-id> …
```
## ورودی/خروجی نمونه برنامه
ورودی نمونه
```
reserve earliest sedan rooshooyi user#007
```
خروجی نمونه
```
reserved (7 18:00)
Line: 05
Car Type: Sedan
User: 007
Services:
- rooshooyi (30T)
Total Cost: 30T
```
ورودی نمونه
```
reserve earliest suv rooshooyi+nezafat user#025
```
خروجی نمونه
```
reserved (6 18:00)
Line: 05
Car Type: suv
User: 025
Services:
- rooshooyi (40T)
- nezafat (20T)
Total Cost: 60T
```
ورودی نمونه
```
vip-list
```
خروجی نمونه
*با این فرض که هر کدام از این کاربران، در ردهی VIP قرار گرفتهاند.*
```
user#008 user#143 user#167
```