رشته چکر


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

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

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

ورودی🔗

ورودی شامل دو خط است که در هر خط یک رشته شامل حروف کوچک انگلیسی به طول حداکثر ۵۰ آمده است.

خروجی🔗

در صورتی که دو رشته‌ی داده در کنار هم زیبا هستند عبارت YES و در غیر این صورت عبارت NO را چاپ کنید.

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

salam
khodafes
Plain text

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

YES
Plain text

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

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

salam
salam
Plain text

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

NO
Plain text

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

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

snapp
box
Plain text

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

NO
Plain text

از آنجا که حرف اول رشته‌ی snapp، یعنی s برابر با حرف آخر رشته‌ی box ، یعنی x نیست، پس این دو رشته در کنار هم زیبا نیستند و باید عبارت NO را چاپ کرد.

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

software
engineers
Plain text

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

YES
Plain text

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

رشته‌ی رمزی


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

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

روش رمزگزاری‌ای که این دو انتخاب کردند به این صورت است که ابتدا حرف آخر رشته را به اول رشته جابه‌جا می‌کنند و سپس تمامی حروف رشته را به حرف بعدی آن در الفبا تبدیل می‌کنند. (به عنوان مثال حرف c به d تبدیل می‌شود) همچنین حرف بعدی z در الفبا را a در نظر می‌گیریم. ممد که می‌گوید کار از محکم کاری عیب نمی‌کند، برای قوی‌تر کردن رمزگزاری پیشنهاد کرده که این عملیات kk بار بر روی رشته انجام شود. آن دو که آرام و قرار ندارند از شما خواسته‌اند تا رشته‌ی نهایی را بدست آورید.

توجه کنید در هر مرحله از kk بار عملیات، هر دوی «انتقال حرف از آخر به اول» و «تبدیل هر حرف به حرف بعدی» انجام می‌شود.

ورودی🔗

در خط اول ورودی nn آمده که نشان دهنده‌ی طول پیام است.

در خط دوم ورودی kk آمده که نشان دهنده‌ی تعداد باری است که عملیات رمزگزاری باید صورت گیرد.

در خط سوم ورودی رشته‌ی مورد نظر آمده، تضمین می‌شود تمام حروف آن از حروف کوچک انگلیسی است. 1n,k1001 \le n, k \le 100

خروجی🔗

در تنها خط خروجی رشته‌ی مورد نظر را پس از kk بار رمزگزاری خروجی دهید.

مثال🔗

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

3
1
abz
Plain text

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

abc
Plain text

یک مرحله رمز گزاری به صورت زیر انجام می‌شود:

  • ابتدا حرف آخر رشته به اول آن می‌رود در نتیجه abz به zab تبدیل می‌شود.
  • سپس تمامی حروف رشته با حرف بعدی الفبایی‌شان جابه‌جا می‌شوند در نتیجه zab به abc تبدیل می‌شود.

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

4
5
abcd
Plain text

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

ifgh
Plain text

۲ عملیات اول روی رشته‌ی abcd به صورت زیر خواهد بود:

  • عملیات اول:
    • ابتدا حرف آخر رشته (حرف d ) به اول رشته منتقل می‌شود و به رشته‌ی dabc خواهیم رسید.
    • سپس تمامی حروف به حرف بعدی الفبا منتقل می‌شوند به رشته‌ی ebcd خواهیم رسید.
  • عملیات دوم:
    • ابتدا حرف آخر رشته (حرف d ) به اول رشته منتقل می‌شود و به رشته‌ی debc خواهیم رسید.
    • سپس تمامی حروف به حرف بعدی الفبا منتقل می‌شوند به رشته‌ی efcd خواهیم رسید.

۳ عملیات باقی‌مانده به طور مشابه صورت می‌گیرند و در انتها به رشته‌ی ifgh خواهیم رسید.

بسته در جدول


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

