سلام دوست عزیز😃👋

به مسابقه‌ی «Yellow Bloom یکتانت - Software Engineering» خوش آمدید.

لینک‌های مفید برای شرکت در مسابقه:

می‌توانید سوال‌ها و مشکلات خود را از بخش «سوال بپرسید» با ما در میان بگذارید.

توجه کنید که بر خلاف دیگر سوالات، سوال پروازهای روسیه دیتابیسی است و باید با PostgreSQL پیاده‌سازی شود.

موفق باشید 😉✌

سامانه پیشنهاد کار


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

توضیحات اولیه پروژه🔗

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

تعدادی موقعیت کار داریم و هر موقعیت کار دارای ویژگی‌های «نام موقعیت کار»، «بازه‌ی سنی مورد نیاز این کار»، «وضعیت ساعت‌کاری (تمام‌وقت / پاره‌وقت / پروژه‌ای)»، «حقوق پیشنهادی» و «مهارت‌های مورد نیاز برای این موقعیت کاری» هم‌چنین هر کارجو ویژگی‌های «نام کارجو»، «سن کارجو»، «وضعیت ساعت‌کاری (تمام‌وقت / پاره‌وقت / پروژه‌ای)»، «حقوق مورد انتظار کارجو» و «مهارت‌های این کارجو» را دارد.

دستورها🔗

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

فاز اول🔗

اضافه کردن موقعیت کار (ADD-JOB)
ADD-JOB <NAME> <MINAGE> <MAXAGE> <FULLTIME|PARTTIME|PROJECT> <SALARY>
Plain text

در این کوئری از شما خواسته می‌شود یک موقعیت کاری را به سامانه اضافه کنید. اطلاعاتی که در این کوئری داده می‌شود شامل نام موقعیت شغلی (<NAME>)، محدودیت بازه‌ی سنی کارجو (<MINAGE> و <MAXAGE>)، شرایط زمانی کار (یکی از سه حالت <FULLTIME|PARTTIME|PROJECT>) و میزان حقوق ماهانه (<SALARY>) است.

  • رشته‌ی <NAME> باید فقط شامل حروف کوچک و بزرگ انگلیسی با طولی بین ۱ تا ۱۰ کاراکتر باشد، در غیر این صورت خطای invalid name را چاپ کنید.
  • دو مقدار <MINAGE> و <MAXAGE> باید بین ۰ تا ۲۰۰ (شامل ابتدا و انتها) باشند. هم‌چنین باید <MINAGE> از <MAXAGE> کم‌تر یا مساوی باشد، در غیر این صورت خطای invalid age interval را چاپ کنید. دقت کنید لزومی ندارد این مقادیر صحیح باشند.
  • شرایط زمانی باید دقیقاً یکی از سه کلمه‌ی FULLTIME ،PARTTIME یا PROJECT باشد (به بزرگی حروف دقت کنید) و در غیر این صورت خطای invalid timetype را چاپ کنید.
  • مقدار حقوق باید نامنفی و کم‌تر از ۱،۰۰۰،۰۰۰،۰۰۰ بوده و سه رقم سمت راست آن باید ۰ باشد، در غیر این صورت پیام invalid salary را چاپ کنید.
  • اگر هیچ‌کدام از خطاهای بالا پیش نیامد، پیام job id is <idx> را چاپ کنید و به‌جای <idx> شماره‌ی موقعیت کار را قرار دهید. برای شماره‌گذاری باید از ۱ شروع کرده و یکی یکی زیاد کنید. فقط به موقعیت‌های کاری‌ که به این مرحله می‌رسند و با موفقیت ثبت می‌شوند، شماره نسبت دهید.
اضافه کردن کارجو (ADD-USER)
ADD-USER <NAME> <AGE> <FULLTIME|PARTTIME|PROJECT> <SALARY>
Plain text

