+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
شرلوک که از کار زیاد خسته شده میخواهد یک روز در هفته را برای استراحت کنار بگذارد. او که همواره میخواهد به حل پروندههای بیشتری کمک کند، تصمیم میگیرد با بررسی نرخ جرم و جنایت در ماه گذشته، روزی در هفته که به طور میانگین کمترین میزان جرم و جنایت در آن اتفاق افتاده را برای استراحت انتخاب کند.
با دریافت تقویم ماه گذشته، روز هفته اول ماه و میزان جرمهای گزارش شده در هر روز، به شرلوک کمک کنید که یک روز را برای استراحت انتخاب کند.
# ورودی
در خط اول ورودی روزی که ماه با آن شروع شده از یکی از روزهای زیر داده میشود:
```
Saturday
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
```
سپس در ۳۰ خط بعدی میزان جنایات گزارش شده در هر روز داده میشود.
$$ 1 \le CrimeRate \le 100\ 000 $$
تضمین میشود که تعداد روزهای ماه **۳۰ روز** خواهد بود.
# خروجی
در خروجی، روزی در هفته که به طور میانگین، کمترین میزان جنایتهای گزارش شده را داشته به همراه مقدار جز صحیح این میانگین چاپ کنید.
# مثال
## ورودی نمونه
```
Tuesday
53
67
32
73
88
59
78
3
30
15
31
56
32
79
83
17
50
4
49
97
75
2
56
62
77
98
47
97
56
62
```
## خروجی نمونه
```
Tuesday 39
```
مقدار میانگین اصلی ۳۹.۴ است که جز صحیح آن یعنی ۳۹ در خروجی چاپ میشود.
بازرس لستراد که از تعداد پروندههای زیاد اسکاتلند یارد خسته شده برای حل برخی از آنها با شرلوک تماس میگیرد. شرلوک از بازرس لستراد میخواهد که پروندهها را در ساختار مشخصی برای او ارسال کند اما به دلیل بینظمیهای اسکاتلند یارد و نامشخص بودن ساختار پروندههای آنها، بازرس لستراد توانایی انجام این کار را ندارد.
با نوشتن یک اسکریپت شل به بازرس لستراد کمک کنید که با گرفتن فایل *CSV* پروندهها، آنها را در فولدرهای مختلف مرتب کرده و برای شرلوک ارسال کند.
در حال حاضر پروندههای اسکاتلند یارد در یک فایل *CSV* بزرگ با ساختار زیر قرار گرفتهاند:
```csv
<mark title="نام فرد مرتبط با پرونده">Name</mark>,<mark title="نوع پرونده">Type</mark>,<mark title="وضعیت پرونده">Status</mark>,<mark title="متن توضیحات پرونده">Description</mark>
Lisa Eaton,Vice,Solved,Tend close bar crime president particular table possible. Seek keep purpose. Drug cultural industry maintain.
Chelsea Johnson,Vice,Not Started,Manager she prove authority. Office physical describe student social. Peace age real contain always wind dream activity. Bring well ask team.
Kimberly Murray,Arson,Solved,Sign whether throw now company full. Perhaps television take may suggest particularly. Happy tax our role. Carry charge ball which expect your.
Billy Stewart,Arson,In Progress,Thank else stay budget media require book tell. Relationship face clear song will. Region whose kind them.
```
شرلوک از بازرس لستراد خواسته که تمامی پروندهها در پوشه `Cases` قرار بگیرند. به این صورت که در این پوشه برای هر نوع پرونده یک پوشه خاص ایجاد شده و سپس برای هر پرونده، یک فایل در پوشه نوع آن پرونده با نام فرد مرتبط با پرونده ایجاد شده و توضیحات پرونده در این فایل قرار بگیرند.
از آنجا که امنیت پروندههای اسکاتلند یارد نیز از اهمیت بالایی برخوردار است، باید دسترسی افراد به هر پرونده با توجه به وضعیت آن تغییر پیدا کند.
+ برای پروندههای با وضعیت `Solved` همه افراد باید توانایی خواندن پرونده را داشته باشند اما فقط صاحب پرونده امکان نوشتن بر روی آن را داشته باشد.
+ برای پروندههای با وضعیت `In Progress` صاحب پرونده و گروه آن باید توانایی خواندن پرونده را داشته باشند اما فقط صاحب پرونده امکان نوشتن بر روی آن را داشته باشد.
+ برای پروندههای با وضعیت `Not Started` فقط صاحب پرونده توانایی خواندن آن را داشته باشد.
دقت کنید که در هیچ حالتی، هیچکس **نباید** بتواند فایل پرونده را **اجرا** کند.
دقت داشته باشید که ممکن است در نام افراد کاراکتر اسپیس وجود داشته باشد. در اینصورت باید اسپیسهای موجود در نام را با کاراکتر `_` جایگزین کنید.
# مثال
```csv
<mark title="نام فرد مرتبط با پرونده">Name</mark>,<mark title="نوع پرونده">Type</mark>,<mark title="وضعیت پرونده">Status</mark>,<mark title="متن توضیحات پرونده">Description</mark>
Lisa Eaton,Vice,Solved,Tend close bar crime president particular table possible. Seek keep purpose. Drug cultural industry maintain.
Chelsea Johnson,Vice,Not Started,Manager she prove authority. Office physical describe student social. Peace age real contain always wind dream activity. Bring well ask team.
Kimberly Murray,Arson,Solved,Sign whether throw now company full. Perhaps television take may suggest particularly. Happy tax our role. Carry charge ball which expect your.
Billy Stewart,Arson,In Progress,Thank else stay budget media require book tell. Relationship face clear song will. Region whose kind them.
```
با دریافت و پردازش این فایل باید پوشهبندی پروندهها به شکل زیر ایجاد شود:
```
Cases
├── Arson
│ ├ (-rw-r-----) ── Billy_Stewart
│ ├ (-rw-r--r--) ── Kimberly_Murray
└── Vice
├ (-r--------) ── Chelsea_Johnson
├ (-rw-r--r--) ── Lisa_Eaton
```
محتوای هر فایل نیز باید با ستون `Description` مربوط به آن پرونده پر شده باشد. برای مثال محتوای درون فایل `Lisa_Eaton` باید متن زیر باشد:
```
Tend close bar crime president particular table possible. Seek keep purpose. Drug cultural industry maintain.
```
# پروژه اولیه
ساختار فایلی پروژه اولیه به شکل زیر است:
```
CaseSort
├── cases.csv
└── solution.sh
```
و شما باید راهحل خود را درون فایل `solution.sh` پیادهسازی کنید.
# نحوه ارسال
برای ارسال جواب، دستورات خواسته شده را در فایلی با نام `solution.sh` بنویسید و سپس آن را انتخاب و ارسال کنید.
در حل این سوال بجز پیادهسازی صحیح، تمیزی، خوانایی و ساختار صحیح کد شما نیز در ارزیابی و دعوت شما به مصاحبه تاثیرگذار خواهد بود.
----------
شرلوک که وقتش پس از حل پروندههای اسکاتلند یارد آزاد شده، تصمیم میگیرد به اینترپل کمک کرده و پرونده دیگر سازمانهای جهان را قبول کرده و به آنها نیز کمک کند. او برای سادهتر کردن دریافت پروندهها تصمیم میگیرد به *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` قرار بگیرد.
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
شرلوک که حالا به استفاده از *API*های مختلف برای اتصال به سازمانها عادت کرده، در هنگام اتصال به *API*های اسکاتلند یارد دچار مشکل میشود. او که فرصت کمی برای بررسی مشکل دارد، از واتسون میخواهد با بررسی لاگهای سرویسهای اسکاتلند یارد سرویسهای دچار مشکل را پیدا کرده و مشکل آنها را گزارش کند.
معماری داخلی سرویسهای اسکاتلند یارد میکروسرویس است، در این معماری سرویسهای متعددی وجود دارند که هر یک وظیفه مشخصی دارند و ممکن است برای پاسخ به درخواست کاربر، گروهی از آنها با یکدیگر ارتباط برقرار کرده تا پاسخ درخواست را آماده کنند.
در این معماری برای عیب یابی و دنبال کردن مسیر درخواست کاربرها در سرویسها، به هر درخواست یک آیدی منحصر به فرد اختصاص داده شده و با استفاده از این آیدی، اعمالی که هر سرویس در مسیر شروع تا پاسخگویی به درخواست انجام داده ثبت میشود.
اگر دقت کنیم، متوجه میشویم که میتوان هر یک از این اعمال (ارتباط با یک سرویس دیگر) را به شکل یک درخواست و پاسخ مستقل نگاه کرد. با توجه به این مسئله هر یک از این اعمال را به عنوان یک واحد مستقل به نام *Span* میشناسیم.
با این تعریف هر *Span* میتواند شامل *Span* های متفاوتی شود.
برای مثال اگر معماری زیر را داشته باشیم:
![معماری میکروسرویس مثال](https://quera.org/qbox/view/YSu6DagXbI/microservices.png)
مسیر یک درخواست میتواند به شکل زیر باشد (خطوط افقی همان *Span* ها هستند):
![درخواست نمونه](https://quera.org/qbox/view/qORkv0AVko/trace.png)
همچنین ممکن است که یک درخواست دچار مشکل شود. در اینصورت، *Span* آن و تمامی *Span* های والد آن نیز دچار مشکل میشوند. برای مثال میتوانید مسیر درخواستی که با خطا مواجه شده را در تصویر زیر مشاهده کنید:
![درخواست نمونه با خطا](https://quera.org/qbox/view/TRdAyyPyQl/error-trace.png)
اسکاتلند یارد، دادههای درخواستهای خود را به صورت فایلهای *JSON* در اختیار دارد اما ابزاری برای تحلیل آنها ندارد.
به واتسون کمک کنید ابزاری توسعه دهد که با استفاده از این اطلاعات مشکل را پیدا کرده و در صورتی که درخواست با خطا مواجه شده، اطلاعات آن خطا و سرویسی که باعث آن خطا بوده را پیدا کرده و چاپ کند و در غیر اینصورت، بگوید که مشکلی در درخواست وجود نداشته.
در قدم اول برای آشنایی شما با روند حل این مسئله، میتوانید با دریافت فایل لاگ نمونه و مشاهده ورودی و خروجی مورد انتظار، رابطه بین آنها را کشف کنید. سپس از شما انتظار میرود که برنامهای بنویسید که لاگها را از `stdin` دریافت و به صورت اتوماتیک با توجه به ورودی، خروجی مورد انتظار را پیدا کرده و چاپ کند.
# ورودی نمونه
[فایل درخواست سالم](https://quera.org/qbox/view/NphuIlzCSV/correct.json)
[فایل درخواست با خطا](https://quera.org/qbox/view/80z7LPrySC/error.json)
# خروجی نمونه
برای درخواست اول باید برنامه شما عبارت `Provided request has no errors` را چاپ و برای درخواست دوم اطلاعات زیر را به همین شکل چاپ کند:
```
Service: CIA
Address: 127.0.0.1:41251
Route: /getCriminalData
Message: Network error
```
واتسون که پس از حل مشکلات میکروسرویسهای اسکاتلندیارد به دوآپس علاقهمند شده، تصمیم میگیرد در کنار پزشکی شروع به یادگیری کوبرنیتیز کند. زمانی که بازرس لستراد متوجه این خبر میشود، با خوشحالی از واتسون میخواهد که با بررسی هلم چارت یکی از سرورهای اسکاتلند یارد که برای کار با شرلوک مستقر شده، مشکلات آن را رفع کند.
او به واتسون میگوید که این هلم چارت قبلا کار میکرده; اما زمانی که یکی از اعضای تیم فنی اسکاتلند یارد تلاش کرده مقدارهای متغیرهای محیطی درون فایل `values.yaml` را به دیپلویمنت سرور اضافه کند، آن را خراب کرده و چون این هلم چارت در گیت نبوده، حالا نمیتوانند آن را بازگردانی کنند.
واتسون که هنوز حتی کوبرنیتیز را نیز بلد نیست، نمیداند چطور مشکلات هلم را حل کند. به او کمک کنید که ابتدا مشکل چارت را حل کرده و سپس متغیرهای محیطی درون فایل `values.yaml` را به فایل `deployment.yaml` اضافه کند.
شما میتوانید پروژه اولیه را از [این لینک](/contest/assignments/68954/download_problem_initial_project/236325/) دانلود کرده و با استفاده از دستور `helm` مشکل آن را پیدا کرده و حل کنید. پس از حل مشکل نیز باید فایل `deployment.yaml` را طوری تغییر دهید که تمامی متغیرهای محیطی موجود در فایل `values.yaml` و کلید `env` را به صورت داینامیک در قسمت صحیح دیپلویمنت قرار دهید.
در نهایت و پس از حل مشکلات و اضافه کردن نیازمندیها، فایل `deployment.yaml` را بارگذاری نمایید.