در حل این سوال بجز پیادهسازی صحیح، تمیزی، خوانایی و ساختار صحیح کد شما نیز در ارزیابی و دعوت شما به مصاحبه تاثیرگذار خواهد بود.
----------
شرلوک که وقتش پس از حل پروندههای اسکاتلند یارد آزاد شده، تصمیم میگیرد به اینترپل کمک کرده و پرونده دیگر سازمانهای جهان را قبول کرده و به آنها نیز کمک کند. او برای سادهتر کردن دریافت پروندهها تصمیم میگیرد به *API* این سازمانها متصل شده و پروندهها را از این راه دریافت کند. اما با توجه به اینکه قرار است به چندین سازمان مختلف متصل شود، در این راه با پیچیدگیهای مختلفی مواجه میشود. به او کمک کنید این پیچیدگیها را حل کرده و به این سازمانها کمک کند.
برنامه شما در ابتدا باید با دریافت یک فایل *YAML* با ساختار زیر که با نام `config.yaml` در پوشه روت سیستمعاملی که کد شما در آن اجرا میشود قرار گرفته (یعنی باید فایل را در آدرس `\config.yaml` بخوانید)، آدرس سازمانهایی که شرلوک میخواهد به آنها متصل شود را دریافت کند:
```yaml
organizations:
vice:
- Address_1: 65
- Address_2: 35
- ...
arson:
- Address_3: 30
- Address_4: 25
- Address_5: 45
- ...
```
# زیربرنامهی اول
در این زیر برنامه، برنامه شما باید با گوش کردن روی آدرس `0.0.0.0:80` با دریافت درخواستهای `GET` بر روی اندپوینت `/` درخواستها را به صورت مساوی و برابر بین سازمانهای مختلف پخش کرده (به آدرس مشخص شده در فایل *YAML* درخواست `GET` ارسال کند) و به شرلوک بازگردانی کند.
# زیربرنامهی دوم
شرلوک پس از استفاده از برنامه اول متوجه میشود که بررسی پروندهها بدون دسته بندی سخت و پیچیده است. به همین علت تصمیم میگیرد با اضافه کردن یک پارامتر کوئری به درخواستها، دستهبندی آنها را برای دریافت مشخص کند.
برنامه شما باید با گوش کردن روی پورت `0.0.0.0:80` با دریافت درخواستهای `GET` بر روی اندپوینت `/` بر اساس کوئری پارامتر `type` مشخص شده درخواستها را به صورت مساوی بین آدرسهای نوع پرونده پخش کنید.
برای مثال با دریافت درخواست `/?type=vice` باید درخواستها بین سازمانهای ۱ و ۲ به صورت مساوی پخش شود. و اگر تایپ درخواست در بین تایپهای موجود در فایل `config.yaml`نبود، یک پیام با کد `HTTP 400` و بدنه `The Specified Type is Not Correct` برگرداند.
در صورتی که درخواستی بدون تایپ به *API* ارسال شد، شما باید مانند مرحله قبل درخواستها را به صورت مساوی بین همه سازمانها پخش کنید.
# زیربرنامهی سوم
پس از بررسیهای بیشتر، شرلوک متوجه میشود که بعضی از سازمانها بیشتر از بقیه نیاز به کمک دارند. برای همین تصمیم میگیرد که توجه بیشتری را معطوف به این سازمانها کند. در این زیر برنامه باید زیر برنامه قبلی را طوری تغییر دهید که درخواستها را به جای پخش مساوی، به صورت وزندار و با وزنهای مشخص شده بین سازمانها پخش کند.
تضمین میشود که وزن سازمانها عددی صحیح و مجموع آنها در هر نوع برابر ۱۰۰ باشد.
برای مشخص کردن اینکه آیا نیاز است درخواستها به طور وزن دار یا بدون وزن تقسیم شوند، یک کوئری پارامتر دیگر با نام `weighted` اضافه میشود که مقدار آن برابر `true` است.
برای مثال با دریافت درخواست `/?type=homicide&weighted=true` باید درخواستها با وزن ۶۵ و ۳۵ بین سازمانهای ۱ و ۲ پخش شود. برای پخش درخواستها شما باید کوچکترین چرخهای که میتواند درخواستها را با این وزن پخش کند را انتخاب و از آن استفاده کنید. یعنی برای این مثال باید در هر ۲۰ درخواستی که به سمت برنامه ارسال میشود، ۱۳ درخواست به سازمان ۱ و ۷ درخواست به سازمان ۲ ارسال شود.
در این مرحله در صورتی که درخواستی بدون تایپ به *API* ارسال شد، شما باید مانند مرحله قبل درخواستها را به صورت مساوی بین همه سازمانها پخش کنید.
توجه کنید که در صورتی که کوئری پارامتر `weighted` وجود نداشت یا هر مقدار دیگری بجز `true` داشت، برنامه شما باید رفتار قبلی خود را داشته باشد.
# زیربرنامه چهارم
شرلوک که از تقسیم بار ورندار خوشش آمده، حالا دیگر نمیخواهد نوع درخواستها را مشخص کند. در این مرحله شما باید زیربرنامه سوم را طوری تغییر دهید که در صورتی که درخواستی بدون تایپ و با کوئری پارامتر `weighted` و مقدار `true` ارسال شد، درخواستها را در بین تمامی سازمانها بدون توجه به نوع آنها به صورت وزندار پخش کند. در این مرحله نیز شما باید کوچکترین چرخهای که میتواند درخواستها را با این وزن پخش کند را انتخاب و از آن استفاده کنید.
# نحوه ارسال
برای اجرای کد شما از داکر استفاده میشود. برای آشنایی با این ابزار از [این لینک](https://docs.docker.com/build/guide/intro/) کمک بگیرید.
شما باید با انتخاب یکی از [ایمیجهای استاندارد کوئرا](https://gitlab.com/qio/standard/container_registry/?orderBy=UPDATED&sort=desc) به عنوان Base Image خود، داکرفایلی بنویسید که پروژه شما را بیلد کند.
سیستم داوری کوئرا پس از بیلد کردن پروژه شما، فایل تنظیمات را در آن قرار داده و آن را اجرا کرده و تست میکند.
برای ارسال پروژه، شما باید پوشهای به شکل زیر ساخته و به صورت فایل `ZIP` به طوری که پوشه `solution` درون فایل قرار داشته باشد ارسال نمایید.
```
solution
├── Dockerfile
└── src
```
کد شما و هر چیز دیگری که برای اجرای کد به آن نیاز دارید، باید در پوشه `src` قرار بگیرد.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.