جدولی n×mn \times m داریم که هر خانه‌ی آن یک شهر است، می‌خواهیم از خانه‌ی (1,1)(1,1) در جدول شروع کنیم و هر مرحله با توجه به علائم به شهرهای دیگر برویم. علائم به صورت عدد روی هر شهر نوشته شده که هر عدد معنای خاص خود را دارد. به طور دقیق‌تر اگر اکنون در شهر خانه‌ی (x,y)(x, y) باشیم (که در آن xx شماره‌ی سطر و yy شماره‌ی ستون است) و عدد نوشته شده روی این شهر ax,ya_{x, y} باشید حالات زیر را داریم:

  • اگر عدد نوشته شده بر روی شهر، عددی اول بود آنگاه به شهر قرینه‌ی آن نسبت به مرکز جدول می‌رویم. (توجه کنید مرکز جدول لزوما از عناصر جدول نیست، به عنوان مثال در جدول ۲ در ۲ نقطه‌ی مرکزی جدول با هیچ یک از عناصر آن برابر نیست. برای درک بهتر به توضیحات مثال توجه کنید)
  • اگر عدد نوشته شده اول نبود بر اساس باقیمانده‌ی آن نسبت به ۴ عمل می‌کنیم.
    • اگر باقیمانده صفر بود به خانه‌ی راست (x,y)(x, y) در جدول می‌ٰرویم. اگر خانه‌ی راستی وجود نداشت به خانه‌ی (x,1)(x, 1) می‌رویم.
    • اگر باقیمانده یک بود به خانه‌ی پایین (x,y)(x, y) در جدول می‌ٰرویم. اگر خانه‌ی پایینی وجود نداشت به خانه‌ی (1,y)(1 ,y) می‌رویم.
    • اگر باقیمانده دو بود به خانه‌ی چپ (x,y)(x, y) در جدول می‌ٰرویم. اگر خانه‌ی چپی وجود نداشت به خانه‌ی (x,m)(x, m) می‌رویم.
    • اگر باقیمانده سه بود به خانه‌ی بالای (x,y)(x, y) در جدول می‌ٰرویم. اگر خانه‌ی بالایی وجود نداشت به خانه‌ی (n,y)(n, y) می‌رویم.

حال تشخیص دهید بعد از kk مرحله دنبال کردن علائم به کدام شهر می‌رسیم.

ورودی🔗

در خط اول ورودی n,m,kn,m,k آمده که به ترتیب نشان دهنده‌ی تعداد سطر‌ها، ستون‌ها و تعداد مراحلی است که باید علائم را دنبال کرد. 1n,m1001 \le n,m \le 100 1k1 0001 \le k \le 1\ 000 سپس در هر خط از nn خط بعدی mm عدد آمده که نشان دهنده‌ی اعداد نوشته شده بر روی خانه‌های جدول (شهر‌ها) است. به طور دقیق‌تر jjامین عدد در سطر iiام برابر ai,ja_{i,j} است که عدد نوشته شده روی شهر (i,j)(i, j) می‌باشد. 1ai,j1061 \le a_{i,j} \le 10^6

خروجی🔗

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

زیرمسئله‌ها🔗

زیرمسئله نمره محدودیت‌ها
۱ ۶۰ عدد هیچ یک از خانه‌های جدول اول نیست.
۲ ۱۴۰ بدون محدودیت

توجه کنید که نمره سوال از ۲۰۰ نمره است.

مثال🔗

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

3 3 4
4 9 4
6 9 6
1 1 1
Plain text

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

1 2
Plain text

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

3 4 4
6 11 9 7
8 3 21 6
6 1 4 15
Plain text

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

2 4
Plain text

ابتدا در خانه‌ی (1,1)(1,1) شروع می‌کنیم از آنجایی که a1,1a_{1,1} برابر با ۶ است و خانه‌ی چپی وجود ندارد باید به (1,4)(1,4) برویم. حال چون a1,4a_{1,4} عددی اول و برابر با ۷ است به خانه‌ی قرینه‌ی آن نسبت به وسط جدول یعنی (3,1)(3,1) می‌رویم. سپس با توجه به a3,1a_{3,1} چون خانه‌ی چپی وجود ندارد به (3,4)(3,4) می‌رویم و در آخر (مرحله‌ی چهارم) باید به خانه‌ی بالایی یعنی (2,4)(2,4) برویم.

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

3 2 8
2 3
9 8
10 10
Plain text

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

3 1
Plain text

