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

امیرمحمد به دلیل اوضاع فعلی،‌ در خانه مانده و حوصله‌اش سر رفته است. او می‌خواهد برای ایجاد سرگرمی و مفید بودن، سیستمی طراحی کند که مانند یک دیتابیس عمل می‌کند.

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

امیرمحمد می‌خواهد برای سیستمش، بخش مدیریت کاربر نیز بگذارد به این‌صورت که دو سطح دسترسی editor و viewer وجود داشته باشد. کاربر با سطح دسترسی editor می‌تواند تمام دستورات را انجام دهد ولی کاربر با دسترسی viewer تنها می‌تواند دستورات print و search را انجام دهد (در ادامه تعریف این دو دستور آمده است) و اگر درخواست انجام دستور دیگری به غیر از این ۲ نوع دستور را داشت، باید عبارت access denied را چاپ شود.

در ادامه دستورات موجود در این سیستم را می‌بینید:

دستور اضافه کردن کاربر

create user username editor
create user username viewer
Plain text

این دستور به این معناست که یک کاربر جدید با نام کاربری username و سطح دسترسی گفته شده، به سیستم اضافه شود. username یک رشته شامل حروف کوچک انگلیسی می‌باشد و تضمین می‌شود که هیچ دو کاربری،‌ نام کاربری یکسان ندارند. تضمین‌ می‌شود در هر کوئری کاربری که درخواست می‌دهد، حتما وجود داشته باشد.

دستور ایجاد و حذف کردن جدول

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

create table table_name username
delete table table_name username
Plain text

که به ترتیب بیانگر این می‌باشد که کاربر با نام کاربری username درخواست اضافه‌کردن و یا حذف یک جدول با نام table_name را داده است.

همچنین در ابتدا هر جدول که تعریف می‌شود، هیچ سطر و ستونی وجود ندارد و در ادامه می‌توان به آن، سطر و ستون اضافه کرد.

اضافه و حدف کردن ستون

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

add column table_name column_name int username
add column table_name column_name string username
Plain text

که بیانگر این می‌باشد کاربر با نام کاربری username به ترتیب، درخواستی برای ایجاد یک ستون با نام column_name در جدول table_name کرده و جنس آن ستون هم در کلمه پنجم مشخص می‌شود؛ هنگامی که یک ستون اضافه می‌شود، در صورتی از جنس عدد باشد، سطرهای این ستون با مقدار ۰ و در غیراینصورت با رشته null پر می‌شوند. (توجه کنید که منظور از رشته‌ی null، یک رشته‌ی به طول ۴ می‌باشد و نه رشته‌ی تهی!)

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

دستور بعدی، برای حذف کردن یک ستون از جدول می‌باشد:

remove column table_name column_name username
Plain text

که بیانگر این است کاربر با نام کاربری username درخواست حذف ستون با نام column_name در جدول با نام table_name را داده است.

اضافه و حذف کردن سطر

کاربر با نام کاربری username برای اضافه کردن یک سطر به آخر جدول با نام table_name از دستور زیر استفاده می‌کند (در هنگام استفاده از این کوئری تضمین می‌شود حداقل یک ستون در جدول وجود دارد):

add row table_name username
Plain text

توجه کنید که وقتی یک سطر اضافه می‌شود، در ستون‌هایی که از جنس عدد باشند، مقدار ۰ و در باقی ستون‌ها رشته null گذاشته می‌شود.(توجه کنید که منظور از رشته‌ی null، یک رشته‌ی به طول ۴ می‌باشد و نه رشته‌ی تهی!)

همچنین کاربر با نام کاربری username در جدول table_name برای حذف کردن یک ردیف که از بالا به پایین، iiامین سطر می‌باشد، از دستور زیر استفاده میکند:

remove row table_name i username
Plain text

تغییر دادن مقدار یک خانه

کاربر با نام کاربری username برای تغییر مقدار خانه واقع در سطر iiام و ستون با نام column_name در جدول table_name به مقدار value از دستور زیر استفاده می‌کند:

change table_name i column_name value username
Plain text

توجه کنید که اگر این ستون از جنس عدد باشد، value عدد است و در غیراینصورت یک رشته از حروف کوچک انگلیسی است.

چاپ کردن

این سیستم قابلیت این را دارد که بتوان چند ستون از یک جدول را مشخص کرد و جدول را بر اساس ستون‌های مشخص شده، به ترتیب اولویت مرتب کرد و در نهایت چاپ کرد.