در این کوئری شما باید یک کارجو را به سامانه بیفزایید. اطلاعات کارجو شامل نام (<NAME>)، سن (<AGE>)، شرایط زمانی کارجو برای کار (یکی از سه حالت <FULLTIME|PARTTIME|PROJECT>) و حقوق درخواستی ماهانه‌ (<SALARY>) به شما داده می‌شود.

  • رشته‌ی <NAME> باید فقط شامل حروف کوچک و بزرگ انگلیسی با طولی بین ۱ تا ۱۰ کاراکتر باشد. در غیر این صورت خطای invalid name را چاپ کنید.
  • مقدار <AGE> باید بین ۰ تا ۲۰۰ (شامل ابتدا و انتها) باشد، در غیر این صورت خطای invalid age را چاپ کنید. دقت کنید لزومی ندارد این مقدار صحیح باشد.
  • شرایط زمانی باید دقیقاً یکی از سه کلمه‌ی FULLTIME، PARTTIME یا PROJECT باشد (به بزرگی حروف دقت کنید) و در غیر این صورت خطای invalid timetype را چاپ کنید.
  • مقدار حقوق باید نامنفی و کم‌تر از ۱،۰۰۰،۰۰۰،۰۰۰ بوده و سه رقم سمت راست آن باید ۰ باشد، در غیر این صورت پیام invalid salary را چاپ کنید.
  • اگر هیچ کدام از خطاهای بالا پیش نیامد، پیام user id is <idx> را چاپ کنید و به‌جای <idx> شماره‌ی کارجو را قرار دهید. برای شماره‌گذاری باید از ۱ شروع کرده و یکی یکی زیاد کنید. فقط به کارجوهایی که به این مرحله می‌رسند و با موفقیت ثبت می‌شوند، شماره نسبت دهید.
اضافه کردن مهارت به موقعیت کاری (ADD-JOB-SKILL)
ADD-JOB-SKILL <JOB-ID> <SKILL>
Plain text

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

  • اگر موقعیت کاری با شماره‌ی <JOB-ID> وجود ندارد، خطای invalid index را چاپ کنید. تضمین می‌شود ID داده‌شده، عددی صحیح باشد.
  • اگر مهارتی با نام <SKILL> در لیست اولیه وجود ندارد، خطای invalid skill را چاپ کنید.
  • اگر این مهارت قبلاً به این موقعیت کاری اضافه شده، پیام repeated skill را چاپ کنید.
  • اگر هیچ‌کدام از خطاهای بالا رخ نداد، پیام skill added را چاپ کنید.
اضافه کردن مهارت به کارجو (ADD-USER-SKILL)
ADD-USER-SKILL <USER-ID> <SKILL>
Plain text

در این کوئری از شما خواسته می‌شود تا یک مهارت را به مهارت‌های کارجویی که از پیش ثبت‌نام کرده، اضافه نمایید. به موارد زیر توجه کنید:

  • اگر کارجویی با شماره‌ی <USER-ID> وجود ندارد، خطای invalid index را چاپ کنید. تضمین می‌شود ID داده‌شده، عددی صحیح باشد.
  • اگر مهارتی با نام <SKILL> در لیست اولیه وجود ندارد، خطای invalid skill را چاپ کنید.
  • اگر این مهارت قبلاً به این کاربر اضافه شده، پیام repeated skill را چاپ کنید.
  • اگر هیچ‌کدام از خطاهای بالا رخ نداد، پیام skill added را چاپ کنید.

فاز دوم🔗

گزارش مشاهده (VIEW)
VIEW <USER-ID> <JOB-ID>
Plain text

این دستور یعنی کارجو یک موقعیت کاری را مشاهده کرده است.

  • اگر کارجویی با شماره‌ی <USER-ID> یا موقعیت کاری با شماره‌ی <JOB-ID> وجود نداشت، خطای invalid index را چاپ کنید. تضمین می‌شود IDهای داده‌شده، اعدادی صحیح باشد.
  • در صورتی که خطایی پیش نیامد، پیام tracked را چاپ کنید.