با شروع از خانه‌ی (1,1)(1,1) به قرینه‌ی آن نسبت به وسط جدول می‌رویم و به (3,2)(3,2) می‌رسیم، در ۷ مرحله‌ی بعد بین خانه‌های (3,2)(3,2) و (3,1)(3,1) جابه‌جا می‌شویم و با دنبال کردن این حرکات به خانه‌ی (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+BA + B و یا ABA - B که در آن، AA و BB می‌توانند متغیر و یا عدد ثابت باشند، یک expression است. برای مثال عبارت‌های A+DA + D و همچنین VAR+5VAR + 5 که در آن AA، DD و VARVAR متغیر هستند، یک expression اند.
    • باقی عبارات expression نیستند. برای مثال مقادیر A+B+CA + B + C و یا A×BA \times B یک expression نیستند.
  • تعریف List:

    • عبارت AA که در آن AA متغیر و یا عدد ثابت است، یک لیست است.
    • اگر AA و BB دو List باشند، عبارت A,BA, B نیز یک List است.
    • برای مثال اگر AA و BB و DD متغیر باشند، عبارات 33 و AA و A,7A, 7 و همچنین 1,D,B1, D, B یک List هستند.
  • تعریف condition:

    • عبارت A==BA == B که در آن AA و BB متغیر و یا عدد ثابت هستند یک condition است.
    • در صورتی که مقادیر AA و BB برابر باشند، condition برقرار است و در غیر این صورت condition برقرار نیست.
    • برای مثال 3==33 == 3 یک condition است که برقرار است و عبارت A==5A == 5 که در آن مقدار AA هنگام اجرا ۶ است، یک condition است که برقرار نیست.
  • تعریف متغیر:

    • هر رشته‌ای از ترکیب اعداد ۰ تا ۹ و همچنین حروف کوچک و بزرگ الفبای انگلیسی به طول حداکثر ۱۰ که با عدد شروع نشود، یک متغیر است.
    • برای مثال عبارات AA، VAR2VAR2 و ABC123deABC123de یک متغیراند در صورتی که عبارات VAR_3VAR\_3، 3VAR3VAR و VARIABLE123VARIABLE123 متغیر نیستند.

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

ورودی🔗

ورودی شامل دو بخش است که در بخش اول دستورات برنامه در چند خط آمده است و پس از آن در یک خط رشته‌ی ----- آمده است سپس ورودی‌های برنامه، هر کدام در یک خط آمده است.

تعداد خط‌های دستورات از ۵۰ بیشتر نخواهد بود.

تضمین می‌شوند تعداد ورودی‌های برنامه برابر با تعداد دستورهای Input است و همچنین هر متغیر قبل از استفاده مقداردهی می‌شود.

تمام اعداد داده شده در دستورات، اعداد طبیعی و مثبت خواهند بود، اما ممکن است در هنگام اجرای دستورات، مقدار متغیری منفی شود.

خروجی🔗

در خروجی، به ازای هر دستور Print خروجی آن را در یک خط چاپ کنید. سپس در یک خط، تعداد متغیرهایی که حداقل یکبار مقداردهی شده‌اند را خروجی دهید.

تضمین می‌شود حداقل یک دستور Print در دستورات برنامه وجود دارد.

زیرمسئله‌ها🔗

زیرمسئله نمره محدودیت‌ها
۱ ۲۵ فقط دستور Assignment و Print موجود است و در دستور Print تنها یک ورودی داریم.
۲ ۷۵ دستور If Statement نداریم.
۳ ۱۵۰ بدون محدودیت

توجه کنید نمره سوال از ۲۵۰ نمره است.

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

A = 3
B = voroodi()
C = A + B
khoorooji(10)
khoorooji(C, 2)
-----
3
Plain text

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

10
6 2
3
Plain text

مقدار متغیر CC پس از اجرای دستورات برابر ۶ خواهد بود و تعداد متغیرهایی که حداقل یکبار مقداردهی شده‌اند برابر با ۳ است. (متغیرهای AA و BB و CC)

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

A = voroodi()
agar A == 2 : A = A + 2
khoorooji(A)
-----
2
Plain text

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

4
1
Plain text

مقدار متغیر AA پس از اجرای دستورات برابر ۴ خواهد بود و تعداد متغیرهایی که حداقل یکبار مقداردهی شده‌اند برابر با ۱ است. (متغیر AA)

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

agar 2 == 2 : A = 3
agar 3 == 4 : B = 1
khoorooji(A)
-----
Plain text

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

3
1
Plain text

مقدار متغیر AA پس از اجرای دستورات برابر ۳ خواهد بود و تعداد متغیرهایی که حداقل یکبار مقداردهی شده‌اند برابر با ۱ است. (متغیر AA)

تخصیص سفارش


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

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

در ابتدا هیچ راننده و یا سفارشی نداریم. در هر مرحله یا یک راننده به سیستم اضافه می‌شود یا یک سفارش در سیستم ثبت می‌شود یا یک راننده درخواست می‌کند که یک سفارش به او تخصیص شود.

هر راننده بعد از تخصیص یک سفارش مرحله به مرحله گزارش می‌دهد که فرآیند ارسال این سفارش از فرستنده به گیرنده در کدام مرحله قرار دارد.

از شما می‌خواهیم با دریافت این اطلاعات این سامانه را شبیه سازی کنید. همچنین سیستم شبیه ساز شما باید قابلیت پاسخ دادن به درخواست‌هایی که در پایین تر تعریف کردیم را داشته باشد.

راننده

راننده (DRIVER) سفارش را از فرستنده تحویل گرفته و به گیرنده تحویل می‌دهد. برای هر راننده ویژگی‌‌های زیر تعریف می‌شود:

نام (USERNAME):🔗

یک رشته که فقط شامل حروف کوچک و بزرگ انگلیسی و ارقام است و حداکثر شامل ۲۵ کاراکتر می‌شود.

نوع وسیله (SERVICE-CATEGORY):🔗

وسیله‌ی نقلیه راننده را نشان می‌دهد و مقدار آن همواره یکی از موارد زیر است.

  • موتور (BIKE)
  • وانت (VAN)
  • کامیون (TRUCK)

میزان اعتبار (CREDIT):🔗

یک عدد حسابی است که مقدار پولی که راننده در حساب اسنپ خود دارد را نشان می‌دهد. میزان سرمایه اولیه هر راننده به صورت پیشفرض برابر صفر است. میزان اعتبار هر راننده بعد از تحویل یک سفارش (یعنی زمانی که وضعیت سفارش به DELIVERED تغییر کند.) به اندازه 8080% هزینه سفارش افزایش پیدا می‌کند.

موقعیت مکانی (POSITION):🔗

موقعیت مکانی هر راننده به صورت یک زوج مرتب (x,y)(x, y) است که xx و yy دو عدد صحیح هستند. برای نمایش و دریافت یک POSITION ابتدا یک ( سپس عدد xx بلافاصله , سپس با یک فاصله عدد yy و بلافاصله ) نمایش داده می‌شود.

به طور مثال موقعیت مکانی یک راننده می‌تواند به صورت (57, 31) یا (0, -74) باشد اما (0 , -74) یا ( 57 31) نمایش قابل قبولی نیست.

وضعیت (STATUS):🔗

بطور کلی راننده دارای دو وضعیت زیر است:

  • آزاد (FREE)
  • مشغول (BUSY)

اگر یک راننده در حال انجام دادن یک سفارش باشد یعنی در حال رفتن به سمت فرستنده برای دریافت محموله (به عبارت دیگر محموله تخصیص یافته به آن در حالت ARRIVED باشد.) یا در حال رفتن به سمت گیرنده برای تحویل محموله (به عبارت دیگر سفارش تخصیص‌یافته به آن در حالت PICKUP باشد.) باشد؛ راننده در وضعیت BUSY و اگر هیچ سفارشی به این راننده تخصیص نشده یا همه سفارش‌هایی که به او تخصیص شده را تحویل داده است (یعنی وضعیت سفارش‌های تخصیص‌یافته DELIVERED باشد.) وضعیت راننده FREE است.

سفارش

برای هر سفارش (ORDER) ویژگی‌‌های زیر قابل تعریف است:

نوع وسیله (SERVICE-CATEGORY):🔗

وسیله‌ی مورد نیاز برای جابه‌جایی این سفارش را نشان می‌دهد و مقدار آن همواره یکی از موارد زیر است.

  • موتور (BIKE)
  • وانت (VAN)
  • کامیون (TRUCK)

موقعیت مکانی فرستنده (STARTING-POSITION):🔗

موقعیت مکانی فرستنده به صورت یک زوج مرتب (x,y)(x, y) است که xx و yy دو عدد صحیح هستند. نمایش و دریافت موقعیت مکانی فرستنده مشابه موقعیت مکانی راننده است.

موقعیت مکانی گیرنده: (FINISHING-POSITION):🔗

موقعیت مکانی گیرنده به صورت یک زوج مرتب (x,y)(x, y) است که xx و yy دو عدد صحیح هستند. نمایش و دریافت موقعیت گیرنده مشابه موقعیت مکانی راننده است.

هزینه (COST):🔗

هزینه هر سفارش با توجه به فرمول زیر محاسبه می‌شود:

فرض کنید (x,y)(x, y) موقعیت مکانی فرستنده و (x,y)(x', y') موقعیت مکانی گیرنده باشد. اگر تعداد سفارش‌هایی که هم اکنون منتظر راننده با همین نوع وسیله هستند (یعنی وضعیت آن‌ها PENDING است.) شامل همین سفارش، برابر kk باشد این هزینه برابر است با: cost=(k+xx+yy)×100cost = (k + |x - x'| + |y - y'|) \times 100

توجه کنید بعد تحویل هر سفارش 8080% هزینه به اعتبار (CREDIT) راننده اضافه می‌شود و 2020% باقی مانده به حساب اسنپ باکس اضافه می‌شود. (با توجه به رابطه بالا این دو عدد همواره عدد صحیح خواهند بود.)

شماره سفارش (ORDER-ID):🔗

شماره یک سفارش nn است اگر nnامین سفارشی باشد که با موفقیت در سیستم ثبت شده باشد.

وضعیت (STATUS):🔗

وضعیت هر سفارش چهار حالت دارد:

  • PENDING: هنوز راننده‌ای به این سفارش تخصیص داده نشده است.
  • ARRIVED: یک راننده به این سفارش تخصیص داده شده و به سمت فرستنده این سفارش در حال حرکت است.
  • PICKUP: راننده این سفارش را از فرستنده تحویل گرفته و در حال حرکت به سمت گیرنده است.
  • DELIVERED: سفارش با موفقیت به گیرنده تحویل داده شده است.

منظور از فاصله بین دو نقطه (x,y)(x, y) و (x,y)(x', y') در این سوال برابر است با: xx+yy|x - x'| + |y - y'|

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

درخواست ADD-DRIVER

این درخواست به معنی اضافه شدن یک راننده (DRIVER) به سیستم است.

ADD-DRIVER <DRIVER-USERNAME> <POSITION> <SERVICE-CATEGORY>
Plain text

به جای <DRIVER-USERNAME> یک رشته که نشان دهنده نام راننده، به جای <POSITION> موقعیت مکانی فعلی راننده که یک زوج مرتب از اعداد صحیح است و به جای <SERVICE-CATEGORY> نوع وسیله راننده که یک رشته برابر BIKE یا VAN یا TRUCK است قرار دارد.

برای مثال یک نمونه از این درخواست به صورت زیر خواهد بود:

ADD-DRIVER shahin021 (13, 74) BIKE

بعد از دریافت این نوع درخواست، در صورتی که این نام برای راننده‌ای دیگر قبلاً استفاده شده است عبارت user previously added را چاپ کنید و در صورتی که نام راننده قبلاً در سیستم ثبت نشده عبارت user added successfully را چاپ کنید.

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

درخواست CREATE-ORDER

این درخواست به معنی اضافه شدن یک سفارش (ORDER) به سیستم است.

CREATE-ORDER <SERVICE-CATEGORY> <START-POSITION> <FINISH-POSITION>
Plain text

به جای <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 خواهد بود.

درخواست ASSIGN-NEXT-ORDER

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

ASSIGN-NEXT-ORDER <USERNAME>
Plain text

در صورتی که راننده‌ای به چنین اسمی نداریم عبارت invalid driver name را چاپ کنید. در صورتی که وضعیت این راننده BUSY است عبارت driver is already busy را چاپ کنید. در صورتی که سفارشی در وضعیت PENDING با وسیله یکسان با راننده وجود ندارد عبارت there is no order right now را چاپ کنید.

در صورتی که هیچ کدام از حالت‌های بالا پیش نیامد سفارشی با وضعیت PENDING را انتخاب می‌کنیم که کمترین فاصله با موقعیت مکانی فعلی راننده را دارد. اگر چند سفارش با فاصله برابر وجود داشتند سفارشی را انتخاب می‌کنیم که زودتر به سیستم اضافه شده است. سپس عبارت زیر را چاپ می‌کنیم.

<ORDER-ID> assigned to <USERNAME> 
Plain text

که ORDER-ID به معنی شماره سفارش تخصیص یافته به راننده با نام USERNAME است. بعد از این تخصیص وضعیت (STATUS) راننده به BUSY و وضعیت (STATUS) سفارش به ARRIVED تغییر خواهد کرد.

درخواست GET-DRIVER

در این درخواست وضعیت یک راننده پرسیده می‌شود.

GET-DRIVER <USERNAME>
Plain text

در صورتی که راننده‌ای به چنین اسمی نداریم عبارت invalid driver name را چاپ کنید. در غیر این صورت، ابتدا STATUS این راننده را چاپ کنید (یعنی در صورت مشغول بودن رشته BUSY و در غیراین صورت رشته FREE را چاپ کنید.). سپس با یک فاصله موقعیت مکانی فعلی راننده را چاپ کنید سپس با یک فاصله اعتبار حساب راننده را چاپ کنید.

درخواست ORDER-UPDATE

در این دستور یک راننده تغییر وضعیت سفارش خود را اعلام می‌کند.

ORDER-UPDATE <STATUS> <DRIVER-USERNAME> <ORDER-ID>
Plain text

در صورتی که راننده‌ای به چنین اسمی در سیستم وجود ندارد عبارت 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 و موقعیت مکانی راننده به گیرنده سفارش تغییر می‌کند.

درخواست GET-ORDER

در این درخواست وضعیت یک سفارش را پیگیری می‌کنیم.

GET-ORDER <ORDER-ID>
Plain text

در صورتی که چنین سفارشی وجود ندارد عبارت invalid order و در غیر این صورت در یک خط ابتدا وضعیت (STATUS) این سفارش سپس با یک فاصله نام (USERNAME) راننده‌ای که در حال ارسال این سفارش است و در نهایت با یک فاصله، هزینه (COST) ارسال این سفارش را چاپ کنید.

اگر این سفارش به هیچ راننده‌ای تخصیص پیدا نکرده است عبارت None را به جای نام راننده چاپ کنید.

درخواست GET-ORDER-LIST

در این درخواست لیست تمام سفارش‌هایی که وضعیتشان برابر <STATUS> است را چاپ کنید.

GET-ORDER-LIST <STATUS>
Plain text

شماره تمام سفارش‌هایی که وضعیت (STATUS) آن‌ها برابر <STATUS> است را در یک خط با یک فاصله بین شماره‌ها چاپ کنید. اگر هیچ سفارشی در این وضعیت نبود کلمه None را چاپ کنید.

درخواست GET-DRIVER-LIST

در این درخواست لیست تمام راننده‌هایی که وضعیتشان برابر <STATUS> است را چاپ کنید.

GET-DRIVER-LIST <STATUS>
Plain text

نام تمام راننده‌هایی که وضعیت (STATUS) آن‌ها برابر <STATUS> است را با یک فاصله بین نام‌ها در یک خط چاپ کنید. اگر هیچ راننده‌ای در این وضعیت نبود کلمه None را چاپ کنید.

درخواست GET-NEAR-DRIVER

در این درخواست COUNT تا نزدیک ترین راننده به نقطه <POSITION> با وضعیت FREE را می‌پرسیم.

GET-NEAR-DRIVER <POSITION> <COUNT>
Plain text

این لیست را به ترتیب فاصله چاپ کنید (یعنی نام رانند‌ه‌ای که فاصله‌ی کمتری با نقطه‌ی موردنظر دارد، باید قبل از نام راننده‌ای که فاصله‌ی بیشتری با نقطه‌ی موردنظر دارد، چاپ شود.). اگر دو راننده فاصله یکسانی داشتند راننده‌ای که زودتر به سیستم اضافه شده را زودتر چاپ کنید.

در صورتی که تعداد راننده‌ها کمتر از COUNT بود همه راننده‌های قابل قبول را چاپ کنید. در صورت خالی بودن لیست None چاپ کنید.

درخواست GET-CNT-ORDER

در این درخواست تعداد سفارشاتی که محل فرستنده یا گیرنده (بستگی به START یا FINISH بودن درخواست) که از نقطه POSITION فاصله حداکثر DISTANCE دارند را چاپ کنید.

GET-CNT-ORDER <POSITION> <DISTANCE> <START/FINISH>
Plain text

دقت کنید که <START/FINISH>‍، همواره یکی از مقادیر START یا FINISH را داراست.

درخواست GET-NEAREST-PENDING-ORDER

شماره (ORDER-ID) نزدیک ترین سفارش با وضعیت PENDING که فرستنده آن به POSITION است را چاپ کنید.

GET-NEAREST-PENDING-ORDER <POSITION>
Plain text

اگر چنین سفارشی وجود نداشت کلمه None و در غیر این صورت شماره سفارش را چاپ کنید.

درخواست GET-COMPANY

در این درخواست سود شرکت را از سفارش‌های تحویل داده شده تا این لحظه چاپ کنید.

GET-COMPANY
Plain text

پاسخ همواره به صورت یک عدد صحیح است.

ورودی🔗

در هر سطر از ورودی یکی از انواع درخواست‌های تعریف شده داده می‌شود. قدرمطلق همه اعداد داده شده حداکثر 10001000 و تعداد درخواست‌ها در این سوال حداکثر 100100 خواهد بود.

خروجی🔗

در هر سطر خروجی عبارت متناسب با درخواست‌ها را به ترتیب چاپ کنید. در آخرین خط ورودی تنها کلمه END برای نشان دادن پایان دستورات نوشته می‌شود.

مثال🔗

  • توجه کنید که خروجی خط iiام، مربوط به ورودی خط iiام می‌باشد.

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

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
Terminal

آمارگیری - دیتابیس


کد شما باید روی نسخه‌ی استاندارد MySQL قابل اجرا باشد. برای چک کردن سینتکس کد SQL خود می‌توانید از این وبسایت کمک بگیرید.


محمود به‌تازگی در تیم فنی اسنپ باکس استخدام شده و برای شروع، تسک‌های مختلفی به او محول شده است. او باید اطلاعات مختلفی را در MySQL دریافت کند تا بتوانند خدمات بهتری به کاربران ارائه دهند.

جزئیات پروژه🔗

فایل داده‌های اولیه برای تست نمونه را از این لینک دانلود کنید.

جداولی که محمود قرار است با آن‌ها کار کند به‌شرح زیر هستند:

  1. اطلاعات کاربران (users):
نام ستون نوع تعریف ملاحضات
id int(11) شناسه‌ی کاربر primary key auto_increment
name varchar(255) نام کاربر
phone varchar(255) شماره تماس کاربر
  1. اطلاعات سفیران (drivers):
نام ستون نوع تعریف ملاحضات
id int(11) شناسه‌ی کاربر primary key auto_increment
name varchar(255) نام کاربر
phone varchar(255) شماره تماس کاربر
  1. اطلاعات مرسولات (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 زمان تحویل مرسوله
  1. اطلاعات سفارشات (orders):
نام ستون نوع تعریف ملاحضات
delivery_id int(11) شناسه‌ی مرسوله‌ی مربوط به سفارش primary key & foreign key (deliveries:id)
price decimal(10,2) قیمت سفارش
  1. امتیاز کاربران به سفارشات (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 قرار داده و آن را ارسال کنید (فایل را زیپ نکنید).

-- 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
SQL