+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
در ورودی دو رشته داده میشود و از شما خواسته شده است تا بررسی کنید این دو رشته در کنار هم زیبا هستند یا نه.
دو رشته در کنار هم زیبا هستند، اگر حرف اول رشتهی اولی، با حرف آخر رشتهی دومی برابر باشد.
# ورودی
ورودی شامل دو خط است که در هر خط یک رشته شامل حروف کوچک انگلیسی به طول حداکثر ۵۰ آمده است.
# خروجی
در صورتی که دو رشتهی داده در کنار هم زیبا هستند عبارت `YES` و در غیر این صورت عبارت `NO` را چاپ کنید.
## ورودی نمونه ۱
```
salam
khodafes
```
## خروجی نمونه ۱
```
YES
```
از آنجا که حرف اول رشتهی `salam` برابر با حرف آخر رشتهی `khodafes` ، یعنی `s` است، پس این دو رشته در کنار هم زیبا هستند و باید عبارت `YES` را چاپ کرد.
## ورودی نمونه ۲
```
salam
salam
```
## خروجی نمونه ۲
```
NO
```
از آنجا که حرف اول رشتهی `salam`، یعنی `s` برابر با حرف آخر رشتهی `salam` ، یعنی `m` نیست، پس این دو رشته در کنار هم زیبا نیستند و باید عبارت `NO` را چاپ کرد.
## ورودی نمونه ۳
```
snapp
box
```
## خروجی نمونه ۳
```
NO
```
از آنجا که حرف اول رشتهی `snapp`، یعنی `s` برابر با حرف آخر رشتهی `box` ، یعنی `x` نیست، پس این دو رشته در کنار هم زیبا نیستند و باید عبارت `NO` را چاپ کرد.
## ورودی نمونه ۴
```
software
engineers
```
## خروجی نمونه ۴
```
YES
```
از آنجا که حرف اول رشتهی `software` برابر با حرف آخر رشتهی `engineers` ، یعنی `s` است، پس این دو رشته در کنار هم زیبا هستند و باید عبارت `YES` را چاپ کرد.
رشته چکر
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
ممد و احمد به دنبال راهی برای انتقال پیامی بسیار مهم هستند، پیامی که قرار است بین آن دو جابهجا شود به صورت یک رشتهی $n$ حرفی از حروف کوچک انگلیسی است و به علت اهمیت ماجرا تصمیم دارند این رشته را رمزگزاری کنند.
روش رمزگزاریای که این دو انتخاب کردند به این صورت است که ابتدا حرف آخر رشته را به اول رشته جابهجا میکنند و سپس تمامی حروف رشته را به حرف بعدی آن در الفبا تبدیل میکنند. (به عنوان مثال حرف `c` به `d` تبدیل میشود) **همچنین حرف بعدی `z` در الفبا را `a` در نظر میگیریم.** ممد که میگوید کار از محکم کاری عیب نمیکند، برای قویتر کردن رمزگزاری پیشنهاد کرده که این عملیات $k$ بار بر روی رشته انجام شود. آن دو که آرام و قرار ندارند از شما خواستهاند تا رشتهی نهایی را بدست آورید.
توجه کنید در هر مرحله از $k$ بار عملیات، هر دوی «انتقال حرف از آخر به اول» و «تبدیل هر حرف به حرف بعدی» انجام میشود.
# ورودی
در خط اول ورودی $n$ آمده که نشان دهندهی طول پیام است.
در خط دوم ورودی $k$ آمده که نشان دهندهی تعداد باری است که عملیات رمزگزاری باید صورت گیرد.
در خط سوم ورودی رشتهی مورد نظر آمده، تضمین میشود تمام حروف آن از حروف کوچک انگلیسی است.
$$1 \le n, k \le 100$$
# خروجی
در تنها خط خروجی رشتهی مورد نظر را پس از $k$ بار رمزگزاری خروجی دهید.
# مثال
## ورودی نمونه ۱
```
3
1
abz
```
## خروجی نمونه ۱
```
abc
```
یک مرحله رمز گزاری به صورت زیر انجام میشود:
+ ابتدا حرف آخر رشته به اول آن میرود در نتیجه `abz` به `zab` تبدیل میشود.
+ سپس تمامی حروف رشته با حرف بعدی الفباییشان جابهجا میشوند در نتیجه `zab` به `abc` تبدیل میشود.
## ورودی نمونه ۲
```
4
5
abcd
```
## خروجی نمونه ۲
```
ifgh
```
۲ عملیات اول روی رشتهی `abcd` به صورت زیر خواهد بود:
+ عملیات اول:
+ ابتدا حرف آخر رشته (حرف `d` ) به اول رشته منتقل میشود و به رشتهی `dabc` خواهیم رسید.
+ سپس تمامی حروف به حرف بعدی الفبا منتقل میشوند به رشتهی `ebcd` خواهیم رسید.
+ عملیات دوم:
+ ابتدا حرف آخر رشته (حرف `d` ) به اول رشته منتقل میشود و به رشتهی `debc` خواهیم رسید.
+ سپس تمامی حروف به حرف بعدی الفبا منتقل میشوند به رشتهی `efcd` خواهیم رسید.
۳ عملیات باقیمانده به طور مشابه صورت میگیرند و در انتها به رشتهی `ifgh` خواهیم رسید.
رشتهی رمزی
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
جدولی $n \times m$ داریم که هر خانهی آن یک شهر است، میخواهیم از خانهی $(1,1)$ در جدول شروع کنیم و هر مرحله با توجه به علائم به شهرهای دیگر برویم. علائم به صورت عدد روی هر شهر نوشته شده که هر عدد معنای خاص خود را دارد. به طور دقیقتر اگر اکنون در شهر خانهی $(x, y)$ باشیم (که در آن $x$ شمارهی سطر و $y$ شمارهی ستون است) و عدد نوشته شده روی این شهر $a_{x, y}$ باشید حالات زیر را داریم:
+ اگر عدد نوشته شده بر روی شهر، عددی اول بود آنگاه به شهر قرینهی آن نسبت به مرکز جدول میرویم. (توجه کنید مرکز جدول لزوما از عناصر جدول نیست، به عنوان مثال در جدول ۲ در ۲ نقطهی مرکزی جدول با هیچ یک از عناصر آن برابر نیست. برای درک بهتر به توضیحات مثال توجه کنید)
+ اگر عدد نوشته شده اول نبود بر اساس باقیماندهی آن نسبت به ۴ عمل میکنیم.
+ اگر باقیمانده صفر بود به خانهی راست $(x, y)$ در جدول میٰرویم. **اگر خانهی راستی وجود نداشت** به خانهی $(x, 1)$ میرویم.
+ اگر باقیمانده یک بود به خانهی پایین $(x, y)$ در جدول میٰرویم. **اگر خانهی پایینی وجود نداشت** به خانهی $(1 ,y)$ میرویم.
+ اگر باقیمانده دو بود به خانهی چپ $(x, y)$ در جدول میٰرویم. **اگر خانهی چپی وجود نداشت** به خانهی $(x, m)$ میرویم.
+ اگر باقیمانده سه بود به خانهی بالای $(x, y)$ در جدول میٰرویم. **اگر خانهی بالایی وجود نداشت** به خانهی $(n, y)$ میرویم.
حال تشخیص دهید بعد از $k$ مرحله دنبال کردن علائم به کدام شهر میرسیم.
# ورودی
در خط اول ورودی $n,m,k$ آمده که به ترتیب نشان دهندهی تعداد سطرها، ستونها و تعداد مراحلی است که باید علائم را دنبال کرد.
$$1 \le n,m \le 100$$
$$1 \le k \le 1\ 000$$
سپس در هر خط از $n$ خط بعدی $m$ عدد آمده که نشان دهندهی اعداد نوشته شده بر روی خانههای جدول (شهرها) است. به طور دقیقتر $j$امین عدد در سطر $i$ام برابر $a_{i,j}$ است که عدد نوشته شده روی شهر $(i, j)$ میباشد.
$$1 \le a_{i,j} \le 10^6$$
# خروجی
در تنها خط خروجی به ترتیب شمارهی سطر و ستون خانهی نهایی را چاپ کنید.
# زیرمسئلهها
| زیرمسئله | نمره | محدودیتها |
|:--------:|:----:|:---------:|
| ۱ | ۶۰ | عدد هیچ یک از خانههای جدول اول نیست. |
| ۲ | ۱۴۰ | بدون محدودیت |
توجه کنید که نمره سوال از ۲۰۰ نمره است.
# مثال
## ورودی نمونه ۱
```
3 3 4
4 9 4
6 9 6
1 1 1
```
## خروجی نمونه ۱
```
1 2
```
## ورودی نمونه ۲
```
3 4 4
6 11 9 7
8 3 21 6
6 1 4 15
```
## خروجی نمونه ۲
```
2 4
```
ابتدا در خانهی $(1,1)$ شروع میکنیم از آنجایی که $a_{1,1}$ برابر با ۶ است و خانهی چپی وجود ندارد باید به $(1,4)$ برویم. حال چون $a_{1,4}$ عددی اول و برابر با ۷ است به خانهی قرینهی آن نسبت به وسط جدول یعنی $(3,1)$ میرویم. سپس با توجه به $a_{3,1}$ چون خانهی چپی وجود ندارد به $(3,4)$ میرویم و در آخر (مرحلهی چهارم) باید به خانهی بالایی یعنی $(2,4)$ برویم.
## ورودی نمونه ۳
```
3 2 8
2 3
9 8
10 10
```
## خروجی نمونه ۳
```
3 1
```
با شروع از خانهی $(1,1)$ به قرینهی آن نسبت به وسط جدول میرویم و به $(3,2)$ میرسیم، در ۷ مرحلهی بعد بین خانههای $(3,2)$ و $(3,1)$ جابهجا میشویم و با دنبال کردن این حرکات به خانهی $(3,1)$ خواهیم رسید.
بسته در جدول
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
زبان برنامهنویسی _Bython_ که به تازگی عرضه شده است، فقط دستورات زیر را دارد:
| نام دستور | فرم کلی دستور | توضیح دستور |
|:---------:|:-------------:|:-----------:|
| _Assignment_ | A = _expression_ | مقدار _expression_ را در متغیر A ذخیره میکند. |
| _Input_ | _()voroodi_ | یک عدد از ورودی میخواند و آن را بر میگرداند. |
| _Print_ | _khoorooji(List)_ | مقادیر موجود در _List_ را به ترتیب چاپ میکند. |
| _If Statement_ | _agar condition_ : A = _expression_ | در صورتی برقراری _condition_ ، مقدار _expression_ در متغیر A ذخیره میشود. |
که در جدول بالا مقادیر _condition_ ، _List_ ، _expression_ و متغیر به این صورت تعریف میشوند:
* تعریف __expression__:
* هر عدد ثابتی یک _expression_ است. برای مثال اعداد ۲ و ۵، خود یک _expression_ هستند.
* مقدار _()voroodi_ به تنهایی یک _expression_ است.
* هر عبارتی به شکل $A + B$ و یا $A - B$ که در آن، $A$ و $B$ میتوانند متغیر و یا عدد ثابت باشند، یک _expression_ است. برای مثال عبارتهای $A + D$ و همچنین $VAR + 5$ که در آن $A$، $D$ و $VAR$ متغیر هستند، یک _expression_ اند.
* **باقی عبارات _expression_ نیستند.** برای مثال مقادیر $A + B + C$ و یا $A \times B$ یک _expression_ نیستند.
* تعریف __List__:
* عبارت $A$ که در آن $A$ متغیر و یا عدد ثابت است، یک لیست است.
* اگر $A$ و $B$ دو _List_ باشند، عبارت $A, B$ نیز یک _List_ است.
* برای مثال اگر $A$ و $B$ و $D$ متغیر باشند، عبارات $3$ و $A$ و $A, 7$ و همچنین $1, D, B$ یک _List_ هستند.
* تعریف __condition__:
* عبارت $A == B$ که در آن $A$ و $B$ متغیر و یا عدد ثابت هستند یک _condition_ است.
* در صورتی که مقادیر $A$ و $B$ برابر باشند، _condition_ برقرار است و در غیر این صورت _condition_ برقرار نیست.
* برای مثال $3 == 3$ یک _condition_ است که برقرار است و عبارت $A == 5$ که در آن مقدار $A$ هنگام اجرا ۶ است، یک _condition_ است که برقرار نیست.
* تعریف __متغیر__:
* هر رشتهای از ترکیب اعداد ۰ تا ۹ و همچنین حروف کوچک و بزرگ الفبای انگلیسی به طول حداکثر ۱۰ که با عدد شروع **نشود**، یک متغیر است.
* برای مثال عبارات $A$، $VAR2$ و $ABC123de$ یک متغیراند در صورتی که عبارات $VAR\_3$، $3VAR$ و $VARIABLE123$ متغیر نیستند.
حال به شما دنبالهای از دستورات زبان _Bython_ و همچنین دنبالهای از مقادیر ورودی داده شده است و از شما خواسته شده است تا خروجی را گزارش کنید. و پس از آن، تعداد متغیرهایی که **حداقل یک بار** مقداردهی شدهاند را نیز چاپ کنید.
# ورودی
ورودی شامل دو بخش است که در بخش اول دستورات برنامه در چند خط آمده است و پس از آن در یک خط رشتهی `-----` آمده است سپس ورودیهای برنامه، هر کدام در یک خط آمده است.
**تعداد خطهای دستورات از ۵۰ بیشتر نخواهد بود.**
**تضمین میشوند تعداد ورودیهای برنامه برابر با تعداد دستورهای _Input_ است و همچنین هر متغیر قبل از استفاده مقداردهی میشود.**
**تمام اعداد داده شده در دستورات، اعداد طبیعی و مثبت خواهند بود، اما ممکن است در هنگام اجرای دستورات، مقدار متغیری منفی شود.**
# خروجی
در خروجی، به ازای هر دستور _Print_ خروجی آن را در یک خط چاپ کنید. سپس در یک خط، تعداد متغیرهایی که حداقل یکبار مقداردهی شدهاند را خروجی دهید.
**تضمین میشود حداقل یک دستور _Print_ در دستورات برنامه وجود دارد.**
# زیرمسئلهها
| زیرمسئله | نمره | محدودیتها |
|:--------:|:----:|:---------:|
| ۱ | ۲۵ | فقط دستور Assignment و Print موجود است و در دستور Print تنها یک ورودی داریم. |
| ۲ | ۷۵ | دستور If Statement نداریم. |
| ۳ | ۱۵۰ | بدون محدودیت |
توجه کنید نمره سوال از ۲۵۰ نمره است.
## ورودی نمونه ۱
```
A = 3
B = voroodi()
C = A + B
khoorooji(10)
khoorooji(C, 2)
-----
3
```
## خروجی نمونه ۱
```
10
6 2
3
```
مقدار متغیر $C$ پس از اجرای دستورات برابر ۶ خواهد بود و تعداد متغیرهایی که حداقل یکبار مقداردهی شدهاند برابر با ۳ است. (متغیرهای $A$ و $B$ و $C$)
## ورودی نمونه ۲
```
A = voroodi()
agar A == 2 : A = A + 2
khoorooji(A)
-----
2
```
## خروجی نمونه ۲
```
4
1
```
مقدار متغیر $A$ پس از اجرای دستورات برابر ۴ خواهد بود و تعداد متغیرهایی که حداقل یکبار مقداردهی شدهاند برابر با ۱ است. (متغیر $A$)
## ورودی نمونه ۳
```
agar 2 == 2 : A = 3
agar 3 == 4 : B = 1
khoorooji(A)
-----
```
## خروجی نمونه ۳
```
3
1
```
مقدار متغیر $A$ پس از اجرای دستورات برابر ۳ خواهد بود و تعداد متغیرهایی که حداقل یکبار مقداردهی شدهاند برابر با ۱ است. (متغیر $A$)
بایتون
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
میخواهیم سیستم سفارش گرفتن و تخصیص رانندهها به سفارشها را برای اسنپ باکس شبیه سازی کنیم.
در ابتدا هیچ راننده و یا سفارشی نداریم. در هر مرحله یا یک راننده به سیستم اضافه میشود یا یک سفارش در سیستم ثبت میشود یا یک راننده درخواست میکند که یک سفارش به او تخصیص شود.
هر راننده بعد از تخصیص یک سفارش مرحله به مرحله گزارش میدهد که فرآیند ارسال این سفارش از فرستنده به گیرنده در کدام مرحله قرار دارد.
از شما میخواهیم با دریافت این اطلاعات این سامانه را شبیه سازی کنید. همچنین سیستم شبیه ساز شما باید قابلیت پاسخ دادن به درخواستهایی که در پایین تر تعریف کردیم را داشته باشد.
<details class="green">
<summary>
**راننده**
</summary>
راننده (`DRIVER`) سفارش را از فرستنده تحویل گرفته و به گیرنده تحویل میدهد.
برای هر راننده ویژگیهای زیر تعریف میشود:
### نام (`USERNAME`):
یک رشته که فقط شامل حروف کوچک و بزرگ انگلیسی و ارقام است و حداکثر شامل ۲۵ کاراکتر میشود.
### نوع وسیله (`SERVICE-CATEGORY`):
وسیلهی نقلیه راننده را نشان میدهد و مقدار آن همواره یکی از موارد زیر است.
+ موتور (`BIKE`)
+ وانت (`VAN`)
+ کامیون (`TRUCK`)
### میزان اعتبار (`CREDIT`):
یک عدد حسابی است که مقدار پولی که راننده در حساب اسنپ خود دارد را نشان میدهد. میزان سرمایه اولیه هر راننده به صورت پیشفرض برابر صفر است. میزان اعتبار هر راننده بعد از تحویل یک سفارش (یعنی زمانی که وضعیت سفارش به `DELIVERED` تغییر کند.) به اندازه $80$% هزینه سفارش افزایش پیدا میکند.
### موقعیت مکانی (`POSITION`):
موقعیت مکانی هر راننده به صورت یک زوج مرتب $(x, y)$ است که $x$ و $y$ دو عدد صحیح هستند. برای نمایش و دریافت یک `POSITION` ابتدا یک `(` سپس عدد $x$ بلافاصله `,` سپس با یک فاصله عدد $y$ و بلافاصله `)` نمایش داده میشود.
به طور مثال موقعیت مکانی یک راننده میتواند به صورت `(57, 31)` یا `(0, -74)` باشد اما `(0 , -74)` یا `( 57 31)` نمایش قابل قبولی نیست.
### وضعیت (`STATUS`):
بطور کلی راننده دارای دو وضعیت زیر است:
+ آزاد (`FREE`)
+ مشغول (`BUSY`)
اگر یک راننده در حال انجام دادن یک سفارش باشد یعنی در حال رفتن به سمت فرستنده برای دریافت محموله (به عبارت دیگر محموله تخصیص یافته به آن در حالت `ARRIVED` باشد.) یا در حال رفتن به سمت گیرنده برای تحویل محموله (به عبارت دیگر سفارش تخصیصیافته به آن در حالت `PICKUP` باشد.) باشد؛ راننده در وضعیت `BUSY` و اگر هیچ سفارشی به این راننده تخصیص نشده یا همه سفارشهایی که به او تخصیص شده را تحویل داده است (یعنی وضعیت سفارشهای تخصیصیافته `DELIVERED` باشد.) وضعیت راننده `FREE` است.
</details>
<details class="green">
<summary>
**سفارش**
</summary>
برای هر سفارش (`ORDER`) ویژگیهای زیر قابل تعریف است:
### نوع وسیله (`SERVICE-CATEGORY`):
وسیلهی مورد نیاز برای جابهجایی این سفارش را نشان میدهد و مقدار آن همواره یکی از موارد زیر است.
+ موتور (`BIKE`)
+ وانت (`VAN`)
+ کامیون (`TRUCK`)
### موقعیت مکانی فرستنده (`STARTING-POSITION`):
موقعیت مکانی فرستنده به صورت یک زوج مرتب $(x, y)$ است که $x$ و $y$ دو عدد صحیح هستند. نمایش و دریافت موقعیت مکانی فرستنده مشابه موقعیت مکانی راننده است.
### موقعیت مکانی گیرنده: (`FINISHING-POSITION`):
موقعیت مکانی گیرنده به صورت یک زوج مرتب $(x, y)$ است که $x$ و $y$ دو عدد صحیح هستند. نمایش و دریافت موقعیت گیرنده مشابه موقعیت مکانی راننده است.
### هزینه (`COST`):
هزینه هر سفارش با توجه به فرمول زیر محاسبه میشود:
فرض کنید $(x, y)$ موقعیت مکانی فرستنده و $(x', y')$ موقعیت مکانی گیرنده باشد. اگر تعداد سفارشهایی که هم اکنون منتظر راننده **با همین نوع وسیله** هستند (یعنی وضعیت آنها `PENDING` است.) **شامل همین سفارش**، برابر $k$ باشد این هزینه برابر است با:
$$cost = (k + |x - x'| + |y - y'|) \times 100 $$
توجه کنید بعد تحویل هر سفارش $80$% هزینه به اعتبار (`CREDIT`) راننده اضافه میشود و $20$% باقی مانده به حساب اسنپ باکس اضافه میشود. (با توجه به رابطه بالا این دو عدد همواره عدد صحیح خواهند بود.)
### شماره سفارش (`ORDER-ID`):
شماره یک سفارش $n$ است اگر $n$امین سفارشی باشد که با موفقیت در سیستم ثبت شده باشد.
### وضعیت (`STATUS`):
وضعیت هر سفارش چهار حالت دارد:
+ `PENDING`: هنوز رانندهای به این سفارش تخصیص داده نشده است.
+ `ARRIVED`: یک راننده به این سفارش تخصیص داده شده و به سمت فرستنده این سفارش در حال حرکت است.
+ `PICKUP`: راننده این سفارش را از فرستنده تحویل گرفته و در حال حرکت به سمت گیرنده است.
+ `DELIVERED`: سفارش با موفقیت به گیرنده تحویل داده شده است.
</details>
منظور از فاصله بین دو نقطه $(x, y)$ و $(x', y')$ در این سوال برابر است با:
$$|x - x'| + |y - y'|$$
از شما میخواهیم درخواستهای زیر را برای این سامانه پیاده سازی کنید:
<details class="blue">
<summary>
**درخواست** `ADD-DRIVER`
</summary>
این درخواست به معنی اضافه شدن یک راننده (`DRIVER`) به سیستم است.
```
ADD-DRIVER <DRIVER-USERNAME> <POSITION> <SERVICE-CATEGORY>
```
به جای `<DRIVER-USERNAME>` یک رشته که نشان دهنده نام راننده، به جای `<POSITION>` موقعیت مکانی فعلی راننده که یک زوج مرتب از اعداد صحیح است و به جای `<SERVICE-CATEGORY>` نوع وسیله راننده که یک رشته برابر `BIKE` یا `VAN` یا `TRUCK` است قرار دارد.
برای مثال یک نمونه از این درخواست به صورت زیر خواهد بود:
`ADD-DRIVER shahin021 (13, 74) BIKE`
بعد از دریافت این نوع درخواست، در صورتی که این نام برای رانندهای دیگر قبلاً استفاده شده است عبارت `user previously added` را چاپ کنید و در صورتی که نام راننده قبلاً در سیستم ثبت نشده عبارت `user added successfully` را چاپ کنید.
میزان اعتبار یک راننده در لحظه اضافه شدن به سیستم برابر صفر است. وضعیت یک راننده بعد از اضافه شدن به سیستم `FREE` است چون هنوز هیچ سفارشی به او تخصیص نشده است.
</details>
<details class="blue">
<summary>
**درخواست** `CREATE-ORDER`
</summary>
این درخواست به معنی اضافه شدن یک سفارش (`ORDER`) به سیستم است.
```
CREATE-ORDER <SERVICE-CATEGORY> <START-POSITION> <FINISH-POSITION>
```
به جای `<SERVICE-CATEGORY>` یک رشته که نوع وسیلهای که برای انجام این سفارش نیاز است قرار دارد و مقدار آن برابر `BIKE` یا `VAN` یا `TRUCK` است. منظور از `<START-POSITION>` موقعیت مکانی فرستنده سفارش است، همچنین منظور از `<FINISH-POSITION>` موقعیت مکانی گیرنده سفارش است. هر دو این مقدارها به صورت یک زوج مرتب از اعداد صحیح به همان روش توضیح داده شده آمده است.
برای مثال یک نمونه از این درخواست به صورت زیر خواهد بود:
`CREATE-ORDER TRUCK (-100, 100) (100, -100)`
بعد از دریافت این درخواست، در صورتی که `<START-POSITION>` برابر `<FINISH-POSITION>` باشد عبارت `invalid order` و در غیر این صورت شماره این سفارش را برای این سفارش ثبت و سپس چاپ کنید.
هزینه این سفارش (`COST`) در این لحظه، از فرمول توضیح داده شده محاسبه میشود. همچنین وضعیت (`STATUS`) یک سفارش بلافاصله بعد از ایجاد `PENDING` خواهد بود.
</details>
<details class="blue">
<summary>
**درخواست** `ASSIGN-NEXT-ORDER`
</summary>
این درخواست به معنی تقاضا یک راننده برای تخصیص به نزدیکترین سفارش است.
```
ASSIGN-NEXT-ORDER <USERNAME>
```
در صورتی که رانندهای به چنین اسمی نداریم عبارت `invalid driver name` را چاپ کنید. در صورتی که وضعیت این راننده `BUSY` است عبارت `driver is already busy` را چاپ کنید. در صورتی که سفارشی در وضعیت `PENDING` با وسیله یکسان با راننده وجود ندارد عبارت `there is no order right now` را چاپ کنید.
در صورتی که هیچ کدام از حالتهای بالا پیش نیامد سفارشی با وضعیت `PENDING` را انتخاب میکنیم که کمترین فاصله با موقعیت مکانی فعلی راننده را دارد. اگر چند سفارش با فاصله برابر وجود داشتند سفارشی را انتخاب میکنیم که زودتر به سیستم اضافه شده است. سپس عبارت زیر را چاپ میکنیم.
```
<ORDER-ID> assigned to <USERNAME>
```
که `ORDER-ID` به معنی شماره سفارش تخصیص یافته به راننده با نام `USERNAME` است. بعد از این تخصیص وضعیت (`STATUS`) راننده به `BUSY` و وضعیت (`STATUS`) سفارش به `ARRIVED` تغییر خواهد کرد.
</details>
<details class="blue">
<summary>
**درخواست** `GET-DRIVER`
</summary>
در این درخواست وضعیت یک راننده پرسیده میشود.
```
GET-DRIVER <USERNAME>
```
در صورتی که رانندهای به چنین اسمی نداریم عبارت `invalid driver name` را چاپ کنید. در غیر این صورت، ابتدا `STATUS` این راننده را چاپ کنید (یعنی در صورت مشغول بودن رشته `BUSY` و در غیراین صورت رشته `FREE` را چاپ کنید.). سپس با یک فاصله موقعیت مکانی فعلی راننده را چاپ کنید سپس با یک فاصله اعتبار حساب راننده را چاپ کنید.
</details>
<details class="blue">
<summary>
**درخواست** `ORDER-UPDATE`
</summary>
در این دستور یک راننده تغییر وضعیت سفارش خود را اعلام میکند.
```
ORDER-UPDATE <STATUS> <DRIVER-USERNAME> <ORDER-ID>
```
در صورتی که رانندهای به چنین اسمی در سیستم وجود ندارد عبارت `invalid driver name` را چاپ کنید. در صورتی که شماره سفارش تخصیص یافته به این راننده برابر `ORDER-ID` نیست عبارت `wrong order-id` را چاپ کنید. در صورتی که تغییر وضعیت قابل قبول نیست عبارت `invalid status` و در غیر این صورت عبارت `status changed successfully` را چاپ کنید.
توجه کنید وضعیت یک سفارش به صورت زیر تغییر میکند:
`PENDING -> ARRIVED -> PICKUP -> DELIVERED`
پس تغییر وضعیت، قابل قبول است اگر به **دقیقاً به مرحله بعدی** برود. (به طور مثال نباید وضعیت یک سفارش در یک مرحله از `PENDING` به `PICKUP` تغییر کند یا نباید وضعیت یک سفارش به وضعیت فعلی خودش تغییر کند.)
زمانی که وضعیت یک سفارش به حالت `DELIVERED` تغییر میکند. 80 درصد هزینه سفارش به حساب راننده اضافه میشود و 20 درصد باقی مانده به حساب شرکت اضافه میشود. (تضمین میشود هزینهای که باید به حساب راننده یا شرکت اضافه شود عدد صحیح است.)
در صورتی که وضعیت سفارش به `PICKUP` تغییر کند موقعیت مکانی راننده به موقعیت مکانی فرستنده سفارش تغییر میکند.
در صورت تغییر وضعیت سفارش به `DELIVERED` وضعیت راننده به `FREE` و موقعیت مکانی راننده به گیرنده سفارش تغییر میکند.
</details>
<details class="blue">
<summary>
**درخواست** `GET-ORDER`
</summary>
در این درخواست وضعیت یک سفارش را پیگیری میکنیم.
```
GET-ORDER <ORDER-ID>
```
در صورتی که چنین سفارشی وجود ندارد عبارت `invalid order` و در غیر این صورت در یک خط ابتدا وضعیت (`STATUS`) این سفارش سپس با یک فاصله نام (`USERNAME`) رانندهای که در حال ارسال این سفارش است و در نهایت با یک فاصله، هزینه (`COST`) ارسال این سفارش را چاپ کنید.
اگر این سفارش به هیچ رانندهای تخصیص پیدا نکرده است عبارت `None` را به جای نام راننده چاپ کنید.
</details>
<details class="blue">
<summary>
**درخواست** `GET-ORDER-LIST`
</summary>
در این درخواست لیست تمام سفارشهایی که وضعیتشان برابر `<STATUS>` است را چاپ کنید.
```
GET-ORDER-LIST <STATUS>
```
شماره تمام سفارشهایی که وضعیت (`STATUS`) آنها برابر `<STATUS>` است را در یک خط با یک فاصله بین شمارهها چاپ کنید. اگر هیچ سفارشی در این وضعیت نبود کلمه `None` را چاپ کنید.
</details>
<details class="blue">
<summary>
**درخواست** `GET-DRIVER-LIST`
</summary>
در این درخواست لیست تمام رانندههایی که وضعیتشان برابر `<STATUS>` است را چاپ کنید.
```
GET-DRIVER-LIST <STATUS>
```
نام تمام رانندههایی که وضعیت (`STATUS`) آنها برابر `<STATUS>` است را با یک فاصله بین نامها در یک خط چاپ کنید. اگر هیچ رانندهای در این وضعیت نبود کلمه `None` را چاپ کنید.
</details>
<details class="blue">
<summary>
**درخواست** `GET-NEAR-DRIVER`
</summary>
در این درخواست `COUNT` تا نزدیک ترین راننده به نقطه `<POSITION>` با وضعیت `FREE` را میپرسیم.
```
GET-NEAR-DRIVER <POSITION> <COUNT>
```
این لیست را به ترتیب فاصله چاپ کنید (یعنی نام رانندهای که فاصلهی کمتری با نقطهی موردنظر دارد، باید قبل از نام رانندهای که فاصلهی بیشتری با نقطهی موردنظر دارد، چاپ شود.). اگر دو راننده فاصله یکسانی داشتند رانندهای که زودتر به سیستم اضافه شده را زودتر چاپ کنید.
در صورتی که تعداد رانندهها کمتر از `COUNT` بود همه رانندههای قابل قبول را چاپ کنید. در صورت خالی بودن لیست `None` چاپ کنید.
</details>
<details class="blue">
<summary>
**درخواست** `GET-CNT-ORDER`
</summary>
در این درخواست تعداد سفارشاتی که محل فرستنده یا گیرنده (بستگی به `START` یا `FINISH` بودن درخواست) که از نقطه `POSITION` فاصله حداکثر `DISTANCE` دارند را چاپ کنید.
```
GET-CNT-ORDER <POSITION> <DISTANCE> <START/FINISH>
```
دقت کنید که `<START/FINISH>`، همواره یکی از مقادیر `START` یا `FINISH` را داراست.
</details>
<details class="blue">
<summary>
**درخواست** `GET-NEAREST-PENDING-ORDER`
</summary>
شماره (`ORDER-ID`) نزدیک ترین سفارش با وضعیت `PENDING` که فرستنده آن به `POSITION` است را چاپ کنید.
```
GET-NEAREST-PENDING-ORDER <POSITION>
```
اگر چنین سفارشی وجود نداشت کلمه `None` و در غیر این صورت شماره سفارش را چاپ کنید.
</details>
<details class="blue">
<summary>
**درخواست** `GET-COMPANY`
</summary>
در این درخواست سود شرکت را از سفارشهای تحویل داده شده تا این لحظه چاپ کنید.
```
GET-COMPANY
```
پاسخ همواره به صورت یک عدد صحیح است.
</details>
# ورودی
در هر سطر از ورودی یکی از انواع درخواستهای تعریف شده داده میشود. قدرمطلق همه اعداد داده شده حداکثر $1000$ و تعداد درخواستها در این سوال حداکثر $100$ خواهد بود.
# خروجی
در هر سطر خروجی عبارت متناسب با درخواستها را به ترتیب چاپ کنید. در آخرین خط ورودی تنها کلمه `END` برای نشان دادن پایان دستورات نوشته میشود.
# مثال
+ توجه کنید که خروجی خط $i$ام، مربوط به ورودی خط $i$ام میباشد.
## ورودی نمونه ۱
``` terminal
ADD-DRIVER Ali (10, 10) VAN
ADD-DRIVER GHoLI (0, 0) BIKE
ADD-DRIVER Ali (45, 90) VAN
CREATE-ORDER VAN (18, 10) (-33, 66)
ASSIGN-NEXT-ORDER Ali
GET-DRIVER GHoLI
GET-DRIVER Ali
ORDER-UPDATE DELIVERED ali 1
ORDER-UPDATE PICKUP Ali 1
ORDER-UPDATE DELIVERED Ali 1
GET-ORDER 1
GET-ORDER-LIST ARRIVED
GET-ORDER-LIST DELIVERED
GET-DRIVER-LIST FREE
GET-NEAR-DRIVER (5, -21) 3
GET-CNT-ORDER (-40, -80) 100 START
GET-CNT-ORDER (0, 0) 100 FINISH
GET-NEAREST-PENDING-ORDER (20, 20)
GET-COMPANY
END
```
## خروجی نمونه ۱
``` terminal
user added successfully
user added successfully
user previously added
1
1 assigned to Ali
FREE (0, 0) 0
BUSY (10, 10) 0
invalid driver name
status changed successfully
status changed successfully
DELIVERED Ali 10800
None
1
Ali GHoLI
GHoLI Ali
0
1
None
2160
```
## ورودی نمونه ۲
``` terminal
ADD-DRIVER Mohammad021 (-142, 21) TRUCK
ADD-DRIVER kami (20, 20) VAN
ADD-DRIVER 00MOHSEN (0, 128) TRUCK
ADD-DRIVER kami (30, 30) BIKE
ADD-DRIVER SaMi (55, -2) BIKE
GET-DRIVER 00MOHSEN
CREATE-ORDER TRUCK (0, 0) (100, 18)
CREATE-ORDER BIKE (19, -38) (-40, 127)
CREATE-ORDER VAN (16, 16) (-75, 75)
ASSIGN-NEXT-ORDER SaMi
CREATE-ORDER TRUCK (-10, 100) (-11, 100)
ASSIGN-NEXT-ORDER 00MOHSEN
ASSIGN-NEXT-ORDER SaMi
GET-DRIVER sami
GET-DRIVER SaMi
ORDER-UPDATE DELIVERED 00MOHSEN 3
ORDER-UPDATE PICKUP 00MOHSEN 4
ORDER-UPDATE DELIVERED 00MOHSEN 4
GET-DRIVER 00MOHSEN
GET-ORDER 2
GET-ORDER 3
GET-ORDER-LIST PENDING
GET-ORDER-LIST ARRIVED
GET-DRIVER-LIST BUSY
GET-DRIVER-LIST FREE
GET-NEAR-DRIVER (78, 29) 2
GET-NEAR-DRIVER (-70, 50) 1
GET-CNT-ORDER (0, 0) 133 FINISH
GET-CNT-ORDER (-29, 101) 77 START
GET-NEAREST-PENDING-ORDER (17, 23)
GET-NEAREST-PENDING-ORDER (0, 0)
GET-COMPANY
ORDER-UPDATE PICKUP SaMi 2
ORDER-UPDATE DELIVERED SaMi 2
GET-COMPANY
END
```
## خروجی نمونه ۲
``` terminal
user added successfully
user added successfully
user added successfully
user previously added
user added successfully
FREE (0, 128) 0
1
2
3
2 assigned to SaMi
4
4 assigned to 00MOHSEN
driver is already busy
invalid driver name
BUSY (55, -2) 0
wrong order-id
status changed successfully
status changed successfully
FREE (-11, 100) 240
ARRIVED SaMi 22500
PENDING None 15100
1 3
2
SaMi
Mohammad021 kami 00MOHSEN
kami 00MOHSEN
Mohammad021
2
1
3
1
60
status changed successfully
status changed successfully
4560
```
تخصیص سفارش
**کد شما باید روی نسخهی استاندارد _MySQL_ قابل اجرا باشد.** برای چک کردن سینتکس کد *SQL* خود میتوانید از **[این وبسایت](https://www.eversql.com/sql-syntax-check-validator/)** کمک بگیرید.
---
محمود بهتازگی در تیم فنی *اسنپ باکس* استخدام شده و برای شروع، تسکهای مختلفی به او محول شده است. او باید اطلاعات مختلفی را در *MySQL* دریافت کند تا بتوانند خدمات بهتری به کاربران ارائه دهند.
# جزئیات پروژه
فایل دادههای اولیه برای تست نمونه را از [این لینک](/contest/assignments/31890/download_problem_initial_project/106103/) دانلود کنید.
جداولی که محمود قرار است با آنها کار کند بهشرح زیر هستند:
1. اطلاعات کاربران (`users`):
| نام ستون | نوع | تعریف | ملاحضات |
|----------|----------------|------------------|------------------------------|
| `id` | `int(11)` | شناسهی کاربر | `primary key auto_increment` |
| `name` | `varchar(255)` | نام کاربر | |
| `phone` | `varchar(255)` | شماره تماس کاربر | |
2. اطلاعات سفیران (`drivers`):
| نام ستون | نوع | تعریف | ملاحضات |
|----------|----------------|------------------|------------------------------|
| `id` | `int(11)` | شناسهی کاربر | `primary key auto_increment` |
| `name` | `varchar(255)` | نام کاربر | |
| `phone` | `varchar(255)` | شماره تماس کاربر | |
3. اطلاعات مرسولات (`deliveries`):
| نام ستون | نوع | تعریف | ملاحضات |
|----------------|------------|----------------------------------|------------------------------|
| `id` | `int(11)` | شناسهی مرسوله | `primary key auto_increment` |
| `user_id` | `int(11)` | شناسهی کاربر | `foreign key (users:id)` |
| `driver_id` | `int(11)` | شناسهی سفیر | `foreign key (drivers:id)` |
| `src` | `point(latitude, longitude)` | نقطهی مبدأ (طول و عرض جغرافیایی) | |
| `dest` | `point(latitude, longitude)` | نقطهی مقصد (طول و عرض جغرافیایی) | |
| `requested_at` | `datetime` | زمان درخواست ارسال مرسوله | |
| `delivered_at` | `datetime` | زمان تحویل مرسوله | |
4. اطلاعات سفارشات (`orders`):
| نام ستون | نوع | تعریف | ملاحضات |
|---------------|-----------------|-------------------------------|-------------------------------|
| `delivery_id` | `int(11)` | شناسهی مرسولهی مربوط به سفارش | `primary key & foreign key (deliveries:id)` |
| `price` | `decimal(10,2)` | قیمت سفارش | |
5. امتیاز کاربران به سفارشات (`rates`):
| نام ستون | نوع | تعریف | ملاحضات |
|---------------|---------------------------------|----------------------------------------------------------------|---------------------------------------------|
| `delivery_id` | `int(11)` | شناسهی مرسولهی مربوط به امتیاز | `primary key & foreign key (deliveries:id)` |
| `rate` | `enum('1', '2', '3', '4', '5')` | امتیاز کاربر به سفارش (۱ به معنای کمترین و ۵ به معنای بیشترین) | |
# مطلوبات
کوئریهای *SQL* خواستهشده از شما موارد زیر است (توجه کنید که هر کوئری نمرهای جداگانه دارد و اگر کوئری یک قسمت را نتوانستید بزنید، کوئریهایی که حل کردید را بفرستید و قسمت آن کوئری را خالی بگذارید):
1. شناسهی کاربرانی که نام آنها با `Ali` آغاز میشود را بهترتیب صعودی برگردانید (بزرگی و کوچکی حروف مهم نیست).
2. مجموع قیمت سفارشات در سال ۲۰۲۰ را برگردانید (یک سفارش در سال ۲۰۲۰ محسوب میشود، اگر زمان درخواست ارسال مرسوله در سال ۲۰۲۰ باشد). نوع دادهی خروجی باید برابر با نوع ستون `price` در جدول سفارشات باشد.
3. شناسهی ۱۰ سفیر برتر را بهترتیب نزولی میانگین امتیازات سفارشات برگردانید. اگر دو سفیر امتیاز یکسانی داشته باشند، ابتدا سفیری باید بیاید که شناسهاش کوچکتر است.
4. شناسهی مرسوله و شناسهی سفیران مربوط به مرسولاتی که ارسال آنها بیشتر یا مساوی ۳ ساعت طول کشیده است را بهترتیب صعودی شناسهی مرسوله برگردانید.
5. نام و شماره تماس افرادی که حداقل ۵ مرسوله با فاصلهی مکانی بزرگتر یا مساوی ۲۰ کیلومتر ارسال کردهاند را بهترتیب صعودی الفبایی براساس نام افراد برگردانید. برای محاسبهی فاصلهی مکانی، از طول و عرض جغرافیایی مبدأ و مقصد استفاده کنید.
**نکته:** نام ستونهای خروجی مهم نیست. صرفاً ترتیب آنها مهم است.
# آنچه باید آپلود کنید
کد خود را در قالب زیر، در یک فایل با پسوند `.sql` قرار داده و آن را ارسال کنید (فایل را زیپ نکنید).
```sql
-- Section1
your 1st query here
-- Section2
your 2nd query here
-- Section3
your 3rd query here
-- Section4
your 4th query here
-- Section5
your 5th query here
```