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

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

بالاترین سطح دسترسی به ترتیب متعلق به «مدیر»، «مربی» و «عضو» است.

هر حساب کاربری بعد از ثبت نام در حالت «غیرفعال» است. زمانی یک حساب فعال می‌شود که یک «مدیر» آن را فعال کند. همچنین مدیران و مربی‌ها نیاز دارند تا لیست کاربرهایی که «غیر فعال» هستند را داشته باشند.

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

عضویت در سامانه

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

REGISTER <USERNAME> <ROLE>
Plain text

یعنی کاربری با نام <USERNAME> درخواست عضویت با نقش <ROLE> را دارد.

  • اگر کاربری با این نام کاربری فعال یا غیرفعالی (با هر نقشی) قبلاً ثبت نام کرده است پیام INVALID USERNAME را چاپ کنید.
  • اگر <ROLE>، هیچکدام از مقدارهای ADMIN، MENTOR یا MEMBER نبود، پیام INVALID ROLE را چاپ کنید.
  • در صورتی که هیچ کدام از اتفاقات بالا نیفتاد، WAITING FOR ACCEPT را چاپ کنید.

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

تایید کردن عضویت

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

APPROVE <USERNAME1> <USERNAME2>
Plain text

یعنی کاربر <USERNAME1> می‌خواهد کاربر <USERNAME2> را به حالت فعال تبدیل کند.

  • اگر کاربری با نام <USERNAME1> وجود ندارد، پیام INVALID USERNAME را چاپ کنید.
  • اگر کاربر <USERNAME1> فعال نیست، پیام ‍WAITING FOR ADMIN را چاپ کنید.
  • اگر کاربر <USERNAME1> نقش ADMIN ندارد پیام <USERNAME1> IS NOT ADMIN را چاپ کنید.
  • اگر کاربری با نام <USERNAME2> وجود ندارد، پیام INVALID USERNAME را اعلام کنید.
  • اگر کاربر <USERNAME2> اکنون فعال است، پیام <USERNAME2> IS ACTIVE را چاپ کنید.
  • در صورتی که هیچ کدام از حالت‌های بالا پیش نیامد کاربر <USERNAME2> را فعال کنید و پیام <USERNAME2> ACTIVATED را چاپ کنید.

رد کردن عضویت

REJECT <USERNAME1> <USERNAME2>
Plain text

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

  • اگر کاربری با نام <USERNAME1> وجود ندارد، پیام INVALID USERNAME را چاپ کنید.
  • اگر کاربر <USERNAME1> فعال نیست، پیام ‍ ‍WAITING FOR ADMIN را چاپ کنید.
  • اگر کاربر <USERNAME1> نقش ADMIN ندارد، پیام USERNAME1> IS NOT ADMIN> را چاپ کنید.
  • اگر کاربری با نام <USERNAME2> وجود ندارد، پیام INVALID USERNAME را اعلام کنید.
  • اگر کاربر <USERNAME2> اکنون فعال است، پیام USERNAME1> IS ACTIVE> را چاپ کنید.
  • در صورتی که هیچ کدام از حالت‌های بالا پیش نیامد کاربر <USERNAME2> را از لیست انتظار حذف کنید و پیام <USERNAME2> REJECTED را چاپ کنید.

صف انتظار تایید

QUEUE <USERNAME>
Plain text
  • اگر کاربری با نام USERNAME وجود نداشت، پیام INVALID USERNAME را چاپ کنید.
  • اگر کاربر غیرفعال بود، پیام ‍WAITING FOR ADMIN را چاپ کنید.
  • اگر این کاربر نقش MEMBER داشت، پیام NOT ENOUGH ACCESS را چاپ کنید.
  • در صورتی که هیچ کدام از اتفاقات بالا رخ نداد، نام کاربری افرادی که درخواست عضویت دادند و هنوز «غیرفعال» هستند را به ترتیب لغت‌نامه‌ای (در مقایسه‌ی رشته‌ها ارزش حروف کوچک و بزرگ را یکسان در نظر بگیرید.) چاپ کنید. اگر هیچ کاربری این وضعیت را نداشت پیام NO USER را چاپ کنید.