وضعیت موقعیت کار (JOB-STATUS)
JOB-STATUS <JOB-ID>
Plain text
  • اگر موقعیت کاری با شماره‌ی <JOB-ID> وجود ندارد، خطای invalid index را چاپ کنید. تضمین می‌شود ID داده‌شده، عددی صحیح باشد.
  • در غیر این صورت نام موقعیت کاری، سپس با یک -، مجموع تعداد viewهایی که این موقعیت کاری داشته و سپس یک - و برای همه‌ی مهارت‌هایی که در این موقعیت کاری هست در یک (,) ابتدا نام مهارت و سپس تعداد viewهایی کارجوها با این مهارت داشتند را به صورت صعودی بر اساس این تعداد چاپ کنید.
وضعیت کارجو (USER-STATUS)
USER-STATUS <USER-ID>
Plain text

در این دستور، باید مهارت‌ها را به ترتیب نشان دهید. دقت کنید ترتیب مهارت‌ها، بر اساس مشاهدات کارجو تغییر می‌کند.

  • اگر کارجویی با شماره‌ی <USER-ID> وجود ندارد، خطای invalid index را چاپ کنید. تضمین می‌شود ID داده‌شده، عددی صحیح باشد.
  • در غیر این صورت نام کارجو، سپس با یک - و برای همه‌ی مهارت‌هایی که در این کارجو هست در یک (,) ابتدا نام مهارت و سپس تعداد viewهایی برای موقعیت‌های کاری با این مهارت داشتند را به صورت صعودی بر اساس این تعداد چاپ کنید.

فاز سوم🔗

دریافت لیست کارها (GET-JOBLIST)
GET-JOBLIST <USER-ID>
Plain text

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

متناسب‌ بودن کارجو با موقعیت کار🔗

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

امتیاز سن

اگر سن کارجو xx و بازه‌ی سنی مورد نیاز موقعیت کار [l,r][l, r] باشد، امتیاز برابر است با:

{min{rx,xl}lxrxlx<lrxx>r \begin{cases} \min\{r - x, x - l\} & l \leq x \leq r \\ x - l & x \lt l \\ r - x & x \gt r \\ \end{cases}

امتیاز مهارت‌ها

اگر مجموعه‌ی مهارت‌های کارجو AA و مجموعه‌ی مهارت‌های مورد نیاز موقعیت کار BB باشد، امتیاز برابر است با: 3×ABBA3 \times |A \cap B| - |B - A|

امتیاز وضعیت زمان

از روی این جدول امتیاز را تشخیص دهید:

. FULLTIME PARTTIME PROJECT
FULLTIME ۱۰ ۵ ۴
PARTTIME ۵ ۱۰ ۵
PROJECT ۴ ۵ ۱۰
امتیاز حقوق

اگر حقوق مورد انتظار کارجو xx و حقوق پیشنهادی موقعیت کار yy باشد، امتیاز این قسمت برابر است با:

1000max{xy,1}\lfloor\frac{1000}{\max\{|x - y|, 1\}}\rfloor

اگر مجموع امتیازها چهار عدد قبل برابر ss شود، امتیاز هر کاربر s×1000s \times 1000 به‌علاوه‌ی شماره‌ی موقعیت کاری است.

نکات🔗

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

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

زیرمسئله نمره محدودیت
۱ ‌ ۱۰۰ فاز اول
۲ ۱۰۰ فاز دوم
۲ ۱۰۰ فاز سوم

ورودی🔗

در سطر اول ورودی، عدد صحیح و مثبت ss آمده است که تعداد مهارت‌ها را نشان می‌دهد. 1s1001 \leq s \leq 100

در سطر دوم ورودی، یک لیست شامل ss رشته متمایز که با یک فاصله از هم جدا شده‌اند آمده است که لیست مهارت‌ها را نشان می‌دهد. در سطر سوم ورودی، عدد صحیح و مثبت qq آمده که تعداد درخواست‌هایی را که باید پوشش دهید، نشان می‌دهد.

1q10001 \leq q \leq 1000

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

خروجی🔗

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

مثال‌ها🔗

تست نمونه فاز ۱

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

3
codeing hacking talking
14
ADD-USER Amin 72 PARTTIME 52000000
ADD-USER Hamed 30 FULLTIME 52000001
ADD-JOB Quera 10 110 FULLTIME 1000000
ADD-JOB YEK.NET 10 110 PROJECT 30000000
ADD-JOB YEKtaNET 10 110 PARTTIME 1000000
ADD-USER Amin 25 ESHGHI 15000000
ADD-USER Amin 25 PROJECT 15000000
ADD-JOB-SKILL 3 working
ADD-JOB-SKILL 3 talking
ADD-JOB-SKILL 2 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 sleeping
Plain text

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

user id is 1
invalid salary
job id is 1
invalid name
job id is 2
invalid timetype
user id is 2
invalid index
invalid index
skill added
skill added
skill added
repeated skill
invalid skill
Plain text
  • کارجویی به نام «Amin» با شماره‌ی ۱ اضافه می‌شود.
  • «Hamed» نمی‌تواند اضافه شود چون باید سه رقم سمت راست حقوقش ۰ باشد.
  • موقعیت کاری به نام «Quera» با شماره‌ی ۱ اضافه می‌شود.
  • «YEK.NET» حاوی کاراکتر . است که برای نام قابل قبول نیست.
  • موقعیت کاری به نام «YEKtaNET» با شماره‌ی ۲ اضافه می‌شود.
  • شرایط زمانی به نام «ESHGHI» وجود ندارد.
  • کارجوی دیگری با نام «Amin» با شماره‌ی ۲ اضافه می‌شود. (نام تکراری مشکلی نیست.)
  • موقعیت کاری با شماره‌ی ۳ وجود ندارد. (حتی اگر مهارت درست نبود باید به شماره خطا بدهیم.)
  • موقعیت کاری با شماره‌ی ۳ وجود ندارد.
  • مهارت «talking» به شرکت شماره‌ی ۲ یعنی «YEKtaNET» اضافه شد.
  • مهارت «codeing» به کارجوی شماره‌ی ۲ اضافه شد.
  • مهارت «talking» به کارجوی شماره‌ی ۱ اضافه شد.
  • مهارت تکراری نباید اضافه شود.
  • مهارت داده شده باید در لیست اولیه مهارت‌ها باشد.
تست نمونه فاز ۲

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

3
codeing hacking talking
27
ADD-USER Amin 72 PARTTIME 52000000
ADD-USER Hamed 30 FULLTIME 34000000
ADD-JOB Quera 10 110 FULLTIME 1000000
ADD-JOB YEKtaNET 10 110 PARTTIME 1000000
ADD-USER Amin 25 PROJECT 15000000
ADD-JOB-SKILL 2 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 talking
JOB-STATUS 1
JOB-STATUS 2
JOB-STATUS 3
USER-STATUS 1
USER-STATUS 2
USER-STATUS 3
VIEW 1 1
VIEW 1 2
VIEW 1 1
VIEW 3 1
VIEW 2 1
VIEW 2 4
VIEW 2 0
JOB-STATUS 1
JOB-STATUS 2
JOB-STATUS 3
USER-STATUS 1
USER-STATUS 2
USER-STATUS 3
Plain text

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

user id is 1
user id is 2
job id is 1
job id is 2
user id is 3
skill added
skill added
skill added
Quera-0-
YEKtaNET-0-(talking,0)
invalid index
Amin-(talking,0)
Hamed-(codeing,0)
Amin-
tracked
tracked
tracked
tracked
tracked
invalid index
invalid index
Quera-4-
YEKtaNET-1-(talking,1)
invalid index
Amin-(talking,1)
Hamed-(codeing,0)
Amin-
Plain text
  • کارجویی به نام «Amin» با شماره‌ی ۱ اضافه می‌شود.
  • کارجویی به نام «Hamed» با شماره‌ی ۲ اضافه می‌شود.
  • موقعیت کاری به نام «Quera» با شماره‌ی ۱ اضافه می‌شود.
  • موقعیت کاری به نام «YEKtaNET» با شماره‌ی ۲ اضافه می‌شود.
  • کارجویی به نام «Amin» با شماره‌ی ۳ اضافه می‌شود.
  • مهارت «talking» به موقعیت کاری شماره‌ی ۲ اضافه می‌شود.
  • مهارت «codeing» به کارجوی شماره‌ی ۲ اضافه می‌شود.
  • مهارت «talking» به کارجوی شماره‌ی ۱ اضافه می‌شود.
  • چون «Quera» هیچ مشاهده‌ای ندارد، پس ۰ چاپ می‌شود و چون هیچ مهارتی ندارد خالی است.
  • چون «YEKtaNET» هیچ مشاهده‌ای ندارد، پس ۰ چاپ می‌شود و چون هیچ کارجویی با مهارت «talking» این موقعیت کاری را ندیده، جلوی آن صفر چاپ می‌شود.
  • موقعیت کاری با شماره‌ی ۳ وجود ندارد.
  • مهارت‌های »Amin» در هیچ موقعیت کاری دیده نشده پس جلوی آن صفر نوشته می‌شود.
  • مهارت‌های »Hamed» در هیچ موقعیت کاری دیده نشده پس جلوی آن صفر نوشته می‌شود.
  • کارجوی «Amin» مهارتی ندارد.
  • مشاهده ثبت می‌شود.
  • مشاهده ثبت می‌شود.
  • مشاهده ثبت می‌شود.
  • مشاهده ثبت می‌شود.
  • مشاهده ثبت می‌شود.
  • موقعیت کاری با شماره‌ی ۴ وجود ندارد.
  • موقعیت کاری با شماره‌ی ۰ وجود ندارد.
  • موقعیت کاری «Quera» مجموعاً ۴ بار دیده شده است.
  • موقعیت کاری «YEKtaNET» یکبار دیده شده و یک نفر مهارت «talking» را داشته است.
  • موقعیت کاری با شماره‌ی ۳ وجود ندارد.
  • مهارت‌های »Amin» و یک موقعیت کاری با مهارت آن دیده شده است.
  • مهارت‌های »Hamed» در هیچ موقعیت کاری دیده نشده پس جلوی آن صفر نوشته می‌شود.
  • کارجوی «Amin» مهارتی ندارد.
تست نمونه فاز ۳

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

3
codeing hacking talking
20
ADD-USER Amin 72 PARTTIME 52000000
ADD-USER Hamed 30 FULLTIME 34000000
ADD-JOB Quera 10 110 FULLTIME 1000000
ADD-JOB YEKtaNET 10 110 PARTTIME 1000000
ADD-USER Amin 25 PROJECT 15000000
ADD-JOB-SKILL 2 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 talking
VIEW 1 1
VIEW 1 2
VIEW 1 1
VIEW 2 1
VIEW 3 1
VIEW 2 2
VIEW 1 1
VIEW 2 1
GET-JOBLIST 0
GET-JOBLIST 1
GET-JOBLIST 2
GET-JOBLIST 3
Plain text

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

user id is 1
user id is 2
job id is 1
job id is 2
user id is 3
skill added
skill added
skill added
tracked
tracked
tracked
tracked
tracked
tracked
tracked
tracked
invalid index
(2,51002)(1,43001)
(1,30001)(2,24002)
(2,19002)(1,19001)
Plain text
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.