در حل این سوال بجز پیادهسازی صحیح، تمیزی، خوانایی و ساختار صحیح کد شما نیز در ارزیابی و دعوت شما به مصاحبه تاثیرگذار خواهد بود.
شرلوک که وقتش پس از حل پروندههای اسکاتلند یارد آزاد شده، تصمیم میگیرد به اینترپل کمک کرده و پرونده دیگر سازمانهای جهان را قبول کرده و به آنها نیز کمک کند. او برای سادهتر کردن دریافت پروندهها تصمیم میگیرد به API این سازمانها متصل شده و پروندهها را از این راه دریافت کند. اما با توجه به اینکه قرار است به چندین سازمان مختلف متصل شود، در این راه با پیچیدگیهای مختلفی مواجه میشود. به او کمک کنید این پیچیدگیها را حل کرده و به این سازمانها کمک کند.
برنامه شما در ابتدا باید با دریافت یک فایل YAML با ساختار زیر که با نام config.yaml
در پوشه روت سیستمعاملی که کد شما در آن اجرا میشود قرار گرفته (یعنی باید فایل را در آدرس \config.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
ارسال شد، درخواستها را در بین تمامی سازمانها بدون توجه به نوع آنها به صورت وزندار پخش کند. در این مرحله نیز شما باید کوچکترین چرخهای که میتواند درخواستها را با این وزن پخش کند را انتخاب و از آن استفاده کنید.
نحوه ارسال
برای اجرای کد شما از داکر استفاده میشود. برای آشنایی با این ابزار از این لینک کمک بگیرید.
شما باید با انتخاب یکی از ایمیجهای استاندارد کوئرا به عنوان Base Image خود، داکرفایلی بنویسید که پروژه شما را بیلد کند.
سیستم داوری کوئرا پس از بیلد کردن پروژه شما، فایل تنظیمات را در آن قرار داده و آن را اجرا کرده و تست میکند.
برای ارسال پروژه، شما باید پوشهای به شکل زیر ساخته و به صورت فایل ZIP
به طوری که پوشه solution
درون فایل قرار داشته باشد ارسال نمایید.
solution
├── Dockerfile
└── src
کد شما و هر چیز دیگری که برای اجرای کد به آن نیاز دارید، باید در پوشه src
قرار بگیرد.
ارسال پاسخ برای این سؤال