تغییر نقش

CHANGEROLE <USERNAME1> <USERNAME2> <ROLE>
Plain text
  • اگر کاربری با نام <USERNAME1> یا <USERNAME2> وجود ندارد، پیام INVALID USERNAME را چاپ کنید.
  • اگر کاربری با نام <USERNAME1> یا <USERNAME2> غیرفعال است، پیام ‍WAITING FOR ADMIN را چاپ کنید.
  • اگر <ROLE> هیچ کدام از سه نقش گفته شده نبود، پیام INVALID ROLE را چاپ کنید.
  • اگر نقش <USERNAME1> پایین‌تر از <USERNAME2> است یا هردو نقش یکسانی دارند، NOT ENOUGH ACCESS را چاپ کنید.
  • اگر نقشی که <USERNAME1> می‌خواهد نقش <USERNAME2> را به آن تغییر بدهد، بالاتر از نقش خود اوست (مثلاً خود MENTOR است و می‌خواهد <USERNAME2> را به ADMIN تغییر دهد)، INVALID CHANGEROLE را چاپ کنید. (تغییر نقش زمانی مجاز است که <USERNAME2> به نقشی پایین‌تر یا هم تراز <USERNAME1> تغییر پیدا کند).
  • اگر نقش کاربر با این دسترسی تغییری نمی‌کند، پیام ALREADY HAS THIS ROLE چاپ کنید.
  • در صورتی که هیچ کدام از تغییرات بالا اتفاق نمی‌افتد، نقش USERNAME2 را به ROLE تغییر دهید و پیام ROLE CHANGED SUCCESSFULLY را چاپ کنید.

وضعیت کاربر

STATUS <USERNAME>
Plain text

نام کاربری، نقش و فعال بودن آن را با این الگو چاپ کنید:

اگر کاربری با نام <USERNAME> وجود ندارد، پیام INVALID USERNAME را چاپ کنید.

اگر کاربر فعال است:

username: <USERNAME> role: <ROLE> active

در غیر این صورت:

username: <USERNAME> role: <ROLE> not active

نکات

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

ورودی

در سطر اول ورودی، عدد صحیح و مثبت nn داده می‌شود که تعداد دستورها را نشان می‌دهد.

1n10,0001 \leq n \leq 10 , 000

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

خروجی

برای هر دستور، خروجی مورد نظر را چاپ کنید. تضمین می‌شود ورودی‌ها طوری داده شود که مجموع کاراکتر خروجی‌ها از 10610^6 بیشتر نشود.

مثال

ورودی نمونه ۱

21
REGISTER Amin ADMIN
REGISTER Mitra MENBER
REGISTER Mitra MEMBER
REGISTER Amin MEMBER
QUEUE ADMIN
APPROVE Amin Mitra
APPROVE ADMIN Mitra
APPROVE Mitra Amin
REGISTER Amir MEMBER
REJECT Amir Amin
APPROVE ADMIN Amin
APPROVE Mitra Amir
CHANGEROLE Amin Mitra MENTOR
STATUS Mitra
APPROVE Amin Amir
QUEUE Amir
REGISTER Mina MENTOR
CHANGEROLE Mitra Amir MENTOR
QUEUE Mitra
CHANGEROLE Mitra Amir MEMBER
STATUS Mina
Plain text

خروجی نمونه ۱

WAITING FOR ACCEPT
INVALID ROLE
WAITING FOR ACCEPT
INVALID USERNAME
Amin Mitra
WAITING FOR ADMIN
Mitra ACTIVATED
Mitra IS NOT ADMIN
WAITING FOR ACCEPT
WAITING FOR ADMIN
Amin ACTIVATED
Mitra IS NOT ADMIN
ROLE CHANGED SUCCESSFULLY
username: Mitra role: MENTOR active
Amir ACTIVATED
NOT ENOUGH ACCESS
WAITING FOR ACCEPT
ROLE CHANGED SUCCESSFULLY
Mina
NOT ENOUGH ACCESS
username: Mina role: MENTOR not active
Plain text

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