برای این‌کار اگر کاربر با نام کاربری username بخواهد جدول با نام table_name را بر اساس ستون‌های با نام‌های col_1، col_2،...، col_k مرتب کند و سپس جدول را خروجی دهد، از دستور زیر استفاده می‌کند:

print table_name col_1 col_2 ... col_k username
Plain text

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

در نظر داشته باشید که ترتیب ردیف‌ها در جدول اصلی عوض نمی‌شود، و با این درخواست صرفا باید جدول مرتب شده بر اساس اولویت‌ها خروجی داده شود.

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

کاربر با نام کاربری username برای خروجی دادن کل جدول table_name از دستور زیر استفاده می‌کند: (توجه کنید که در این دستور، سطرهای جدول باید به ترتیب زمان اضافه شدن به جدول، چاپ شوند و نیازی به مرتب‌سازی نیست)

print table_name * username
Plain text

جست‌وجو در جدول

این سیستم، قابلیت جست‌وجو بر حسب یک پارامتر خاص نیز دارد. به این صورت که کاربر با نام کاربری username درخواست می‌دهد تا تمامی سطرهای جدول table_name، که مقدار آن‌ها در ستون با نام column_name دقیقا برابر با value است، چاپ شوند (توجه کنید که تمامی عناصر آن سطر باید چاپ شوند). برای اینکار از دستور زیر استفاده می‌کند: (در این دستور، سطرهای جدول باید به ترتیب زمان اضافه شدن به جدول، چاپ شوند)

search table_name column_name value username
Plain text

همچنین اگر این ستون از جنس عدد باشد،‌ value یک عدد است و اگر جنس این ستون رشته باشد، value یک رشته است.

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

در نهایت پس از پایان عملیا‌ت‌ها، در خط‌ آخر ورودی عبارت done می‌آید.

پیشنهاد می‌شود حتما به ورودی‌ نمونه و پاسخ‌ آن دقت کنید.

ورودی

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

همچنین در نهایت، در خط آخر ورودی، عبارت done می‌آید که برای تشخیص تمام شدن ورودی‌ها می‌باشد.

تضمین می‌شود مجموع کاراکتر‌های ورودی حداکثر 40 00040\ 000 می‌باشد.

همچنین تمامی رشته‌ها، شامل حروف کوچک انگلیسی می‌باشند و هیچکدام از اسم‌های جدول‌ها، ستون‌ها و... شامل فاصله (space) نمی‌باشد.

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

خانه‌هایی از جدول که از جنس عدد باشند، در بازه‌ی [109,109][-10^9, 10^9] می‌باشند و همچنین طول رشته‌ها کمتر مساوی ۵۰ می‌باشد.

خروجی

به ازای هر دستور مربوط به print و search، جدول را مطابق با دستور داده شده خروجی دهید.

توجه کنید که در خروجی، نام ستون‌ها را نباید چاپ کنید و همچنین هر سطر در یک خط چاپ شود و در هر خط بین مقادیر دو ستون متوالی باید دقیقا یک فاصله (space) باشد.

برای درک بهتر، به مثال‌های نمونه توجه کنید.

مثال

ورودی نمونه ۱

create user amin editor
create user sajad viewer
create table yek sajad
create table do amin
create table jadval amin
delete table do amin
add column jadval yek int amin
add column jadval do string amin
add column jadval se int amin
add row jadval amin
search jadval se 0 amin
add row jadval amin
print jadval * amin
add row jadval amin
change jadval 1 do salam amin
change jadval 2 yek -3 amin
print jadval yek do amin
remove row jadval 3 amin
remove column jadval do amin
change jadval 1 yek 3 amin
print jadval * amin
search jadval yek 3 amin
done
Plain text

خروجی نمونه ۱

access denied
0 null 0
0 null 0
0 null 0
-3 null 0
0 null 0
0 salam 0
3 0
-3 0
3 0
Plain text

در ابتدا هنگامی که کاربر sajad درخواست ساخت جدول می‌دهد، access denied چاپ می‌شود.

در دستورات print و ‍‍‍search که در ادامه آمده‌اند، به ترتیب خروجی‌های زیر چاپ می‌شوند:

0 null 0
Plain text
0 null 0
0 null 0
Plain text
-3 null 0
0 null 0
0 salam 0
Plain text
3 0
-3 0
Plain text
3 0
Plain text

ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.